Помогите вывести данные unity

У меня в скрипте показывает количество очков за собранные монетки , помогите вывести их в поле инспектора Text

https://ibb.co/hKWFTLC

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerScript : MonoBehaviour {

    public int HP = 100;
    public int Score;


    public bool a = true;
    //
    public int Coins; // Собранные монетки

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

Ответы (4 шт):

Автор решения: Арман
public Text ScoreText;

void Update()
{
    ScoreText.text = Score;
}

Потом добавьте текстовой компонент ScoreText через инспектор

→ Ссылка
Автор решения: merkyr
public Text ScoreTxt;

void Update()
{
    ScoreTxt.text = "Счёт:" + Score;
}
→ Ссылка
Автор решения: Andrew

Переприсваивать впустую переменную по 30-120 раз каждую секунду вряд ли можно считать хорошим решением. Так что идти по пути обновления текста в апдейте не очень хорошая идея.

Мои варианты решения задачи:

Вариант 1:

public class PlayerScript : MonoBehaviour {
    private Text ScoreTxt;

    private int _score;
    public int Score {
       get{ return _score;}
       set{
           _score = value;
           if (ScoreTxt!=null){
              ScoreTxt.text = "Счёт:" + Score;
           }
       }
    }

    public void Start(){
        ScoreTxt = //ищем обьект по названию;
    }
}

В таком случае текст будет обновляться исключительно при изменении Score. Никаких лишних телодвижений сделано не будет.

важным нюансом такого решения есть то что Score пропадет из инспектора, это нужно иметь ввиду.


Вариант 2:

private Text ScoreTxt;

public int Coins;
private int _coinsOld;

public void Awake()
{
    _coinsOld = Coins;

    ScoreTxt = //ищем обьект по названию;

}

public void Update()
{
    if(Coins != _coinsOld)
    {
        _coinsOld = Coins;
        ScoreTxt.text = Coins;       
    }
}

Данное решение менее оптимальное за первое, зато переменная будет доступна из инспектора.


Вариант 3:

Следить за изменениями используя Observable.

Это решение достаточно схоже с первым решением.

пилим класс:

using System;

public class Observable<T>
{
    private T _value;

    public class ChangedEventArgs : EventArgs
    {
        public T OldValue { get; set; }
        public T NewValue { get; set; }
    }

    public EventHandler<ChangedEventArgs> Changed;

    public T Value
    {
        get { return _value; }

        set
        {
            if (!value.Equals(_value))
            {
                T oldValue = _value;
                _value = value;

                EventHandler<ChangedEventArgs> handler = Changed;
                if (handler != null)
                    handler(this, new ChangedEventArgs
                            {
                        OldValue = oldValue,
                        NewValue = value
                    });
            }
        }
    }
}

А дальше используем вместо Инта этот самый обсервейбл-враппер:

public Observable<int> valueContainer = new Observable<int>();

изменять значение нужно теперь через Value:

valueContainer.Value = 2;

а так же мы можем подписываться на ивент отвечающий за изменение переменной:

valueContainer.Changed += OnValueChanged; //в этом ивенте присваиваем текст


Лично я бы выставил приоритетность на чем остановить свой выбор здесь в такой последовательности:

3, 1, 2. То есть лучшим вариантом считаю 3. Но, конечно, выходи из своих потребностей.

→ Ссылка
Автор решения: walkinrey
public Text scoreText;

public void Update()
{
    scoreText.text = Score + "";
}
→ Ссылка