角色控制器 (Character Controller)

角色控制器 (Character Controller)

一、简介
角色控制器(Character Controller)主要用于对第三人称或第一人称游戏主角的控制。如果要创建类人角色,可使用角色控制器 (Character Controller)。这可以是第三人称游戏 (Third Person Platformer) 中的主角色、FPS 射击者或任何敌人角色。

二、基本概念
第三人称游戏中的这些控制器由于无规律可循,所以无法遵守固定的物理规则,例如,让某辆车每小时跑 90 英里,但是它可能会突然停止然后在极小的空间中转弯。此时,就需要由角色控制器 (Character Controller) 进行碰撞检测以确保角色可以沿墙滑动、走上和走下阶梯等。

角色控制器 (Character Controller) 既可以受力的影响,也可以不受力的影响。比如,可以通过脚本对刚体 (Rigidbody) 应用力来推动它们。通常,所有类人角色都使用角色控制器 (Character Controller) 来实现。

角色控制器 (Character Controller) 本质上是非物理性的,如果要将真实物理现象应用于角色,比如在绳索上摇摆、由大岩石推动,则必须使用刚体 (Rigidbody),这样才能对角色使用关节 (Joint) 和力。

角色控制器 (Character Controller) 始终沿 Y 轴对齐,因此如果角色需要能够在空间中改变方向(例如在变化的重力下),则也需要使用刚体 (Rigidbody)。但是要注意,很难将刚体 (Rigidbody) 调整为使角色感觉正常,因为游戏角色的预期行为方式是非物理性质的。另一个差异在于,角色控制器 (Character Controller) 可以平稳地滑过指定高度的台阶,而刚体 (Rigidbody) 则不能。

如果使刚体 (Rigidbody) 成为角色控制器 (Character Controller) 的父级,则该角色就会获得类似于“关节”(Joint) 的行为。

与角色控制器相关的概念有:

1、刚体(Rigidbody)。

2、碰撞体(Collider)。包括球体碰撞体(Sphere Collider)、箱体碰撞体(Box Collider)、网格碰撞体(Mesh Collider)、物理材质(Physics Material)、铰链关节(Hinge Joint)、弹簧关节(Spring Joint)等。

3、恒定力 (Constant Force)。

三、添加角色控制器的办法
有两种方式:

一种是添加Unity自带的角色控制器,直接将其拖放到游戏对象上即可。

另一种是添加你自己定义的角色控制器,办法为:选中要控制的角色对象–>【Component】–>【Physics】–>【Character Controller】,这样即可为该对象添加自定义的角色控制器组件。

四、相关属性
1、Slope Limit

坡度限制。该项用于设置所控制的角色对象只能爬上小于或等于该参数值的斜坡。

2、StepOoffset

台阶高度。该项用于设置所控制的角色对象可以迈上的最高台阶的高度。

3、Skin Width

皮肤厚度。该参数决定了两个碰撞体可以相互渗入的深度,较大的参数值会产生抖动的现象,较小的参数值会导致所控制的游戏对象被卡住,较为台理的设定是:该参数值为Radius值的10%。

4、Min Move Distance

最小移动距离。如果所控制的角色对象的移动距离小于该值,则游戏对象将不会移动,这可以避免抖动,大多数情况下将该值设为0。

5、Center

中心。该参数决定了胶囊碰撞体在世界坐标中的位置,并不影响所控制的角色对象的中心坐标。

6、Radius

半径。胶囊碰撞体的长度半径,同时该项也决定了碰撞体的宽度。

7、Height

高度。该顶用于设置所控制的角色对象的胶囊碰撞体的高度,改变此值将会使碰撞体沿着Y轴的正负两个方向同时伸缩。

五、注意事项
角色控制器不会对施加给它的作用力作出反应,也不会作用于真他的刚体。如果想让角色控制器能够作用于其他的刚体对象,可以通过脚本OnControllerColliderHit()函数在与其相碰撞的对象上使用—个作用力。另外,如果想让角色控制器受物理效果影响,那就最好用刚体来代替它。

1、Height、Radius、Step Offset等参数

可以修改角色控制器的Height和Radius参数来适配角色模型的网格,对于人形的角色一般推荐为2m左右。如果控制器的中心点不在人物中心,可修改胶囊的Center参数对其中心点进行调整,Step Offset参数也会对此产生影响,所以一般保证此值在0.1~04之间(以2m的人物角色为基准)。同时slope Limit参数值不要设定过小,通常设为90最好,此外,介于胶囊体形状的缘故,人物角色是无法爬上墙的。

2、Skin Width的设定

角色控制器的【Skin Width】是非常重要的属性,因此必须要正确地设定它。如果角色卡住了,通常是由于Skin Wdth值设得太小而导致的,该值可使其他的对象轻微地穿过角色控制器,并且可以避免抖动且防止角色卡住。

【Skin Width】最好设置为大于0.01并且大于Radius×10%的值。【Min Move Distance】的值推荐设为0。

3、技巧

如果角色频繁地被卡住,尝试调整【Skin Width】的值。

通过编写脚本,角色控制器可通过物理效果来影响其他的对象。但是,角色控制器无法通过物理效果被其他游戏对象所影响。

OK,了解了角色控制器(特别是类人角色控制器)的这些基础知识,你就知道为什么要介绍本章后续节的内容了。

  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CharacterController 是 Unity 引擎中用于控制角色移动和碰撞检测的组件,它可以非常方便地实现角色的移动和跳跃。下面是一个简单的代码示例,演示如何使用 CharacterController 实现角色的移动和跳跃: ```csharp using UnityEngine; public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; // 移动速度 public float jumpSpeed = 10f; // 跳跃速度 public float gravity = 20f; // 重力加速度 private CharacterController controller; private Vector3 moveDirection = Vector3.zero; void Start() { controller = GetComponent<CharacterController>(); } void Update() { // 计算角色的移动向量 float h = Input.GetAxis("Horizontal"); float v = Input.GetAxis("Vertical"); Vector3 move = transform.right * h + transform.forward * v; moveDirection = move * moveSpeed; // 判断角色是否在地面上 if (controller.isGrounded) { // 角色跳跃 if (Input.GetButtonDown("Jump")) { moveDirection.y = jumpSpeed; } } // 应用重力 moveDirection.y -= gravity * Time.deltaTime; // 使用 CharacterController 控制角色移动 controller.Move(moveDirection * Time.deltaTime); } } ``` 在这个示例中,我们首先定义了一些参数,包括移动速度、跳跃速度和重力加速度等。然后在 Start() 方法中获取 CharacterController 组件的引用。在 Update() 方法中,我们首先计算角色的移动向量,然后判断角色是否在地面上。如果在地面上,就检测是否按下了跳跃键,如果是,则将角色的垂直速度设置为跳跃速度。最后,我们应用重力,并使用 CharacterController 控制角色移动。 需要注意的是,在使用 CharacterController 控制角色移动时,我们需要将移动向量乘以 Time.deltaTime,以确保在不同的帧率下,角色的移动速度始终保持一致。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值