Переменные сбрасываются при запуске в unity?
Когда я запускаю игру в редакторе Text(text) сбрасывается и там появляется None(text)
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Settings : MonoBehaviour
{
public Text sensitivity;
// Start is called before the first frame update
void Start()
{
sensitivity = GetComponent<Text>();
sensitivity.text = Convert.ToString(PlayerPrefs.GetFloat("Sensitivity"));
}
// Update is called once per frame
void Update()
{
}
public void SensorUpdate(float value)
{
Debug.Log(value);
PlayerPrefs.SetFloat("Sensitivity", value);
sensitivity.text = Mathf.RoundToInt(value * 100) + "%";
}
public void OnMenuButtonClick()
{
SceneManager.LoadScene("Menu");
}
}
Ответы (1 шт):
У вас глупая ситуация, либо компонент Text находится на том же объекте, что и Settings и тогда код выглядит так:
[DisallowMultipleComponent]
// RequireComponent исключает ошибки, обязывая наличие
// подобно тому, как Text не существует без CanvasRenderer
[RequireComponent(typeof(Text))]
public class Settings : MonoBehaviour
{
private Text _text;
private void Awake ()
{
_text = GetComponent<Text>();
}
}
Либо Text и Settings находятся на разных объектах и поле с ссылкой на компонент Text задаётся в инспекторе. Ни какого GetComponent в этом случае нету.
[DisallowMultipleComponent]
public class Settings : MonoBehaviour
{
// SerializeField отображает поле в инспекторе несмотря на приватность
// а поле наверняка внутренней кухни, не должно быть публичным
[SerializeField] private Text _text;
// свойство на случай, если другим нужна ссылка, но без прав изменить эту ссылку
public Text Text { get => _text; }
}
Одновременно устанавливать и в инспекторе и запрашивать через GetComponent одно и тоже бессмысленно.
П.С.
Convert.ToString(PlayerPrefs.GetFloat("Sensitivity")); можно писать проще: PlayerPrefs.GetFloat("Sensitivity").ToString(). ToString() есть у всего, хоть 123.ToString() или (1+2.3f).ToString().
Mathf.RoundToInt(value*100) не имеет смысла потому, что float*int=int(value*100) или float/int или float+int, он и так это округлит, но всегда в меньшую сторону как FloorToInt, а не RoundToInt. Нужно value*100f, что бы указать вещественное число float. Либо приведением типов value*(float)100.
