1. 程式人生 > 其它 >Unity中對transform.position.x/y/z直接賦值報錯的問題

Unity中對transform.position.x/y/z直接賦值報錯的問題

技術標籤: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方法

,而這個set方法是能修改transform的私有成員的。

補充

public Vector3 position { get; set; }

等價於

    private Vector3 mPosition;
    public Vector3 position
    {
        get{
            return mPosition;
        }
        set
        {
            mPosition = value;
        }
    }


作者:糊塗小蝸牛
連結:https://www.jianshu.com/p/dddceca086f8
來源:簡書
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。