Unity簡單的物體運動
物體的運動包括位置座標的改變和旋轉。下面是幾種運動常見手段的實例。
首先我們先new一個project,創建一個GameObject Cube
然後開始編寫腳本
1. 平移
1.1 Transform.position
public class 移動 : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
this.transform.position += Vector3.left * Time.deltaTime;
}
}
將該腳本掛載到Cube上,即可產生向左運動的動畫效果。
那麼這段代碼是什麼意思呢?首先position是transform中的一個屬性,包括x,y,z。x控制物體左右位置,y控制物體上下,z控制物體的遠近。Vector3.left是Vector3的一個屬性,表示的是3爲座標系中的向左的單位向量,實質和new Vector3(-1, 0, 0)是一個效果。還有right,up,down,forward,back就是類似的意思。Time.deltaTime,按照我的理解,由於unity採用的是離散仿真系統,每一秒被分離成了許多幀,而不同電腦的FTP是不同的,deltaTime就是每一幀所花的時間。所以這一條語句就是說讓被掛載的物體每秒向左移動一個單位。
1.2 Transform.translate
public class 移動 : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Translate(new Vector3(-1, 0, 0) * Time.deltaTime);
}
}
效果同樣也是每秒向左移動一個單位
1.3 Vector3.MoveTowards
public class 移動 : MonoBehaviour {
public Transform Target;
public float Speed;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
float step = Speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, Target.position, step);
}
}
然後我們在Cube上可以看到出現了Target和Speed需要我們填寫
新建一個GameObject的Sphere作爲Target,移到和Cube不同的位置,並設置Speed爲1,就可以看到Cube以每秒1單位的速度向Target移動,直到位置相同停止。
1.4 Vector3.SmoothDamp
public class 移動 : MonoBehaviour
{
public Transform Target;
public float smoothTime = 0.3F;
private Vector3 velocity = Vector3.zero;
void Update()
{
Vector3 targetPosition = Target.position;
transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
}
}
這裏transform.position參數表示當前位置,targetPosition表示目標位置,ref velocity表示移動速度,
smoothTime表示期望到達目標的時間,其效果與MoveTowards類似
2. 旋轉
2.1 Rotate方法
public class 旋轉 : MonoBehaviour
{
private void Update()
{
this.transform.Rotate(Vector3.up * 30 * Time.deltaTime);
}
}
Rotate的參數意思是以自身爲中心,繞着豎直向上的軸以每秒30°的速度旋轉,運行我們就能看到一個Cube在忘情的旋轉(卡特哈哈哈哈)
2.2 RotateAround方法
public class 旋轉 : MonoBehaviour
{
public Transform target;
private void Update()
{
this.transform.RotateAround(target.position, Vector3.up, 10 * Time.deltaTime);
}
}
設置一個GameObject對象作爲target,Cube就會繞着target,以豎直方向爲旋轉軸,10°每秒的速度旋轉(可以思考像地球繞太陽轉)
近期會寫一篇模擬太陽系的博客,感謝!