毕设项目(一)人物角色移动与转向
程序员文章站
2022-07-14 08:00:00
...
毕业设计人物如下(资源来自游戏《玄乌》):
人物的剑始终指向鼠标所在位置,人物朝向则根据移动方向判定。
第一部分:剑旋转的实现
void MouseRotate()
{
Ray ray = camera.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, 100, LayerMask.GetMask("Land")))
{
mousepoint = hitInfo.point;
mousepoint.y = sword.position.y;
StaticProperties.mousepoint = this.mousepoint;//更新全局变量
sword.LookAt(mousepoint);
}
}
摄像机向鼠标方向发出一个射线,然后进行射线检测从而获取到鼠标点对应的三维场景中的点。
这个方法需要在Update中每帧调用
第二部分:人物移动的实现
1.移动
//移动
motion = Vector3.zero;
if (Input.GetKey(KeyCode.A))
{
motion += Vector3.left;
}
if (Input.GetKey(KeyCode.D))
{
motion += Vector3.right;
}
if (Input.GetKey(KeyCode.W))
{
motion += Vector3.forward;
}
if (Input.GetKey(KeyCode.S))
{
motion += Vector3.back;
}
cc.Move(Vector3.Normalize(motion) * playerState.curSpeed * Time.deltaTime);
根据用户输入获取移动方向motion(motion为一个根据输入计算的累加值,如:用户同时按下A与W,则motion模变为根号2,所以需要单位化),然后根据玩家速度属性值计算即可。
2.转向
//转向
float angle = Vector3.Angle(new Vector3(body.forward.x, 0, body.forward.z),
motion);
if (angle > 5)
{
Vector3 crossVec = Vector3.Cross(new Vector3(body.forward.x, 0,
body.forward.z), motion);
if (crossVec.y > 0)
{
body.Rotate(body.up, 300 * Time.deltaTime);
}
else
{
body.Rotate(body.up, -300 * Time.deltaTime);
}
}
首先,计算玩家朝向与移动方向间的角度,然后如果角度大于误差值(设置为5),则玩家需要向移动方向转向。
然后需要判断左转或者右转,根据 玩家朝向 与 移动方向 叉乘得到的向量来判定:
(1)若叉乘结果向量的y分量大于0,则移动方向在玩家朝向的左侧,左转
(2)若叉乘结果向量的y分量小于0,则移动方向在玩家朝向的右侧,右转
转向是在移动过程中旋转的,可以根据需要设置旋转速度,此处设置为(300*Time.deltaTime)
下一篇: 修改title
推荐阅读