1. 通過代碼直接修改物體位置的方式
主要方法如trnasform.position+=offset、transform.Translate(offset)等,offset為角色每幀位置的偏移量,給角色添加碰撞體和剛體后,可作為角色控制器使用。
使用此種方式時,移動代碼寫道Update中時,角色和碰撞體交互時會產(chǎn)生抖動現(xiàn)象,寫到FixedUpdate中可解決。
示例:
void FixedUpdate()
{
float horizontal=Input.GetAxis("Horizontal");
float vertical=Input.GetAxis("Vertical");
transform.Translate(new Vector3(horizontal,0f,vertical),Space.World);
}
2. 通過CharacterController
主要方法如CharacterController.Move(offset)、CharacterController.SimpleMove(Speed)等,CharacterController無法對其他物體施加力(不能推開箱子),也不會受到力的影響,一個很明顯的表現(xiàn)就是給角色添加剛體組件后,角色不會像一般的碰撞體沒那樣下落,所以需要使用代碼模擬重力來控制角色下落。
示例:
void Update()
{
float horizontal=Input.GetAxis("Horizontal");
float vertical=Input.GetAxis("Vertical");
Vector3 horizontalVelocity=new Vector3(horizontal,0f,vertical);//水平速度
float verticalVelocity=CharacterController.velocity.y;//垂直速度
if(CharacterController.isGrounded&&verticalVelocity<0f)
{
verticalVelocity=0f;
}
verticalVelocity-=Time.deltaTime*gravity;//gravity重力加速度
CharacterController.Move((horizontalVelocity+verticalVelocity*Vector3.up)*Time.deltaTime);
}
雖然CharacterController繼承自Collider,但無法觸發(fā)碰撞類回調(diào)函數(shù),如OnTriggerEnter、OnColliderEnter等,即使添加剛體組件也不行。CharacterController使用OnControllerColliderHit回調(diào)函數(shù)獲取碰撞對象,(角色和碰撞對象都不需要添加剛體組件)。
CharacterController組件適用于非真實風格的游戲,如角色可以從跑步狀態(tài)瞬間切換為停止狀態(tài)或角色可以實現(xiàn)瞬間轉(zhuǎn)彎等,剛體方式更適用于真實風格的游戲。
3. 剛體移動
主要方法為Rigidbody.AddForce()、MovePosition()等。
示例:
void FixedUpdate()
{
float horizontal=Input.GetAxis("Horizontal");
float vertical=Input.GetAxis("Vertical");
Vector3 horizontalVelocity=mRigidbody.velocity;
horizontalVelocity.y=0;
mRigidbody.AddForce(new Vector3(horizontal,0,vertical)-horizontalVelocity,ForceMode.VelocityChange);
}
4. 通過NavMeshAgent
主要方法為NavMeshAgent.SetDestination()等。
示例:
void Update()
{
float horizontal=Input.GetAxis("Horizontal");
float vertical=Input.GetAxis("Vertical");
meshAgent.SetDestination(transform.position+new Vector3(horizontal,0,vertical));
}