Unity官方指令碼(一)
阿新 • • 發佈:2019-01-30
一、 時間週期
- Awake()和Start()會在指令碼載入後自動呼叫
- Awake()先被呼叫,即使指令碼未被啟用。此方法最好用來設定指令碼之間的引用和初始化
- Start()在Awake()之後呼叫,第一次Update()呼叫之前,但必須是指令碼已被啟用的情況下。
- Update()每一幀都會被呼叫,大部分需要週期性改變的內容都放在這個函式裡。非物理物件的移動、計時器、輸入檢測、通常都放在Update()中。Update()並不根據正常的時間軸呼叫,如果某一幀花費的時間大於下一幀,那麼每幀呼叫的間隔將不同。
- FixedUpdate()根據正常的時間軸呼叫且每次呼叫間隔是相同的,呼叫FixedUpdate()後,會進行需要的物理計算。比如有剛體的物理物件,需要放在FixedUpdate()中。FixedUpdate()通常用於移動物理物件。
二、 空間向量
- 向量運算:向量是兩點之間的一條線。
- 2D向量可以從原點(0,0)指向平面中任意一點
- 3D與2D
- Unity遵循左手座標系法則。
三、 空間向量計算
- 3D計算兩點之間的距離:Unity中Vector3.Magnitude()會自動計算向量大小
- 3D向量有兩個常用函式,點積(通過兩個向量計算出一個標量,是一個單一值)和叉積
- 點積:通過點積可以瞭解兩個向量之間的關係。如果兩個向量的點積為0,那麼他們相互垂直。Unity中可以呼叫Vector3.Dot()自動計算點積
- 叉積的結果不是一個單一標量值,而是另一個向量,這個向量垂直於之前的兩個向量
- 當你開發一個模擬飛行遊戲時,或許會用到點積,你需要計算飛機的上向量與前向量的點積,如果兩個向量相互垂直,也就是點積為0,那麼飛機的阻力最小
如果點積增大為正值,表示飛機的爬升,可以增大阻力
- Unity中呼叫Vector3.Cross()自動計算叉積。叉積在遊戲中可以用於判斷扭矩,從而轉動坦克炮臺,首先獲取炮臺當前朝向向量,和炮臺應朝向的向量,通過他們的叉積可以計算出炮臺的扭矩
四、 時間差Time.timeDelta
- timeDelta表示兩個值之間的差。Time類中的deltaTime屬性表示Update()或fixedUpdate()每次呼叫的間隔,這可以讓值平滑變化,可用於平滑移動或其他增量的計算。
2.程式碼:
public class UsingDeltaTime : MonoBehavior
{
public float speed = 8f;
public float countdown = 3.0f;
void Update()
{
countdown -= Time.deltaTime;
if(countdown <= 0.0f)
light.enabled = true;
if(Input.GetKey(KeyCode.RightArrow))
{
//以每秒移動多少
transform.position += new Vector3(speed * Time.deltaTime,0.0f,0.0f);
}
}
}
五、 GameObject遊戲物件以及相關元件和函式方法
- 設定啟動或關閉物件:
GameObject.SetActive(true/false);
- 檢測物件自身和在“Hierarchy”中是否被啟用:
GameObject.activeSelf;
GameObject.activeInHierarchy;
- Translate和Rotate是兩個常用的改變物件位置和旋轉的函式,使用的座標是自身座標
transform.Translate(new Vector3(0,0,1) * Time.deltaTime);//每秒單位沿著z軸移動
transform.Rotate(Vector3.forward * turnSpeed * Time.deltaTime);//每秒單位沿著z軸移動
- 如果你要移動帶有碰撞器的物件,某些需要由物理互動的物件時,就不要使用Translate和Rotate,而是要使用專門移動物理物件的函式,除非你的剛體勾選了“Is Kinematic”選項。
- Destroy()可以銷燬物件和元件:Destroy(gameOject);。Destroy()的第二個引數(可選):用於設定銷燬的額延遲時間
Destroy(GetComponent<MeshRenderer>());//銷燬渲染元件
- LookAt()可以讓物件的正前方,朝向設定的座標方向。
public Transform target;
void Update()
{
transform.LookAt(target);
}
六、 線性插值Lerp