Unity - A计划(一年有效期) 扫二维码继续学习 二维码时效为半小时

(61评价)
价格: 2155.00元
关于状态机中枚举类型Transition和StateID 面对 互相独立的多状态机时,应该如何(解耦、独立、互不干扰)?
云美涵发起了问答2020-06-10
3
回复
374
浏览

【参考链接】状态机代码原型参考链接:http://wiki.unity3d.com/index.php/Finite_State_Machine
【背景说明】在本例状态机中,每次添加新状态(StateID)新过度条件 (Transition),都需要在同一个地方添加。如果有A、B两个互不相关的类使用状态机,A只有A专属的状态和条件,B只有B专属的状态和条件,都需要将本来互不干涉互相分离的状态枚举添加到这同一个定义下。

/// <summary>
/// Place the labels for the Transitions in this enum.
/// Don't change the first label, NullTransition as FSMSystem class uses it.
/// </summary>
public enum Transition
{
    NullTransition = 0, // Use this transition to represent a non-existing transition in your system
    
    TransitionA1,//A专属条件1
    TransitionA2,//A专属条件2
    TransitionAs,//A专属条件等等

    TransitionB1,//B专属条件1
    TransitionB2,//B专属条件2
    TransitionBs,//B专属条件等等  
}
 
/// <summary>
/// Place the labels for the States in this enum.
/// Don't change the first label, NullTransition as FSMSystem class uses it.
/// </summary>
public enum StateID
{
    NullStateID = 0, // Use this ID to represent a non-existing State in your system

    StateIDA1,//A专属状态1
    StateIDA2,//A专属状态2
    StateIDAs,//A专属状态等等

    StateIDB1,//B专属状态1
    StateIDB2,//B专属状态2
    StateIDBs,//B专属状态等等  	
}


【需求说明】我希望A和B之间能分开独立,类似于

public class A
{
    public enum TransitionA
    {
        TransitionA1,//A专属条件1
        TransitionA2,//A专属条件2
        TransitionAs,//A专属条件等等
    }

    public enum StateIDA
    {
        StateIDA1,//A专属状态1
        StateIDA2,//A专属状态2
        StateIDAs,//A专属状态等等
    }

    //其他
}

public class B
{
    public enum TransitionB
    {
        TransitionB1,//B专属条件1
        TransitionB2,//B专属条件2
        TransitionBs,//B专属条件等等
    }

    public enum StateIDB
    {
        StateIDB1,//B专属状态1
        StateIDB2,//B专属状态2
        StateIDBs,//B专属状态等等
    }

    //其他
}

但是这样FSMState类中定义的字典类型Dictionary<Transition, StateID> map将无法复用

请问我应如何修改以实现类似的(分离、解耦)?

所有回复
  • 老师_Trigger 2020-06-10

    同学你好,可以使用这个方法去做一个仿枚举继承,后续子类条件可以继承父类,就可以放一个字典里了,也可以封装成新的状态类和条件类。

    • 云美涵 2020-06-11

      老师,关于仿枚举继承,或者怎么做,您能说详细点吗?给我个 教程链接 或者 知识点关键字 也行。我百度搜了好久的仿枚举继承,只找到了一个类似但不准确的https://blog.csdn.net/weixin_30361753/article/details/96391674,他说的模糊,你说的也模糊,我实在是懵的很。

      (0) 回复
    • 老师_Trigger 2020-06-11

      回复 @ 云美涵: 就同学找的这篇就可以,因为C#的枚举不允许被继承,所以我们可以写一个类似于继承的枚举来做,因为同学想要的是解耦,之后可以把ABC等等的都放在一个字典里,后续可以取到,那么我们需要让这些都继承自一个基类,这个基类可以自己去定义,如果不想定义新类,因为条件都是枚举,那么可以使用文章中的方法去拓展,做成可以继承的枚举,这样就可以放一个字典里了

      (0) 回复
    还有-3条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!