Unity3D Player角色移動控制腳本

1. 簡介

在Unity3D中,有多種方式能夠改變物體的座標,實現移動的目的,其本質是每幀修改物體的position。以前寫過相似的文章,此次增長了平時經常使用API的腳本,每一個腳本均手打測試可用.c#

2. 經過Transform組件移動物體

Transform組件用於描述物體在空間中的狀態,它包括位置(position)旋轉(rotation)縮放(scale)。 其實全部的移動都會致使position的改變,這裏所說的經過Transform組件來移動物體,指的是直接操做Transform來控制物體的位置(position)函數

2.1 Transform.Translate

該方法能夠將物體從當前位置,移動到指定位置,而且能夠選擇參照的座標系。 當須要進行座標系轉換時,能夠考慮使用該方法以省去轉換座標系的步驟。測試

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 左右
    }

2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards

Vector3既能夠表示三維空間中的一個點,也能夠表示一個向量。這三個方法均爲插值方法,Lerp爲線性插值,Slerp爲球形插值,MoveTowards在Lerp的基礎上增長了限制最大速度功能。 當須要從指定A點移動到B點時,能夠考慮時候這些方法。code

2.3 Vector3.SmoothDamp

該方法是能夠平滑的從A逐漸移動到B點,而且能夠控制速度,最多見的用法是相機跟隨目標。orm

2.4 Transform.position

有時從新賦值position能更快實現咱們的目標。ci

3. 經過Rigidbody組件移動物體

Rigidbody組件用於模擬物體的物理狀態,好比物體受重力影響,物體被碰撞後的擊飛等等。it

注意:關於Rigidbody的調用均應放在FixedUpdate方法中,該方法會在每一次執行物理模擬前被調用。io

3.1 Rigidbody.velocity

設置剛體速度可讓物體運動而且忽略靜摩擦力,這會讓物體快速從靜止狀態進入運動狀態。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;
        }   
    }

3.2 Rigidbody.AddForce

給剛體添加一個方向的力,這種方式適合模擬物體在外力的做用下的運動狀態。

//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);  

    }

3.3 Rigidbody.MovePosition

剛體受到物理約束的狀況下,移動到指定點。

4. 經過CharacterController組件移動物體

CharacterController用於控制第一人稱或第三人稱角色的運動,使用這種方式能夠模擬人的一些行爲,好比限制角色爬坡的最大斜度,步伐的高度等。

4.1 CharacterController.SimpleMove

用於模擬簡單運動,而且自動應用重力,返回值表示角色當前是否着地。

//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); 
    }

4.2 CharacterController.Move

模擬更復雜的運動,重力須要經過代碼實現,返回值表示角色與周圍的碰撞信息。

//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);
    }
相關文章
相關標籤/搜索