前文:https://blog.csdn.net/Jaihk662/article/details/87906156(Input控制面板)
一、CharacterController角色控制器
为什么使用角色控制器而不使用刚体?
→ 刚体过于灵活(敏感),例如稍有碰撞就会被弹开,物体的质量不好把握或计算等等
角色控制器面板与属性:
- Slope Limit:控制角色最大的爬坡斜率
- Step Offset:控制角色可以迈上最大的台阶高度
- Skin Width:在角色的外围包裹着一层“皮肤”,这层皮肤的厚度,就相当于角色身上透明的衣服,如果Skin Width设置为1米,那么角色当然就会“浮空”1米,一般保持默认即可
- Min Move Distance:最小移动距离,默认是1毫米,如果该数值过大但代码中单位移动速度很慢,角色就不会动
- Center/Radius/Height:角色控制器组件在Scene面板中体现为一个“胶囊碰撞器”的形状,如下面第二张图,Center为胶囊中心点位置,Radius为半径,Height为高度
二、角色碰撞器与实例
OnControllerColliderHit(ControllerColliderHit hit):角色控制器自带有碰撞器,hit为角色碰撞器碰撞到的物体的信息,除此之外,如果拥有角色控制器组件,那么共存的其他的碰撞器组件就会处于“无效”状态
角色碰撞器的所有属性也都可以通过脚本获取,另一个控制角色移动脚本示例如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMove : MonoBehaviour
{
private Rigidbody myRigidbody;
private Transform myTran;
private CharacterController cont;
public float moveSpeed = 12.0f;
public float turnSpeed = 180.0f;
private float myMoveAxis = 0.0f;
private float myTurnAxis = 0.0f;
void Start()
{
myRigidbody = gameObject.GetComponent<Rigidbody>();
myTran = gameObject.GetComponent<Transform>();
cont = gameObject.GetComponent<CharacterController>();
cont.skinWidth = 0.02f; //初始化角色的皮肤厚度
}
void FixedUpdate()
{
myMoveAxis = Input.GetAxis("Vertical");
myTurnAxis = Input.GetAxis("Horizontal");
Move(myMoveAxis);
Turn(myTurnAxis);
}
void Move(float myMoveAxis)
{
//Vector3 moveChange = myTran.forward * myMoveAxis * Time.deltaTime * moveSpeed;
//myRigidbody.MovePosition(myTran.position + moveChange);
if (myMoveAxis > 0) //角色前进
cont.Move(myTran.forward * Time.deltaTime * moveSpeed * myMoveAxis);
else if (myMoveAxis < 0) //角色后退
{
//Quaternion turnChange = Quaternion.Euler(0f, 90f, 0f);
//myRigidbody.MoveRotation(myRigidbody.rotation * turnChange);
cont.Move(myTran.forward * Time.deltaTime * moveSpeed * myMoveAxis/2);
}
}
void Turn(float myTurnAxis)
{
float Change = myTurnAxis * turnSpeed * Time.deltaTime;
Quaternion turnChange = Quaternion.Euler(0f, Change, 0f);
myRigidbody.MoveRotation(myRigidbody.rotation * turnChange);
}
void OnControllerColliderHit(ControllerColliderHit hit)
{
Debug.Log(hit.gameObject.name);
}
}