CharacterController组件的基本使用

本文详细介绍了Unity中的CharacterController组件,包括移动、转向、跳跃等基础操作,以及注意事项如坐标系统、重力处理和组件限制。提供了一个脚本示例来展示如何在实际项目中应用这些功能。
摘要由CSDN通过智能技术生成

定义

CharacterController是一个基础的角色控制组件,通过它我们可以实现包括移动、奔跑、跳跃、爬楼梯和爬斜坡等基本的角色操作。它主要用于不基于刚体物理的第一人称或第三人称的角色控制。

注意事项

1.Move 方法是基于世界坐标系的,并且没有重力支持;

2.SimpleMove方法也是基于世界坐标系的,有重力支持(重力为游戏项目的全局重力值,在Editor-Project Settings-Physics-Gravity设置);

3.跳跃应该采用Move方法;

4.isGrounded与Skin Width和Min Move Distance参数有关。当你觉得isGrounded的判断不精确时可以尝试调节Skin Width和Min Move Distance参数。官方建议Skin Width保持为Radius参数的10%,而Min Move Distance为0;

5.对于穿透、卡住、碰撞抖动等问题可以通过适当增大Skin Width的方式来解决;

6.使用该组件后无法通过Transform组件直接修改坐标、旋转等变换值,需要先禁用该组件,修改完成后再重新启用。

总结自官方英文文档

脚本示例

using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class Player : MonoBehaviour
{
    [Header("必要属性")]
    [Tooltip("角色转向速度")] public float TurnSpeed = 100;
    [Tooltip("角色移动速度")] public float MoveSpeed = 13;
    [Tooltip("角色跳跃高度")] public float JumpHeight = 2.5f;
    [Tooltip("重力加速度值")] public float GravityValue = -9.81f;

    private CharacterController cc;
    private Vector3 playerVelocity;

    private void Start()
    {
        cc = GetComponent<CharacterController>();
    }

    private void Update()
    {
        Movement();
        Jump();
    }

    // 角色转向
    private void Turn(float hor)
    {
        Vector3 euler = transform.localRotation.eulerAngles;
        float yRotation = euler.y + hor * TurnSpeed * Time.deltaTime;
        transform.localRotation = Quaternion.Euler(euler.x, yRotation, euler.z);
    }

    // 基于CharacterController的Move方法
    // private void Movement()
    // {
    //     float hor = Input.GetAxisRaw("Horizontal");
    //     float ver = Input.GetAxisRaw("Vertical");
    //     if (hor != 0) Turn(hor);
    //     Vector3 direction = transform.TransformDirection(Vector3.forward * ver);

    //     cc.Move(direction * Time.deltaTime * MoveSpeed);
    // }

    // 基于CharacterController的SimpleMove方法
    private void Movement()
    {
        float hor = Input.GetAxisRaw("Horizontal");
        float ver = Input.GetAxisRaw("Vertical");
        if (hor != 0) Turn(hor);
        Vector3 direction = transform.TransformDirection(Vector3.forward * ver);

        cc.SimpleMove(direction * MoveSpeed);
    }

    // 角色跳跃
    private void Jump()
    {
        if (cc.isGrounded)
        {
            if (playerVelocity.y < 0) playerVelocity.y = 0;
            if (Input.GetButtonDown("Jump"))
            {
                playerVelocity.y += Mathf.Sqrt(JumpHeight * -3.0f * GravityValue);
            }
        }

        playerVelocity.y += GravityValue * Time.deltaTime;
        cc.Move(playerVelocity * Time.deltaTime);
    }
}

相关文章

【Demo】基于CharacterController组件的角色控制

如果这篇文章对你有帮助,请给作者点个赞吧!

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值