第三人称跟随相机
首先为项目添加后处理和相机包,并导入素材。
配置CineMachine FreeLookUp相机,调整Orbit轨道至合适的位置。
玩家待机状态
首先在场景中添加Manager空物体用于挂载MonoManager。
新增玩家的控制脚本
在角色模型上添加Model脚本,用于持有animator。
public class PlayerModel : MonoBehaviour
{
[SerializeField] private Animator animator;
public Animator Animator { get => animator;}
}
角色控制脚本继承IStateMachineOwner接口,用于作为状态机的宿主,其持有状态机以及Model层,负责玩家状态的切换以及动画的播放。
//玩家状态枚举
public enum PlayerState
{
Idle
}
public class PlayerController : MonoBehaviour,IStateMachineOwner
{
[SerializeField] private PlayerModel playerModel;
private StateMachine stateMachine;
void Start()
{
stateMachine = new StateMachine();
stateMachine.Init<PlayerIdleState>(this);
}
public void ChangeState(PlayerState playerState)
{
switch (playerState)
{
case PlayerState.Idle:
stateMachine.ChangeState<PlayerIdleState>();
break;
default:
break;
}
}
public void PlayAnimation(string animationName, float fixedTransitionDuration = 0.25f)
{
playerModel.Animator.CrossFadeInFixedTime(animationName, fixedTransitionDuration);
}
}
新增玩家的状态基类
所有玩家状态的基类,目前持有PlayerController作为宿主,可供所有玩家状态子类调用。
public class PlayerStateBase:StateBase
{
protected PlayerController player;
public override void Init(IStateMachineOwner owner)
{
player = (PlayerController)owner;
}
}
新增玩家的待机状态类
玩家待机状态类,进入时播放角色待机动画。
public class PlayerIdleState:PlayerStateBase
{
public override void Enter()
{
//播放角色待机动画
player.PlayAnimation("Idle");
}
public override void Update()
{
}
}
最终效果如下。