使 Unity 属性(如 [range])与 ScriptableObjects 中的继承一起工作

Posted

技术标签:

【中文标题】使 Unity 属性(如 [range])与 ScriptableObjects 中的继承一起工作【英文标题】:Make Unity attributes like [range] work together with inheritance in ScriptableObjects 【发布时间】:2018-12-22 23:06:15 【问题描述】:

让我们使用以下代码:

public abstract class ItemTemplate : ScriptableObject

    public Sprite Sprite;
    public DataKeeperScript.ItemCategories ItemCategory;
    public string Name;
    [Range(0, 100)]
    public int Rarity;


[CreateAssetMenu(fileName = "New FoodTemplate", menuName = "ItemTemplates/Food")]
public class FoodTemplate : ItemTemplate

    [Range(0, 100)]
    public int HungerFillAmount;

当我在编辑器中创建“Weapon”scriptableObject 资产时,我还可以填写父“Item”类的属性,这很棒。

但是,当我在编辑器中为“武器”创建可编写脚本的对象资产时,为什么父“项目”类的 [范围] 属性不起作用? “武器”类本身的 HungerFillAmount 范围也不起作用。想不通。我可以在某处放置一些魔法属性以使这些属性也适用于继承的孩子吗?谢谢你和我一起思考! :)

【问题讨论】:

【参考方案1】:

如果我将您的代码放在一个名为 FoodTemplate.cs 的文件中并创建一个 Food 实例,则范围属性会起作用。首先我使用了另一个文件名,然后它不起作用所以我猜这个问题与文件名错误有关?你用的是什么文件名?

【讨论】:

已修复!我首先将所有子类放在一个大的 FileTemplate.cs 文件中,但这也产生了编辑器有时说找不到相关脚本的问题。现在我创建了单独的文件,所以我有 ItemTemplate.cs 用于抽象文件和子类 FoodTemplate.cs、WeaponTemplate.cs 等。我之前这样做是为了修复未找到脚本的错误,但直到现在我才看到它也解决了这个问题。也会将我的评论作为答案发布,因此很容易被其他人发现。【参考方案2】:

已经解决了!我首先将所有子类放在一个大的 FileTemplate.cs 文件中,但这也产生了编辑器有时说找不到相关脚本的问题。现在我创建了单独的文件,所以我有 ItemTemplate.cs 用于抽象文件和子类 FoodTemplate.cs、WeaponTemplate.cs 等。我之前这样做是为了修复未找到脚本的错误,但直到现在我才看到它也修复了这个问题。

【讨论】:

以上是关于使 Unity 属性(如 [range])与 ScriptableObjects 中的继承一起工作的主要内容,如果未能解决你的问题,请参考以下文章

Unity基本操作一

range开始节点和结束节点

UnityShader入门学习——Unity的Shader

Unity 自定义天空盒,如 Unity 天空盒

Unity编辑器扩展

unity Texture贴图纹理及相关属性