Целое число скрипта не изменится при использовании другого скрипта - PullRequest
0 голосов
/ 20 апреля 2020

, поэтому я использую GameObject.Find("SAVELOADSYSTEM").GetComponent<LoadManager>().Level = Level; для получения целочисленного уровня в сценарии, сценарий - просто конечный телепорт sh.

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.SceneManagement;

public class Finish : MonoBehaviour
{

    public string DebugLog;
    public string SceneName;
    public GameObject Player;
    public int Level;
    // Start is called before the first frame update
    void Start()
    {

    }


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

        var distance = 3;
        if (Vector3.Distance(transform.position, Player.transform.position) < distance && Input.GetKey(KeyCode.E))
        {
            GameObject.Find("SAVELOADSYSTEM").GetComponent<LoadManager>().Level = Level;
            Debug.Log(DebugLog);
            SceneManager.LoadScene(SceneName);
        }
    }
}

, то есть телепорт, просто подойдите к нему и нажмите e (взаимодействовать). проблема в том, что я хочу изменить целочисленное значение уровня, при котором уровень (из этого сценария) изменяется на (publi c int Level;), но проблема заключается в том, что сценарий сохранения загрузки, содержащий этап уровня (целое число), изменяется на save не хочет изменять значение с помощью этого сценария телепортации.

using System.IO;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;

public class LoadManager : MonoBehaviour
{
    public static LoadManager instance;
    public Data data;

    string dataFile = "737472696e67.dotouchit";

    public int Level { get; internal set; }

    void Awake()
    {
        if (instance == null)
        {
            DontDestroyOnLoad(this.gameObject);
            instance = this;
        }
        else if (instance != this)
        {
            Destroy(this.gameObject);
        }
    }

    private void Start()
    {
        Load();
    }

    private void Update()
    {
        Save();
    }
    public void Load()
    {
        string filePath = Application.persistentDataPath + "/" + dataFile;
        BinaryFormatter bf = new BinaryFormatter();
        if (File.Exists(filePath))
        {
            FileStream file = File.Open(filePath, FileMode.Open);
            Data loaded = (Data)bf.Deserialize(file);
            data = loaded;
            file.Close();


        }
        Debug.Log("Loaded Data");
    }
    public void Save()
    {
        string filePath = Application.persistentDataPath + "/" + dataFile;
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(filePath);
        bf.Serialize(file, data);
        file.Close();

        Debug.Log("Saved Data");
    }

    [System.Serializable]
    public class Data
    {
        public int level = 0;


        public Data()
        {

            level = 0;
        }

    }


}

, и это системный сценарий сохранения загрузки. я не знаю, почему он не хочет менять значение уровня.

1 Ответ

1 голос
/ 20 апреля 2020

Довольно уверен, что значение Level назначено правильно. Ну, не правильно , но давайте рассмотрим проблему позже.

Проблема в том, что level значение в классе Data никогда не назначается. Вы должны инициализировать его с помощью конструктора, например:

public Data(int level)
{

    this.level = level;
}

Или

public void Save()
{
    data.level = level;

    ...

Без присваивания ваше значение level всегда будет иметь значение 0. Может быть, умный Intelisense уже заметил бы вас, сказав value Level is assigned, but never used.


О проблеме, о которой я упоминал выше, ПОЧЕМУ вы это делаете,

GameObject.Find("SAVELOADSYSTEM").GetComponent<LoadManager>().Level = Level;

Похоже, вы уже объявили LoadManager с одноэлементным шаблоном, поэтому нет необходимости делать это. Если LoadManager компонент правильно подключен к GameObject, достаточно просто сделать

LoadManager.instance.Level = Level;

.

Unity GameObject.Find() - сверхтяжелая функция, так как она грубо форсирует имя всего игрового объекта в сцене. Назвать его один раз было бы хорошо, но положить эту вещь в Update()? Что ж, делать грубую силу 60 раз в секунду - не очень хорошая ситуация. Поэтому рекомендуется использовать GameObject.Find(), только в Start(), Awake() или при инициализации класса.

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