问题描述
我正在尝试创建一个用于在 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#。
您可以编写一些简单的可序列化类,允许用户添加基于键值的常见类型数据,这样会更容易解析。