【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站:点我点我

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThursdayGame

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值