基于另一个枚举选择更新 ScriptableObject 的枚举?
Updating an Enum for a ScriptableObject based on another enum selection?
基本上,我正在创建一个 ScriptableObject Skill
,我想将其限制为仅某些字符类型。但是,我不太清楚如何去做。我想避免对所有 classes 使用单个枚举,除非这是不可避免的。我将尝试在下面向您展示我的意思。
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 };
如果在编辑器中我 select Warrior
我希望出现另一个枚举并询问我是否要将其限制为某个子类型。像这样:
public enum WarriorSubClassRestrictions
{None, Barbarian, Knight, Paladin};
但是,如果我 select编辑了 Rogue 类型,我不希望出现 Warrior Enum。有没有办法在我的 ScriptableObject class 的编辑器中执行此操作?
嗯。我能想到的唯一方法是沿着这些方向:
public interface IClassRestriction<T> {
public T subclass { get; set; }
}
public class ClassRestrictionWarrior : IClassRestriction<WarriorSubClassRestrictions>{
public enum WarriorSubClassRestrictions {
None, Barbarian, Knight, Paladin
}
}
通过将 subclass
属性 声明为泛型并通过实现定义该泛型,这应该可行。
如果您希望使用不带枚举的解决方案,您可以每个 class 有一个可编写脚本的对象,然后有一个可编写脚本的对象子类型列表。
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;
}
如果有什么不清楚的地方,请随时提问。
基本上,我正在创建一个 ScriptableObject Skill
,我想将其限制为仅某些字符类型。但是,我不太清楚如何去做。我想避免对所有 classes 使用单个枚举,除非这是不可避免的。我将尝试在下面向您展示我的意思。
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 };
如果在编辑器中我 select Warrior
我希望出现另一个枚举并询问我是否要将其限制为某个子类型。像这样:
public enum WarriorSubClassRestrictions
{None, Barbarian, Knight, Paladin};
但是,如果我 select编辑了 Rogue 类型,我不希望出现 Warrior Enum。有没有办法在我的 ScriptableObject class 的编辑器中执行此操作?
嗯。我能想到的唯一方法是沿着这些方向:
public interface IClassRestriction<T> {
public T subclass { get; set; }
}
public class ClassRestrictionWarrior : IClassRestriction<WarriorSubClassRestrictions>{
public enum WarriorSubClassRestrictions {
None, Barbarian, Knight, Paladin
}
}
通过将 subclass
属性 声明为泛型并通过实现定义该泛型,这应该可行。
如果您希望使用不带枚举的解决方案,您可以每个 class 有一个可编写脚本的对象,然后有一个可编写脚本的对象子类型列表。
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;
}
如果有什么不清楚的地方,请随时提问。