Unity中移動角色的幾種方式

1. 通過代碼直接修改物體位置的方式

主要方法如trnasform.position+=offsettransform.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));
}
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容