Unity角色状态管理

角色身上挂有一个Animator

状态管理应该有两种办法

第一种办法: 
角色身上挂有两个脚本并
两个脚本分别是: 角色控制脚本,另一个是角色的状态脚本

角色控制脚本用以判断角色的移动和角色的状态切换
角色状态脚本专业负责状态的切换


第二中办法:

引入状态机的概念:

可以在角色控制脚本引入如下切换状态:
 

    public void ToRun()
    {
        if (CurrRoleFsmMgr == null) return;
        CurrRoleFsmMgr.ChangeState(RoleState.Run);
    }
public class RoleFSMMgr
{
    public AbsRoleState MRoleState=null;
    public RoleCtrl CurrRoleCtrl;
    public RoleState RoleStateEnum { get; set; }

    private  Dictionary<RoleState, AbsRoleState> _roleStateDict;

    public RoleFSMMgr(RoleCtrl roleCtrl)
    {
        this.CurrRoleCtrl = roleCtrl;
        _roleStateDict=new Dictionary<RoleState, AbsRoleState>();
        _roleStateDict[RoleState.Idle] = new RoleIdleState(this);
        _roleStateDict[RoleState.Die] = new RoleDieState(this);
        _roleStateDict[RoleState.Run] = new RoleRunState(this);
        _roleStateDict[RoleState.Attack1] = new RoleAttack1State(this);
        _roleStateDict[RoleState.Attack2] = new RoleAttack2State(this);
        _roleStateDict[RoleState.Attack3] = new RoleAttack3State(this);
        _roleStateDict[RoleState.Skill1] = new RoleSkill1State(this);
        _roleStateDict[RoleState.Skill2] = new RoleSkill2State(this);
        _roleStateDict[RoleState.Skill3] = new RoleSkill3State(this);
        if (_roleStateDict.ContainsKey(RoleStateEnum))
        {
            MRoleState = _roleStateDict[RoleStateEnum];
        }
    }

    public void OnUpdate()
    {
        if (MRoleState != null)
        {
            MRoleState.OnUpdate();
        }
    }

    public void ChangeState(RoleState newState)
    {
        if (CurrRoleCtrl == null) return;
        if (RoleStateEnum==newState)return;
        if (MRoleState != null)
        {
            MRoleState.OnExit();
        }
        RoleStateEnum = newState;
        MRoleState = _roleStateDict[newState];
        MRoleState.OnEnter();
    }
}




animator建议使用Trigger触发,使用简单些!!!

FR:海涛高软(hunk Xu)
QQ技术交流群:386476712

猜你喜欢

转载自blog.csdn.net/qq_15267341/article/details/85487978