admin 管理员组文章数量: 887021
【Unity
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 frameprivate 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站:点我点我
本文标签: unity
版权声明:本文标题:【Unity 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1697994214h280901.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论