Unity中的旋轉——以行星環繞為例
- 實作效果
- 一、與之相關的兩種旋轉方式
- 1.Rotate
- 2.transform.RotateAround
- 二、行星案例的實作
- Step1:我們先在場景中創建一個球體,并將它放大作為被環繞的恒星(我這里自己上了貼圖)
- Step2:制作環繞它的行星;我們創建一個比恒星小一些的球體,將它水平拖拽到離恒星有一定距離的位置
- Step3:再創建一個比行星小的球體,并將其移動到行星的周圍
- Step4:衛星的環繞與摧毀
- Step5:腳本的完善(完整的行星腳本)
- Step6:衛星的代碼(完整)
- 三、添加多個行星
- step1.CtrlD賦值一個行星,將其名稱修改為與第一個行星名稱相同
- step2:運行效果
實作效果

一、與之相關的兩種旋轉方式
1.Rotate
Unity中文檔案對于transform.Rotate說明鏈接:點擊進入,用法有很多種,想查看全部用法可以進入鏈接,
描述:使用 Transform.Rotate 以各種方式旋轉 GameObjects,通常以歐拉角而不是四元數提供旋轉,
自轉用法:
//public來定義可以在外部修改,Unity會以外部編輯器的引數作為游戲運行時的引數
public float rotate_speed = 30f;//設定旋轉速度
void Update()
{
transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime); //物體自轉
//Vector3=Vector(0,1,0)是一個向上的向量,代表Y軸
//Time.deltaTime每幀呼叫一次
}
我們可以利用這個代碼來實作物體的自轉,通過
2.transform.RotateAround
Unity中文檔案相關說明:

不難理解,RotateAround是專門為物體圍繞物體旋轉而生的函式,內置引數分別為旋轉目標的坐標、旋轉的軸向、旋轉的速度,
二、行星案例的實作
Step1:我們先在場景中創建一個球體,并將它放大作為被環繞的恒星(我這里自己上了貼圖)

為其添加腳本,并將腳本拖拽至創建的球體上:
//public來定義可以在外部修改,Unity會以外部編輯器的引數作為游戲運行時的引數
public float rotate_speed = 30f;//設定旋轉速度
void Update()
{
transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime); //物體自轉
//Vector3=Vector(0,1,0)是一個向上的向量,代表Y軸
//Time.deltaTime每幀呼叫一次
}
運行游戲可以發現自轉效果已經完成:

Step2:制作環繞它的行星;我們創建一個比恒星小一些的球體,將它水平拖拽到離恒星有一定距離的位置

為其添加腳本,并將腳本拖拽至創建的球體上:
public float rotate_speed = 60f; //自轉速度
public float around_speed = 60f; //公轉環繞速度
public Transform around_aim; //設定公轉目標
void Start()
{
}
void Update()
{
//行星自轉
transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime);
//行星公轉
transform.RotateAround(around_aim.position, Vector3.up ,around_speed * Time.deltaTime);
}
代碼撰寫完成后將公轉目標拖拽至腳本中:(我這里是最終腳本)

點擊運行游戲我們可以發現恒星自轉,衛星自轉加公轉,并且我們可以修改腳本引數來修改旋轉的速度:

Step3:再創建一個比行星小的球體,并將其移動到行星的周圍

在Assets下創建一個檔案,并將其命名為:Resources,一定要命名為Resources,大小寫都不能錯,因為我們等會要從Resources中加載預制體;再在Resources下創建一個檔案夾命名為Prefab,大小寫也不能錯,將創建出來的衛星拖拽至檔案夾中,這時我們發現上面的面板中衛星邊藍了,這就說明預制體制作成功,再把場景中預制體刪掉,這并不影響我們對于刪掉預制體的使用,我們可以在Prefab檔案夾下再將其拖拽出來,

Step4:衛星的環繞與摧毀
思路:在行星的周圍生成一個衛星并使其成為行星的子物體隨著行星一起移動,在生成衛星的一段時間后將其摧毀,再過一段時間再生成
step1:衛星的生成:(這里的pfb、prefabInstance是GameObject型別的全域變數,如果是區域變數不方便后面的摧毀),關鍵代碼如下
pfb = Resources.Load("Prefab/satellite") as GameObject;
//加載在Resource檔案夾下Prefab檔案夾下的statellite預制體 這里要求預制體的名稱和代碼中的命名一樣 最好英文
//這也是為什么要固定命名的原因
prefabInstance = Instantiate(pfb,this.transform.position + vec ,Quaternion.identity);
//生成一個預制體,預制體為pfb,生成的位置是這個腳本掛載的物體的位置(行星位置)+向X軸偏離的位置,默認角度(無偏轉)
prefabInstance.transform.parent = this.transform;
//將衛星設定為行星的子物體
step2:衛星環繞行星旋轉,關鍵代碼如下
prefabInstance.transform.RotateAround(this.transform.position, Vector3.up, around_speed * Time.deltaTime);
step3:衛星旋轉后銷毀
Destroy(prefabInstance);
Step5:腳本的完善(完整的行星腳本)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Planetaryrotation : MonoBehaviour
{
public float around_speed = 60f;//控制環繞速度
public float rotate_speed = 60f;//控制自轉速度
public Transform around_aim; //設定行星環繞目標
public float time_1 = 3;//衛星出現間隔
public float time_2 = 3;//衛星存留時間
public float appear_time = 0; //計時引數
bool isappear = true;//判斷衛星是否消失
private GameObject pfb;//需要加載的預制體
private GameObject prefabInstance;//生成預制體的實體化
public float distance = 10;//控制行星與衛星的間距
Vector3 vec = new Vector3(15, 0, 0);//設定一個三維變數用來做行星與衛星間距離的引數
Transform tra;//設定一個轉換變數型別的載體,position不能和vect相加
int num = 0;//控制衛星數量的引數
//start函式只執行一次(游戲開始時)
void Start()
{
Vector3 vec = new Vector3(distance, 0, 0);//distance控制距離
tra.position = vec;
}
//每幀執行一次
void Update()
{
Vector3 vec = new Vector3(distance, 0, 0);
//行星自轉
transform.Rotate(Vector3.down * rotate_speed * Time.deltaTime);
//行星公轉
transform.RotateAround(around_aim.position, Vector3.up ,around_speed * Time.deltaTime);
//控制衛星出現的時間
appear_time = appear_time + Time.deltaTime; //計時器
if (appear_time > time_1)//判斷是否生成衛星
{
isappear = false;
if(isappear==false&&num!=1)//判斷是否已經生成衛星,沒有生成衛星便生成衛星
{
pfb = Resources.Load("Prefab/satellite") as GameObject;
prefabInstance = Instantiate(pfb,transform.position + vec ,Quaternion.identity);
prefabInstance.transform.parent = this.transform;
isappear = true;
num = 1;
}
if(num==1)//如果生成衛星,則讓它圍繞行星旋轉
{
prefabInstance.transform.RotateAround(this.transform.position, Vector3.up, around_speed * Time.deltaTime);
}
if (appear_time>time_1+time_2)//判斷是否達到存在的時間,達到后摧毀自己,并且將所有相關資料設定為初始化
{
appear_time = 0;
Destroy(prefabInstance);
num = 0;
}
}
}
}
Step6:衛星的代碼(完整)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Satelliterotation : MonoBehaviour
{
public float around_speed = 60f;
private Transform around_aim;
public string aim_name;
void Start()
{
GameObject container = GameObject.Find(aim_name);//在場景中找到與aim_name一樣名稱的物體,將其實體化給container
//這里是行星的名稱,需要在外部手動輸入
around_aim.transform.position = container.transform.position;
}
void Update()
{
//衛星環繞
transform.RotateAround(around_aim.position, Vector3.up, around_speed * Time.deltaTime);
}
}

一切準備就緒后運行游戲:

三、添加多個行星
step1.CtrlD賦值一個行星,將其名稱修改為與第一個行星名稱相同
因為衛星是按名稱來找行星的,再將其位置拖拽開來,調整其引數


step2:運行效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/328217.html
標籤:其他
上一篇:Selenium-淘寶登錄
