第三人称跟随相机

首先为项目添加后处理和相机包,并导入素材。

alt

配置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()
    {
        
    }
}

最终效果如下。

alt