這個問題想了很久,因為復制它的程序似乎沒有那么難。雖然Unity
可以用代碼輕松復制無陣列件instantiate
,但為什么我在單個組件中看不到這樣的功能?
public class FreeFly : MonoBehaviour
{
public float wingSpeed = 2f;
public bool canFly = true;
public void CopyComponent()
{
wingSpeed = 10f;
canFly = false;
var _fly = this;
var secondFly = gameObject.AddComponent<FreeFly>();
secondFly = _fly; // The second component did not register the changes.
}
public void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) CopyComponent();
}
}
如您所見,它不會改變任何東西。有趣的是,Rider IDE在帶有黃色下劃線的代碼中也顯示它無效。
什么是最好的解決方案?
考慮到變數到變數的復制是一種初學者方法,我正在尋找一種可以使用該Generic
方法復制任何組件的解決方案。接受任何幫助。
public T CopyComponent<T>(T copyFrom)
{
// I want this one..
return copyFrom;
}
uj5u.com熱心網友回復:
secondFly = _fly;
告訴計算機“從現在開始,如果我說 secondFly,我的意思是 _fly 在執行此行時參考的組件(物件)。 ”它不會修改變數參考的組件secondFly
,它只會更改secondFly
參考的內容. 這是因為secondFly
它是一個物件(任何宣告為public class ClassName {...}
,的型別Component, Rigidbody, etc
),而不是原始型別 ( int, float, double, byte, etc.
)。Object 型別的變數本身不是資料,它們指向/參考資料。
《初學者之道》:可以復制_fly的變數
secondFly.wingSpeed = _fly.wingSpeed;
secondFly.canFly = _fly.canFly;
“進階之道”:由于Unity的Components的作業方式,我不認為有一種簡單的方法可以復制一個Component并將其附加到一個GameObject,但是如果你不想手動復制Component的變數,試試將此函式添加到您的代碼并呼叫它以復制您的組件(來自https://answers.unity.com/questions/458207/copy-a-component-at-runtime.html)
T CopyComponent<T>(T original, GameObject destination) where T : Component
{
System.Type type = original.GetType();
Component copy = destination.AddComponent(type);
System.Reflection.FieldInfo[] fields = type.GetFields();
foreach (System.Reflection.FieldInfo field in fields)
{
field.SetValue(copy, field.GetValue(original));
}
return copy as T;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/477588.html