根据另一个枚举选择更新ScriptableObject的枚举?

时间:2018-03-08 20:46:59

标签: c# unity3d enums unity-editor

基本上,我正在创建ScriptableObject Skill,我想将其限制为仅限于某些字符类型。但是,我无法弄清楚如何去做。除非不可避免,否则我想避免为所有类都使用单个枚举。我会尝试向你展示我的意思。

public class Skills : ScriptableObject {

public string Description;
public Sprite Thumbnail;
public int LevelNeeded;
public int XPNeeded;

ClassRestrictions classRestrictions;

}

public enum ClassRestrictions
{ None, Warrior, Rogue, Mage };

如果在编辑器中我选择了Warrior,我希望出现另一个枚举,并询问我是否要将其限制为某个子类型。像这样:

public enum WarriorSubClassRestrictions
{None, Barbarian, Knight, Paladin};

但是,如果我选择了Rogue类型,我就不会想要出现Warrior Enum。有没有办法在我的ScriptableObject类的编辑器中执行此操作?

2 个答案:

答案 0 :(得分:1)

嗯。我能想到的唯一方法是这样做:

public interface IClassRestriction<T> {
    public T subclass { get; set; }
}

public class ClassRestrictionWarrior : IClassRestriction<WarriorSubClassRestrictions>{
    public enum WarriorSubClassRestrictions {
        None, Barbarian, Knight, Paladin
    }
}

通过将subclass属性声明为通用属性并通过实现定义该泛型,这应该可行。

答案 1 :(得分:0)

如果您希望使用不带枚举的解决方案,您可以为每个类创建一个可编写脚本的对象,然后列出可编写脚本的对象子类型。

public class CharacterClass : ScriptableObject{
    List<CharacterClassSubType> SubTypes; //Holds the list of all subtypes available to this class.
    CharacterClassSubType SelectedSubType; //The subtype chosen.
}

public class CharacterClassSubType : ScriptableObject{
    //Subtype code
}

将技能融入其中同样适用。

如果您想使用枚举

您可以使用if语句或开关来检查选择了哪个枚举。

然后,在运行代码的每个检查中,您都会显示一个特定的代码集。

如果声明

if (classRestrictions == ClassRestrictions.Knight)
{
//Class is a knight, run your code here to show subclasses for the knight.
}

切换声明

switch(classRestrictions )
{
     case ClassRestrictions.Barbarian:
     //Run Barbariancode to show relevant subclasses.
     break;
     case ClassRestrictions.Knight:
     //Run knight code to show relevant subclasses.
     break;
     case ClassRestrictions.Paladin:
     //Run Paladincode to show relevant subclasses.
     break;
     case ClassRestrictions.None:
     //Run Nonecode to show relevant subclasses.
     break;
     case default:
     //Run default code, chosen if none of the others apply.
     break;
}

如果不清楚,请不要犹豫。