Unity中的Character Controller组件的基本使用

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

在这里插入图片描述

属性介绍

  • 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;   //四周

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

添加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);

        }
    }
}

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

  • 17
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序鸡

如果帮到您,点个赞鼓励一下吧。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值