我有一个gameObject(RedisTemplate< String, Long >
)和一个附加在该gameObject(myObject
)中某处的组件。
我复制游戏对象:
myComponent
然后我希望引用相同的组件,但是在我的var duplicate = Instantiate(myObject);
gameObject上。
有没有办法在重复对象上获取相同的组件?
我试图按索引获取组件,但是对于游戏对象的层次结构不起作用。
答案 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];
}