Unity中對transform.position.x/y/z直接賦值報錯的問題
阿新 • • 發佈:2020-12-19
技術標籤:unity
描述
在Unity學習開發過程中,會遇到通過對transform.position.x/y/z
直接賦值時報錯:
但是transform.position = Vector3.zero;
卻是可以的。
究其原因
檢視Transform的指令碼你會發現position是Vector3型別,並且是一個自動實現的屬性。
//
// Summary:
// The position of the transform in world space.
public Vector3 position { get; set; }
繼續檢視Vector3的指令碼你會發現Vector3是struct型別
public struct Vector3 { public const float kEpsilon = 1E-05F; // // Summary: // X component of the vector. public float x; // // Summary: // Y component of the vector. public float y; // // Summary: // Z component of the vector. public float z;
Vector3是結構體型別,而結構體為值型別,值型別在通過方法傳遞的時候,傳遞的只是值的副本。
當使用
transform.position.x = 10;
時,這個position是呼叫transform的get方法,得到一個transform裡記錄位置的Vector3私有成員position的臨時副本,然後再對這個副本進行修改,所以不會更改transform中真實的私有成員position。這樣的修改是毫無意義的,編譯器會禁止這樣的修改操作,所以報錯。
但當使用
transform.position = Vector3.zero;
時,C#發現需要對transform的私有成員進行修改,會自動呼叫set方法
補充
public Vector3 position { get; set; }
等價於
private Vector3 mPosition;
public Vector3 position
{
get{
return mPosition;
}
set
{
mPosition = value;
}
}
作者:糊塗小蝸牛
連結:https://www.jianshu.com/p/dddceca086f8
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。