1. 通過代碼直接修改物體位置的方式
主要方法如trnasform.position+=offset
、transform.Translate(offset)
等评凝,offset為角色每幀位置的偏移量,給角色添加碰撞體和剛體后格二,可作為角色控制器使用赚哗。
使用此種方式時(shí)蟋字,移動代碼寫道Update中時(shí),角色和碰撞體交互時(shí)會產(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
無法對其他物體施加力(不能推開箱子)秃流,也不會受到力的影響,一個(gè)很明顯的表現(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
組件適用于非真實(shí)風(fēng)格的游戲船万,如角色可以從跑步狀態(tài)瞬間切換為停止?fàn)顟B(tài)或角色可以實(shí)現(xiàn)瞬間轉(zhuǎn)彎等,剛體方式更適用于真實(shí)風(fēng)格的游戲骨田。
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));
}