微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 ScriptableObject 中保留特定的类

如何解决在 ScriptableObject 中保留特定的类

我正在尝试创建一个用于在 Unity 中创建游戏项目的工具。我首先创建了一个基类,从中继承了游戏中的所有游戏元素:

[System.Serializable]
public class Itemmodel
{
    public int ID;
    public string Name;
    public string Description;
    public UnityEngine.Sprite Picture;
    public int Cost;
    public float Weight;
}

然后,基于基类,为特定类型的物品(例如武器类)创建了几个类:

using UnityEngine;
using System;

[Serializable]
public class WeaponModel : Itemmodel
{
    [Range(0,10000)] int damage;
}

要保存有关此项目的数据,您需要使用 ScriptableObject,这里我创建了一个 Object 类型的变量来存储有关游戏项目的所有特定类:

using System;
using UnityEngine;

[System.Serializable]
public enum ItemType
{
    Default,Weapon,Armory,Potion,Food,Readable
}


[Serializable]
public class ItemData : ScriptableObject
{
    public ItemType Type;
    public System.Object Item;
    public GameObject Prefab;
}  

但是这个解决方案对于 EditorGUILayout.PropertyField() 是不正确的,因为它会准确地绘制类型 Object 并且不允许我添加我需要的类。然后我尝试根据枚举 ItemType 使用以下方法将所需的类设置为 Object:

protected void DrawNoSerializedField<T,T2>(System.Object obj)
{
    Type objType = typeof(T);
    FieldInfo[] varsArray = objType.GetFields();
    for (int i = 0; i < varsArray.Length; i++)
    {
        if(varsArray[i].FieldType == typeof( System.Object))
        {
            Type Ttype = typeof(T2); 
            System.Object instance = Activator.CreateInstance(Ttype);
            varsArray[i].SetValue(instance,null);
        }   
    }
}

然后这样称呼它:

ItemData data = _window.serializedobject.targetobject as ItemData;
DrawNoSerializedField<ItemData,WeaponModel>(data);

但目前 varsArray[i].SetValue(instance,null) Unity 抛出错误 MissingMethodException: Default constructor not found for type WeaponModel。

我可以拒绝继承对象类的想法,但在这种情况下,您失去了所创建游戏项目的特异性。

在这种情况下,我如何组织基本项目类,以便我可以创建特定项目,如武器或盔甲,并将它们保存为 ScriptableObject,并在单独的窗口中将其全部实现为 Unity 中的 EditorGUILayout?

解决方法

查看此页面 https://docs.unity3d.com/Manual/ManagedCodeStripping.html

尝试在项目设置中将托管剥离级别设置为“禁用”。 你的脚本会像魅力一样工作,但会给你带来另一个问题。您需要让用户更改播放器设置才能使您的工具正常工作。

您可以考虑以稍微不同的方式使用对象。你可以把各种数据放在 Object 中:

Object[] obj = new Object[][]
    {
        new Object[] {1f,2f,5f},new Object[] { new Vector3(10f,3f)},"Hello,world!"
    };

然后以您想要的任何方式反序列化它,如该线程中所述:

Get properties and values from unknown object

How to get keys of object (key-value) in C#

您可以编写一些简单的可序列化类,允许用户添加基于键值的常见类型数据,这样会更容易解析。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。