Помогите вывести данные unity
У меня в скрипте показывает количество очков за собранные монетки , помогите вывести их в поле инспектора Text
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 через инспектор
public Text ScoreTxt;
void Update()
{
ScoreTxt.text = "Счёт:" + Score;
}
Переприсваивать впустую переменную по 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. Но, конечно, выходи из своих потребностей.
public Text scoreText;
public void Update()
{
scoreText.text = Score + "";
}
