【问题标题】:Updating an Enum for a ScriptableObject based on another enum selection?根据另一个枚举选择更新 ScriptableObject 的枚举?
【发布时间】:2018-03-08 20:46:59
【问题描述】:

基本上,我正在创建一个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 类的编辑器中执行此操作?

【问题讨论】:

  • 所以你想用一个枚举来检查一个字符有哪个类,这样你就可以用它来显示某些信息,对吗?
  • @Doh09 是的,没错
  • 提供了我看到的 2 个选项。

标签: c# unity3d enums unity-editor


【解决方案1】:

嗯。我能想到的唯一方法是沿着这些思路:

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

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

通过将subclass 属性声明为泛型并由实现定义该泛型,这应该可以工作。

【讨论】:

    【解决方案2】:

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

    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 语句

    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;
    }
    

    如果有不清楚的地方,请不要犹豫。

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多