在运行时将一个游戏对象组件添加到另一个带有值的游戏对象中

本文关键字:游戏 对象 另一个 添加 组件 一个 运行时 | 更新日期: 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);