【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.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站: