Переменные сбрасываются при запуске в 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 шт):

Автор решения: Yaroslav

У вас глупая ситуация, либо компонент 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.

→ Ссылка