文章目录
- 属性介绍
- 脚本使用
- 属性
- 方法
- 实现带重力效果的第三人称移动
- 添加FreeLook相机
- 添加Character Controller组件
- 编辑脚本
这是一个角色控制组件,用于移动角色。可以对移动进行一些限制,本身不受重力影响。有了该组件就不必使用刚体组件。
属性介绍
- SlopeLimit :坡度度数限制,超过该坡度的地形会阻挡行进
- Step Offset:台阶偏移量,以米为单位,高度低于该值的台阶不会阻挡前进
- Skin Width:碰撞的皮肤宽度(指定物理引擎将在其中生成接触的角色周围的蒙皮厚度)
- Min Move Distance:最小移动距离
- Center:碰撞体的中心位置
- Radius:碰撞体的半径
- Height:碰撞体的高
脚本使用
属性
- isGrounded:是否接触到地面
- velocity:相对速度
描述:根据移动位移量进行移动
参数: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,其它属性可以根据喜好自行修改