内容纲要

摄像机的运动

1.初始化
将摄像机位置设置到玩家的位置,旋转方向设置为玩家的旋转方向,然后将摄像机对准玩家,并记录此时的玩家与摄像机的偏移量。

void BehindPlayer()
{
    transform.position = player.position;
    transform.rotation = player.rotation;
    transform.Translate(0, height, -distance);
    transform.LookAt(player);

    offset = transform.position - player.position;
}

2.摄像机位置的更新
首先在LateUpdate函数中更新摄像机的transform。LateUpdate是在所有的Update函数调用之后才进行调用的。所以保证了游戏角色在Update的transform更新后再更新摄像机的。

RotateAround使用注意:
该函数的第二个参数是有本地坐标系和世界坐标系的区分。

private void LateUpdate()
    {
        transform.position = player.position + offset;

        bool lButtonDown = Input.GetMouseButtonDown(0);
        bool rButtonDown = Input.GetMouseButtonDown(1);
        bool lButtonUp = Input.GetMouseButtonUp(0);
        bool rButtonUp = Input.GetMouseButtonUp(1);
        bool lButtonOn = Input.GetMouseButton(0);
        bool rButtonOn = Input.GetMouseButton(1);
        bool hButtonOn = Input.GetAxis("Horizontal") != 0f;

        // 鼠标隐藏位置并锁定位置功能,防止在使用鼠标修改视窗过程中,鼠标影响美观。
        if (lButtonDown || rButtonDown)
        {
            Cursor.lockState = CursorLockMode.Locked;
        } else if (lButtonUp || rButtonUp)
        {
            Cursor.lockState = CursorLockMode.None;
        }
        // 绕x轴的旋转角度
        float xDeg = 0;
        // 绕y轴的旋转角度
        float yDeg = 0;

        if (rButtonOn || hButtonOn)
        {
            xDeg = -Input.GetAxis("Mouse Y");
            yDeg = player.eulerAngles.y - transform.eulerAngles.y;
        }

        if (!fps && lButtonOn)
        {
            xDeg = -Input.GetAxis("Mouse Y");
            yDeg = Input.GetAxis("Mouse X");
        }

        transform.RotateAround(player.position, transform.right, xDeg);
        transform.RotateAround(player.position, player.up, yDeg);

        offset = transform.position - player.position;

        if (!fps)
        {
            float delta = Input.GetAxis("Mouse ScrollWheel");
            // 矢量的单位长度
            Vector3 normOffset = offset.normalized;
            float lenOffset = offset.magnitude;
            lenOffset -= delta;
            offset = normOffset * lenOffset;
        }
     }

角色动作

角色的动作在Unity中是由动画实现的。
复杂的动作用blend tree进行控制。通过设置动画的触发条件触发相应的动作。
动画中可以包含角色的transform组件的控制,玩家也可以通过重载OnAnimationMove来控制角色的transform。

Unity自动寻路与角色动画结合

转弯动画需要知道角色正面的矢量与自动寻路的矢量之间的欧拉角,并把需要旋转的角度设置给动画,使动画与游戏对象保持一致。在计算欧拉角时需要将角色的正方向和导航的方向转为地面矢量。使其保持在同一平面。
计算平面投影:Vector3.ProjectOnPlane
计算欧拉角:Quaternion.FromToRotation

1 对 “CharMove”的想法;

发表评论