【Unity-學習-004】如何製作 鬼泣5 中主角和攝像機的移動、旋轉方式

CAPCOM的神作:DMC鬼泣系列在遊戲市場一直時飽受好評的。最近出的鬼泣5在前段時間可謂是掀起了不小的遊戲風浪。個大直播平臺都有主播在玩。

在幾年前玩過鬼泣4,被遊戲設定的情節深深的吸引了,所以對鬼泣4我有着較高的評價,玩了鬼泣5,雖然手殘但依然好評!

在接觸了Unity之後,就想復刻一下游戲中主角攝像機和主角的移動方式,我覺得這樣的移動方式比較人性化,玩家體驗會很好。

首先先講一下大概的復刻目標:

當左右旋轉鼠標時,攝像機圍繞着主角旋轉,當玩家按下A、D鍵時,主角在相機視野左右移動,其實實在圍繞着攝像機在轉圈圈。當玩家按下W鍵時,主角轉向此時攝像機的前方方向然後向前走,按下S鍵時,主角面向攝像機移動。

大概就是這麼個思路。具體可以看下動圖。

接下來就是實踐了。

首先是攝像機。直接放代碼:

public class CameraFollow : MonoBehaviour
{
    public Transform lookPos;  //看向的位置
    public Transform lerpPos;  //插值的位置
    public float dist;     //攝像機
    public float followSpeed = 10;  //跟隨速度
    public float rotateSpeed = 10;  //旋轉速度

    private void Update()
    {
        //鎖定鼠標指針
        if (Input.GetButtonDown("Fire1") && Cursor.lockState != CursorLockMode.Locked)
        {
            Cursor.lockState = CursorLockMode.Locked;
        }
        else if (Input.GetKeyDown(KeyCode.Escape) && Cursor.lockState == CursorLockMode.Locked)
        {
            Cursor.lockState = CursorLockMode.None;
        }

        float horMouse = Input.GetAxis("Mouse X");  //獲取鼠標左右移動
        transform.RotateAround(lerpPos.position, lerpPos.up, horMouse * Time.deltaTime * rotateSpeed);//設置攝像機旋轉

        Vector3 tempPosition = lerpPos.position + (transform.position - lerpPos.position).normalized * dist;//設置攝相機跟隨
        transform.position = Vector3.Lerp(transform.position, tempPosition, Time.deltaTime * followSpeed);

        transform.LookAt(lookPos);//看向指定的位置
    }
}

其中 lerpPos和lookPos,是預先設置的綁定在玩家身上的空物體。(比較懶,所以就直接用的比較簡單的處理方法)

然後看主角的相關信息。

看下我的動畫狀態機。

狀態機中就兩個簡單的不帶位移的動畫,執行條件也很直觀。

代碼:

public class PlayerMovement : MonoBehaviour
{
    public Animator anim;    //動畫狀態機
    public float moveSpeed;     //移動速度
    public float rotateSpeed;   //旋轉速度
    public AudioSource aS;       //AudioSourse組件 用來播放 腳步聲
    public Transform myCamera;   //攝像機組件


    // Update is called once per frame
    private void Update()
    {
        Movement();
    }

    /// <summary>
    /// 移動
    /// </summary>
    private void Movement()
    {
        float ver = Input.GetAxis("Vertical");          //獲取軸
        float hor = Input.GetAxis("Horizontal");

        if (hor != 0 || ver != 0)  //如果 條件成立 則表明 按鍵被按下了已經
        {
            if (!anim.GetBool("move"))         //播放動畫 和 聲音
            {
                anim.SetBool("move", true);
                aS.Play();
            }
            //獲取旋轉的方向
            Vector3 tempV = Vector3.ProjectOnPlane(myCamera.right * hor + myCamera.forward * ver, Vector3.up);
            Quaternion dir = Quaternion.LookRotation(tempV);
            transform.rotation = Quaternion.Lerp(transform.rotation, dir, Time.deltaTime * rotateSpeed); //旋轉插值
            transform.position += transform.forward * Time.deltaTime * moveSpeed;   //移動代碼
        }
        else
        {
            if (anim.GetBool("move")) //停止播放 動畫和 腳步聲
            {
                anim.SetBool("move", false);
                aS.Stop();
            }
        }
    }
}

其中獲取方向的這句  

Vector3 tempV = Vector3.ProjectOnPlane(myCamera.right * hor + myCamera.forward * ver, Vector3.up);

我們獲取 myCamera.right * hor 來控制左右,然後 myCamera.forward * ver 來控制前後,兩個向量相加就能得到混合後的方向。注意, myCamera.forward 指向的可是lookPos ,所以我們需要拿 計算所得到的 tempV 在水平面上投影,就能得到正確的方向。

 

下邊是 效果視頻 在B站:點我點我

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章