在Unity3D中,有多種方式能夠改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。以前寫過相似的文章,此次增長了平時經常使用API的腳本,每一個腳本均手打測試可用.c#
Transform組件用於描述物體在空間中的狀態,它包括位置(position),旋轉(rotation)和縮放(scale)。 其實全部的移動都會致使position的改變,這裏所說的經過Transform組件來移動物體,指的是直接操做Transform來控制物體的位置(position)。函數
該方法能夠將物體從當前位置,移動到指定位置,而且能夠選擇參照的座標系。 當須要進行座標系轉換時,能夠考慮使用該方法以省去轉換座標系的步驟。測試
public float m_speed = 5f; //Translate移動控制函數 void MoveControlByTranslate() { if (Input.GetKey(KeyCode.W)|Input.GetKey(KeyCode.UpArrow)) //前 { this.transform.Translate(Vector3.forward*m_speed*Time.deltaTime); } if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //後 { this.transform.Translate(Vector3.forward *- m_speed * Time.deltaTime); } if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左 { this.transform.Translate(Vector3.right *-m_speed * Time.deltaTime); } if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右 { this.transform.Translate(Vector3.right * m_speed * Time.deltaTime); } }
或者this
//Translate移動控制函數 void MoveControlByTranslateGetAxis() { float horizontal = Input.GetAxis("Horizontal"); //A D 左右 float vertical = Input.GetAxis("Vertical"); //W S 上 下 transform.Translate(Vector3.forward * vertical * m_speed * Time.deltaTime);//W S 上 下 transform.Translate(Vector3.right * horizontal * m_speed * Time.deltaTime);//A D 左右 }
Vector3既能夠表示三維空間中的一個點,也能夠表示一個向量。這三個方法均爲插值方法,Lerp爲線性插值,Slerp爲球形插值,MoveTowards在Lerp的基礎上增長了限制最大速度功能。 當須要從指定A點移動到B點時,能夠考慮時候這些方法。code
該方法是能夠平滑的從A逐漸移動到B點,而且能夠控制速度,最多見的用法是相機跟隨目標。orm
有時從新賦值position能更快實現咱們的目標。ci
Rigidbody組件用於模擬物體的物理狀態,好比物體受重力影響,物體被碰撞後的擊飛等等。it
注意:關於Rigidbody的調用均應放在FixedUpdate方法中,該方法會在每一次執行物理模擬前被調用。io
設置剛體速度可讓物體運動而且忽略靜摩擦力,這會讓物體快速從靜止狀態進入運動狀態。form
//Velocity移動控制函數 void MoveControlByVelocity() { float horizontal = Input.GetAxis("Horizontal"); //A D 左右 float vertical = Input.GetAxis("Vertical"); //W S 上 下 //這個必須分開判斷 由於一個物體的速度只有一個 if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.S)) { m_rigidbody.velocity = Vector3.forward * vertical * m_speed; } if (Input.GetKey(KeyCode.A)|Input.GetKey(KeyCode.D)) { m_rigidbody.velocity = Vector3.right * horizontal * m_speed; } }
給剛體添加一個方向的力,這種方式適合模擬物體在外力的做用下的運動狀態。
//AddForce移動控制函數 void MoveControlByAddForce() { float horizontal = Input.GetAxis("Horizontal"); //A D 左右 float vertical = Input.GetAxis("Vertical"); //W S 上 下 m_rigidbody.AddForce(Vector3.forward * vertical * m_speed); m_rigidbody.AddForce(Vector3.right * horizontal * m_speed); }
剛體受到物理約束的狀況下,移動到指定點。
CharacterController用於控制第一人稱或第三人稱角色的運動,使用這種方式能夠模擬人的一些行爲,好比限制角色爬坡的最大斜度,步伐的高度等。
用於模擬簡單運動,而且自動應用重力,返回值表示角色當前是否着地。
//SimpleMove移動控制函數 角色控制器 void MoveControlBySimpleMove() { float horizontal = Input.GetAxis("Horizontal"); //A D 左右 float vertical = Input.GetAxis("Vertical"); //W S 上 下 m_character.SimpleMove(transform.forward * vertical * m_speed); }
模擬更復雜的運動,重力須要經過代碼實現,返回值表示角色與周圍的碰撞信息。
//Move移動控制函數 角色控制器 void MoveControlByMove() { float horizontal = Input.GetAxis("Horizontal"); //A D 左右 float vertical = Input.GetAxis("Vertical"); //W S 上 下 float moveY = 0; m_gravity=10f; moveY-= m_gravity * Time.deltaTime;//重力 m_character.Move(new Vector3(horizontal, moveY, vertical) * m_speed * Time.deltaTime); }