Закрытая переменная Unity3D C # не будет обновляться с помощью функции общего доступа - PullRequest
0 голосов
/ 13 апреля 2019

Минимальный код из 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.
}

Функция обновления записывает «angle = 0.5» независимо от того, что установлено в методеSetAngle ().Это кажется мне очень простым.Что я делаю неправильно?

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Перво-наперво: у вас все в порядке с установщиком геттера.

другие вещи: во-первых, если вы выходец из мира Java, вам не нужно создавать функции для установщиков геттера:

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;}
}

далее: что опять-таки связано со секундами: сначала экземпляр вашего объектаWiбудет храниться внутри переменной экземпляра, но если вы создадите другой объект, который вызывает awake (я забыл, как работал awake и его вызвали), этот объект вызовет удаление текущего объекта, я не уверен, что это поведение, которое выхочу просто сказать ...

void Awake() {
    if (instance == null) {
        instance = this;
    }
    else if (instance != this) {
        Destroy(gameObject);
    }
 }
0 голосов
/ 13 апреля 2019

Как отмечают комментаторы, изменение

private static BoardScript instance;

до

public BoardScript instance;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...