簡體   English   中英

Unity3D C#私有變量將不會使用公共設置器功能進行更新

[英]Unity3D C# private variable will not update with public setter function

來自BoardScript.cs的最少代碼

public class BoardScript : MonoBehaviour {
    private float angle;
    private static BoardScript instance;

    void Awake() {
        if (instance == null) {
            instance = this;
        }
        else if (instance != this) {
            Destroy(gameObject);
        }
     }

    Start(){
        angle = 0.5f;
    }

    Update(){
        Debug.Log("angle = " + angle); // logged angle never changes.
        Debug.Log("GetAngle() returns " + GetAngle()); // also never changes...
     }

    public SetAngle(float arg) {
        angle = arg;
        Debug.Log("angle set to " + angle);
        // Above always logs new angle as called fron Settings.cs. 
    }

    private float GetAngle() { // only use is for debugging this issue.
        Debug.Log("angle is " + angle); // Does not log newly set angle.
        return angle;
    }
}

最少的代碼Settings.cs

private GameObject theBoard;

public void SetBoardAngule(float arg) {
    theBoard.GetComponent<BoardScript>().SetAngle(arg);
    Debug.Log("Settings - SetAngle to " + arg); // Logs correct angle.
}

無論在方法SetAngle()中將其設置為什么,更新函數都會記錄“ angle = 0.5”。 對我來說,這似乎非常簡單。 我做錯了什么?

首先第一件事:您的吸氣劑安裝工一切都很好。

其他內容:首先,如果您來自Java世界,則無需為getter setter創建函數:

public SetAngle(float arg) {
        angle = arg;
        Debug.Log("angle set to " + angle);
        // Above always logs new angle as called fron Settings.cs. 
    }

    private float GetAngle() { // only use is for debugging this issue.
        Debug.Log("angle is " + angle); // Does not log newly set angle.
        return angle;
    }

可以轉換為:

public float Angle
{
    get{return _angle;}
    set{_angle = value;}
}

第二,我不確定為什么不醒着創建對象就破壞對象:但是這里要做的是,如果對象不存在,則創建對象,....否則,如果對象存在,則破壞對象,但是不創造另一個。

第三:這也與第二有關:我們正在創建單例,只有一個類的實例,如果這是您想要的,有很多方法可以實現,但是您必須相應地設置變量:當前,您正在設置(此實例)上的值(可能會與(存儲的實例)不同),一旦發生,您將丟失指針,必須在singleton類上調用它:

public float Angle
{
    get{return BoardScript.instance._angle;}
    set{BoardScript.instance._angle = value;}
}

代替:

public float Angle
{
    get{return this._angle;}
    set{this._angle = value;}
}

第四:這又與第二相關:首先,您的對象實例將存儲在實例變量中,但是如果您創建另一個調用喚醒的對象(我忘記了喚醒的工作方式和調用方式),則該對象將導致當前對象被獲取處置,我不確定這是否是您想要的行為,只是說...

void Awake() {
    if (instance == null) {
        instance = this;
    }
    else if (instance != this) {
        Destroy(gameObject);
    }
 }

正如評論員指出的,變化

private static BoardScript instance;

public BoardScript instance;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM