【发布时间】:2018-06-11 14:24:23
【问题描述】:
我正在为 Unity 实现一个深度对象复制器。
我在这里找到了这个很棒的序列化/反序列化方法:https://stackoverflow.com/a/78612/3324388
但是,我遇到了 MonoBehaviour 对象的障碍。如果类型是 GameObject,我需要使用Instantiate 而不是序列化。所以我加了一张支票:
if (typeof(T) == typeof(GameObject))
{
GameObject clone = Instantiate(source as GameObject);
T returnClone = clone as T;
return returnClone;
}
我可以将源转换为游戏对象(使用 as),但是当我尝试反向执行时,它会失败
类型参数
T不能与as参数一起使用,因为 它没有类类型约束,也没有“类”约束。
如果我尝试像这样投射它:
if (typeof(T) == typeof(GameObject))
{
GameObject clone = Instantiate(source as GameObject);
T returnClone = (T)clone;
return returnClone;
}
无法将 GameObject 转换为类型
T
我觉得我很接近,但我不能完全正确地选择演员。你知道我缺少什么让这个工作吗?
【问题讨论】:
-
return Instanciate(...)?投射到 T 没有意义 -
在这种情况下我得到这个错误:[错误]泛型类型中的类型
T' cannot be used as type parameterT'或方法UnityEngine.Object.Instantiate<T>(T)'. There is no boxing or type parameter conversion fromT'到`UnityEngine.Object' -
听起来你需要约束
T,无论你在哪里声明它(你没有显示)就像class MyClass<T> where T : GameObject { ... }。 -
是的,我曾想过,但这将限制它不适用于非游戏对象的混合对象
-
然后进行约束
where T : class.
标签: c# unity3d serialization deserialization deep-copy