当前位置:   article > 正文

Unity中的Character Controller组件的基本使用_unity character controller move

unity character controller move

这是一个角色控制组件,用于移动角色。可以对移动进行一些限制,本身不受重力影响。有了该组件就不必使用刚体组件。

在这里插入图片描述

属性介绍

  • SlopeLimit :坡度度数限制,超过该坡度的地形会阻挡行进
  • Step Offset:台阶偏移量,以米为单位,高度低于该值的台阶不会阻挡前进
  • Skin Width:碰撞的皮肤宽度(指定物理引擎将在其中生成接触的角色周围的蒙皮厚度)
  • Min Move Distance:最小移动距离
  • Center:碰撞体的中心位置
  • Radius:碰撞体的半径
  • Height:碰撞体的高

脚本使用

属性

  • isGrounded:是否接触到地面
  • velocity:相对速度

方法

public CollisionFlags Move(Vector3 motion);
Move
描述:根据移动位移量进行移动
参数:motion:移动位移量
返回值:碰撞的方向

CollisionFlags.Above;   //上方
CollisionFlags.Below;   //下方
CollisionFlags.None;    //无
CollisionFlags.Sides;   //四周
  • 1
  • 2
  • 3
  • 4

实现带重力效果的第三人称移动

添加FreeLook相机

  • 在Package Manager中,找到Cinemachine安装
    在这里插入图片描述
  • 创建FreeLook相机
    在这里插入图片描述
  • 设置虚拟相机的属性
    • 设置跟随的目标,设置观看的目标
      在这里插入图片描述

    • 设置鼠标的轴,Y轴反向,X轴不反向(速度可根据个人喜好设置)在这里插入图片描述

    • 设置相机的最大移动范围,分为上中下三个圆,每个圆都有指定的高度
      在这里插入图片描述

添加Character Controller组件

在这里插入图片描述
调整参数,使碰撞体合理
在这里插入图片描述

编辑脚本

public class PlayerController : MonoBehaviour
{
    public float maxAngleSpeed = 400;//最大角速度
    public float minAngleSpeed = 100;//最小角速度
    public float acceleration = 40;//加速度
    public float maxMoveSpeed = 5f;//最大移动速度
    public float jumpSpeed = 10f;//起跳速度
    public float gravity = 10f;//重力大小
    public Transform cameraTransform;//相机的Transform


    bool isOnGround;//是否在地面上
    bool isSecondJump;//是否跳过第二次
    float ySpeed;//竖直方向的速度值
    float moveSpeed;//移动速度值
    Vector3 input;//输入
    Vector3 move;//速度
    CharacterController cont;

    void Start()
    {
        cont = this.GetComponent<CharacterController>();
    }

    void Update()
    {
        isOnGround = cont.isGrounded;
        Drop();
        Jump();
        Turn();
        Move();
    }

    void Move()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        input.x = h;
        input.z = v;

        moveSpeed = Mathf.MoveTowards
            (moveSpeed, input.normalized.magnitude * maxMoveSpeed, acceleration * Time.deltaTime);

        //前后左右移动
        //设置移动向量(相对坐标系下的)
        move = input * Time.deltaTime * moveSpeed;
        //相对坐标系转为世界坐标系
        move = this.cameraTransform.TransformDirection(move);

        //下落
        //Δy = Vy * Δt
        move += Vector3.up * ySpeed * Time.deltaTime;


        //【与下面代码等效】cont.Move(transform.forward * v + transform.right * h);
        cont.Move(move);
    }

    void Drop()
    {
        if (!isOnGround)
        {
            //ΔV = g * Δt
            ySpeed -= gravity * Time.deltaTime;

        }
        else//在地面
        {
            if (ySpeed < -1)//地面给的支持力
            {
                ySpeed += gravity * Time.deltaTime;
            }

            if (isSecondJump)
            {
                isSecondJump = false;
            }
        }
    }

    void Jump()
    {
        if (isOnGround)
        {
            if (Input.GetButtonDown("Jump"))
            {
                ySpeed = jumpSpeed;
            }
        }
        else
        {
            if (!isSecondJump)
            {
                if (Input.GetButtonDown("Jump"))
                {
                    ySpeed += jumpSpeed;
                    isSecondJump = true;
                }
            }
        }
    }

    void Turn()
    {
        if (input.x != 0 || input.z != 0)//移动时
        {
            //获取目标方向的四元数
            Vector3 targetDirection = cameraTransform.TransformDirection(input);
            targetDirection.y = 0;
            Quaternion lookQuaternion = Quaternion.LookRotation(targetDirection);

            //根据移动速度计算转向速度
            float turnSpeed = Mathf.Lerp(minAngleSpeed, maxAngleSpeed, moveSpeed / maxMoveSpeed);

            transform.rotation = Quaternion.RotateTowards
               (transform.rotation, lookQuaternion, turnSpeed * Time.deltaTime);

        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121

最后将脚本挂载到玩家上,CameraTransform设置为MainCamera,其它属性可以根据喜好自行修改

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/118774?site
推荐阅读
相关标签
  

闽ICP备14008679号