繁体   English   中英

C# 给属性分配一个属性类型的子类?

[英]C# Assign a subclass of a property type to the property?

我在 StackOverflow 和其他地方进行了一个多小时的搜索,但找不到这个确切问题的答案。

在 Unity 2020.1 中,我有一个带有 StateLogic 属性的 State() class。 StateLogic 有几个子类来处理不同状态的游戏逻辑,例如 IdleStateLogic 和 MoveToStateLogic。 这个想法是 State() 本身是通用的,并且可以在检查器中添加用于游戏逻辑、传感和转换的不同脚本对象(这在很大程度上基于“Pluggable AI”架构)。

但是,StateLogic 属性是独一无二的,因为它需要能够被分配 StateLogic() 的子类。 但是,当前的子类 StateLogic() 类不能分配给该属性:

public class State : ScriptableObject
{
    [field: SerializeField]
    public virtual StateLogic stateLogic { get; set; }

    ...

StateLogic() 基础 class 使用public abstract class StateLogic: ScriptableObject定义。 其子类 IdleStateLogic() 使用public class IdleStateLogic: StateLogic定义。

如何修改 State() 上的 StateLogic 属性,以便像 IdleStateLogic() 一样为其分配 StateLogic() 子类?

编辑:

这是我可以制作的最简单的最小可重现示例:

StateController 有一个 currentState:

public class StateController : MonoBehaviour
{
    public State currentState;
}

currentState State 是一个 ScriptableObject ,它包含对其游戏逻辑 StateLogic、Actions 和 Transitions 的引用(所有这些都是单独的类):

public class State : ScriptableObject
{
    [field: SerializeField]
    public virtual StateLogic stateLogic { get; set; }
    public Action[] actions;
    public Transition[] transitions;
}

stateLogic 属性在检查器中可见,但不能为其分配任何内容。 目标是能够将 StateLogic 的子类分配给检查器中 State 的 stateLogic 属性。 像 IdleStateLogic 这样的子类:

public class IdleStateLogic : StateLogic
{
    /// <summary>
    /// Note that we're taking UnitStateController instead of the base class' StateController, so this is not
    /// an override method.
    /// </summary>
    /// <param name="c"></param>
    public void Enter(UnitStateController c)
    {
        Debug.Log("Enter IdleStateLogic");
    }
}

所以问题是,为什么我不能在检查器中为 stateLogic 属性分配任何东西? IU 不应该能够将 StateLogic 的子类拖放到该属性吗? 当 stateLogic 被声明为public StateLogic stateLogic;

我只是不明白为什么不能分配给它。

您不能在检查器中分配给stateLogic ,因为它是一个属性,而不是一个字段。 尝试这个:

public class State : ScriptableObject
{
    public StateLogic stateLogic;
    public Action[] actions;
    public Transition[] transitions;
}

这样做的结果是它也不能是虚拟的。 不过,无论如何,这对于您的用例来说似乎有点过度设计。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM