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站:點我點我