【发布时间】:2022-10-18 16:35:41
【问题描述】:
我正在制作一个编辑器工具,它允许我将部分添加到我制作的可脚本化对象类的实例中。我使用通用方法添加新部分:
[CreateAssetMenu]
class Whole : ScriptableObject {
List<PartBase> parts = new();
public void AddPart<T>() where T:PartBase, new() { parts.Add(new T()); }
}
class Foo {
//insert selection statement that goes through each Child class of PartBase
}
我目前正在做我打算做的事情的方式如下所示:
switch (EPartType)
{
case EPartType.Bar:
AddPart<BarPart>();
case EPartType.Baz:
AddPart<BazPart>();
case EPartType.Bor:
AddPart<BorPart>();
default:
break;
}
我想知道是否有一种方法可以做到这一点,不需要我打开 PartBase 的每个子类(这样用户就可以通过创建一个从 PartBase 继承的新脚本来添加自己的自定义部件,而不必另外修补我的安全枚举),同时仍然提供某种枚举选择,可以用作我的工具中的下拉菜单。
先感谢您!
【问题讨论】:
-
您可以定义枚举和对象的字典。就我个人而言,我更喜欢 switch 语句以提高可读性。
-
您不需要实例化每个子类并将其添加到列表中!只需将基类的新实例添加到列表中:
public void AddPart() { parts.Add(new PartBase());稍后您可以将任何子类实例分配到列表中:'parts[n] = AnIstanceOfBazPart; ...` -
@klekmek 是说没有其他选择不需要我写一个新的“条目”,只要我想添加一个新的部分类型,字典仍然意味着我有枚举并且 switch 语句需要我每当我添加一个新部分时都需要一个新的枚举
-
@Behnam这很容易知道,但是它并没有改变这样一个事实,即在某些时候我需要决定什么类进入任何给定列表槽,此外,我不能按照你的建议做,因为 PartBase 是抽象的
-
你的目标到底是什么?作为后备,您仍然可以进行反射并通过
Activator.CreateInstance创建实例...无论如何,如果PartBase实际上是ScriptableObject,正如您所说,那么通过new创建实例有什么好处@全部?我宁愿希望用户通过资产创建菜单创建这些实例,然后将它们拖到 Inspector 的插槽中......?
标签: c# unity3d parent-child enumeration