1.初始配置
- 安装Cinemachine插件
- 给角色添加CharacterConroller
- 创建Cinemachine-->Free Look Camera
- 在Free Look Camera中调整参数,Y Axis勾选Inver,X Axis取消勾选Inver
- Free Look Camera要看向角色 + 跟随角色(自行设置,我就不再赘述了)
2.编写C#脚本
代码可以自行收藏直接用,关键自行调整的参数是:
speed、rotateSpeed、jumpHeight
cs
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("参数")]
public float speed; //角色移动速度(跑步的时候是两倍)
public float rotateSpeed; //角色转向速度
public float playerGravity = 9.8F; //角色重力
public float jumpForce; //跳跃力度
public float jumpHeight = 2F; //跳跃高度
public float verticalVelocity = 0;//垂直速度
[Header("状态")]
public bool isMove; //是否在移动
public bool isRun; //是否在跑步
[Header("输入")]
public Vector3 inputDirection; //wasd输入(x值表示horizontal,z值表示vertical,y值为0)
[Header("组件")]
public CharacterController characterController; //这个在Start函数中初始化,你也可以在Inspector初始化
private void Start()
{
inputDirection = new Vector3();
characterController = GetComponent<CharacterController>();
}
private void Update()
{
//计算WASD输入
inputDirection.x = Input.GetAxisRaw("Horizontal");
inputDirection.z = Input.GetAxisRaw("Vertical");
//获得是否是移动和跑步状态
isMove = inputDirection.magnitude > 0;
isRun = isMove && Input.GetKey(KeyCode.LeftShift);
//光标的可见性设置
if (Input.GetKeyDown(KeyCode.I))
{
Cursor.visible = !Cursor.visible;
}
if (Input.GetKeyDown(KeyCode.Space))
{
characterController.SimpleMove(transform.up * jumpForce);
}
if (!isMove) return;
//实现角色转向到相机平行于xz轴构成的平面的朝向
Vector3 targetDirection = new Vector3(inputDirection.x, 0, inputDirection.z);
float y = Camera.main.transform.rotation.eulerAngles.y;
Quaternion targetRotation = Quaternion.Euler(0, y, 0) * Quaternion.LookRotation(targetDirection);
// 使用Quaternion.Slerp进行平滑转向
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * rotateSpeed);
}
private void FixedUpdate()
{
Vector3 moveDirection = Vector3.zero;
moveDirection += transform.forward * inputDirection.z;
moveDirection += transform.right * inputDirection.x;
moveDirection *= Time.fixedDeltaTime * (isRun ? speed*2 : speed);
// 重力
if (!characterController.isGrounded)
verticalVelocity -= playerGravity * Time.fixedDeltaTime;// a*t=v
else
verticalVelocity = 0.0F;
// 跳跃
if (Input.GetButton("Jump"))
{
// 得在地面才能跳
if (characterController.isGrounded)
{
verticalVelocity = Mathf.Sqrt(jumpHeight * 2 / playerGravity) * playerGravity;// 初始向上速度
}
}
moveDirection.y += verticalVelocity * Time.fixedDeltaTime;// v*t=s
// 移动
characterController.Move(moveDirection);
}
}
3.测试效果
测试运行效果,看看是否正常