Unity3d。为重复的GameObject获取相同的组件

时间:2017-03-02 07:51:51

标签: c# unity3d

我有一个gameObject(RedisTemplate< String, Long >)和一个附加在该gameObject(myObject)中某处的组件。

我复制游戏对象:

myComponent

然后我希望引用相同的组件,但是在我的var duplicate = Instantiate(myObject); gameObject上。

有没有办法在重复对象上获取相同的组件?
我试图按索引获取组件,但是对于游戏对象的层次结构不起作用。

4 个答案:

答案 0 :(得分:1)

您可以复制组件,但由于组件只能有1个父级(gameObject),这意味着1个组件实例不能与2个游戏对象共享。

否则如果你可以在两个游戏对象上都有两个独立的组件实例,你可以用gameObject(带组件)创建预制件并实例化预制件。

考虑到您可能有多个相同类型的组件,但具有不同的设置(属性),并且您希望找到具有相同设置的组件,您必须使用GetComponents并循环搜索结果以查找新的(重复)组件具有完全相同的设置。

考虑(为简单起见),您需要查找名为Id的属性:

MyComponent myObjectsComponent = ... // here logic to find it, etc
GameObject duplicate = Instantiate(myObject);
List<MyComponent> myComponents = duplicate.GetComponents<MyComponent>();

// This can be replaced with bellow LINQ
MyComponent foundComponent = null;
foreach(MyComponent c in myComponents) {
  if (c.Id=myObjectsComponent.Id) {
    foundComponent = c;
    break;
  }
}

或者你可以使用LINQ来简化循环:

MyComponent foundComponent = (from c in myComponents where c.Id=myObjectsComponent.Id select c).FirstDefault<MyComponent>();

答案 1 :(得分:0)

试试这个:

var duplicate = Instantiate(myObject) as GameObject;
var componentDup = duplicate.GetComponent<__YOUR_COMPONENT__>();

https://docs.unity3d.com/ScriptReference/GameObject.GetComponent.html

答案 2 :(得分:0)

好吧,我也想尝试理解你想要的东西......我的解释是你希望在myComponent上引用特定的duplicateObject 。很好,这就是你可以做到的:

public class MyObject : MonoBehaviour {

    // Create a reference variable for the duplicate to have
    public Component theComponent { get; set; }

    void Start()
    {
        // Save the component you want the duplicate to have
        theComponent = GetComponent<Anything>(); 

        // Create the duplicate
        var duplicate = Instantiate(gameObject);

        // Set the component reference to the saved component
        duplicate.GetComponent<MyObject>().theComponent = theComponent;
    }

}

这样,您应该在对象的所有实例中引用相同的组件。您还可以创建一个脚本,该脚本包含对特定组件的静态引用,每个脚本都可以访问该脚本而无需实例化任何内容。

using UnityEngine;
public class DataHolder {
    public static Component theComponent;
}

答案 3 :(得分:0)

感谢你们所有人。

我需要这样的东西:

public static T GetSameComponentForDuplicate<T>(T c, GameObject original, GameObject duplicate)
    where T : Component
{
    // remember hierarchy
    Stack<int> path = new Stack<int>();

    var g = c.gameObject;
    while (!object.ReferenceEquals(g, original))
    {
        path.Push(g.transform.GetSiblingIndex());
        g = g.transform.parent.gameObject;
    }

    // repeat hierarchy on duplicated object
    GameObject sameGO = duplicate;
    while (path.Count != 0)
    {
        sameGO = sameGO.transform.GetChild(path.Pop()).gameObject;
    }

    // get component index
    var cc = c.gameObject.GetComponents<T>();
    int componentIndex = -1;
    for (int i = 0; i < cc.Length; i++)
    {
        if (object.ReferenceEquals(c, cc[i]))
        {
            componentIndex = i;
            break;
        }
    }

    // return component with the same index on same gameObject
    return sameGO.GetComponents<T>()[componentIndex];
}