欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

毕设项目(一)人物角色移动与转向

程序员文章站 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)

相关标签: Unit