Unity3D C#私有变量不会使用public setter函数更新

问题描述 投票:0回答:2

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”。这对我来说似乎非常简单。我做错了什么?

c# unity3d
2个回答
1
投票

首先要做的是:你的吸气器设置器都很好。

其他的东西:首先,如果你来自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;}
}

第二,我不确定你为什么要破坏对象,而不是在清醒时创建一个:但是你在这里做的是,如果对象不存在,创建一个,......否则如果对象存在,则破坏当前,但是没有创造另一个。

第三:它也与第二个有关:我们正在创建单例,只有一个我们类的实例,如果这是你想要的,有很多方法可以做到,但你必须相应地设置你的变量:目前你正在设置(此实例)上的值可能会从(存储的实例)发生变化,一旦发生这种情况,您就会丢失指针,并且必须在单例类上调用它:

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

代替:

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

第四:它再次与第二个相关:首先你的对象实例将被存储在实例变量中,但是如果你创建另一个调用awake的对象(我忘记了awake是如何工作并被调用的)那个对象会导致当前对象被获取处置,我不确定这是否是你想要的行为,只是说......

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

0
投票

正如评论员指出的那样,改变

private static BoardScript instance;

public BoardScript instance;
© www.soinside.com 2019 - 2024. All rights reserved.