在运行时将一个游戏对象组件添加到另一个带有值的游戏对象中
本文关键字:游戏 对象 另一个 添加 组件 一个 运行时 | 更新日期: 2023-09-27 17:51:24
在运行时,我想将一个Gameobject组件复制到另一个Gameobject 。
在我的情况下,我有一个相机,其中多个脚本添加值设置。
我想在运行时添加到另一个相机中的相同组件。到目前为止,我已经尝试过了,得到一个对象的所有组件,然后试图添加,但它不工作。
Component[] components = GameObject.Find("CamFly").GetComponents(typeof(Component));
for(var i = 0; i < components.Length; i++)
{
objCamera.AddComponent<components[i]>();
///error in above line said adds a component class named/calss name to the gameobject
}
我建议设计你的应用程序,这样你就可以调用Instantiate并获得克隆。比你想要的更容易,更快捷。
但如果你坚持,你可以在Unity论坛上使用这个答案中的代码。
你得到的错误的原因是,你试图将相同的组件(而不是它的副本)添加到另一个对象,也就是说,你想强制组件同时有两个父组件,这是不可能的(它也不可能从原来的父组件"撕下来"并移交给一个新的;为了"模拟"这种效果,你还应该使用代码-或类似的-我链接)。
从Mark的回答中我发现了这个,它的工作原理正如预期的那样,它确实复制了字段值。下面是完整的代码:
//Might not work on iOS.
public static T GetCopyOf<T>(this Component comp, T other) where T : Component
{
Type type = comp.GetType();
if (type != other.GetType()) return null; // type mis-match
BindingFlags flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Default | BindingFlags.DeclaredOnly;
PropertyInfo[] pinfos = type.GetProperties(flags);
foreach (var pinfo in pinfos)
{
if (pinfo.CanWrite)
{
try
{
pinfo.SetValue(comp, pinfo.GetValue(other, null), null);
}
catch { } // In case of NotImplementedException being thrown.
}
}
FieldInfo[] finfos = type.GetFields(flags);
foreach (var finfo in finfos)
{
finfo.SetValue(comp, finfo.GetValue(other));
}
return comp as T;
}
public static T AddComponent<T>(this GameObject go, T toAdd) where T : Component
{
return go.AddComponent<T>().GetCopyOf(toAdd) as T;
}//Example usage Health myHealth = gameObject.AddComponent<Health>(enemy.health);