Unity Text Event запускается в редакторе, но не в Build - PullRequest
0 голосов
/ 29 октября 2018

У меня проблема с игрой на C #, которую я разрабатываю в Unity. Пока в редакторе запускаются текстовые уведомления с анимацией, но не тогда, когда я строю и запускаю.

Я проверил выходной журнал и получил это.

NullReferenceException: Object reference not set to an instance of an object
  at NarrativeLocation+<InitializePanel>c__Iterator0.MoveNext () [0x00000] 
  in <filename unknown>:0 
  at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, 
  IntPtr returnValueAddress) [0x00000] in <filename unknown>:0 
UnityEngine.MonoBehaviour:StartCoroutine_Auto_Internal(IEnumerator)
UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
NarrativeLocation:Update()

Код для NarrativeLocation.Update

void Update()
    {
        if (!popupIsPlaying && GameState.popupQueue.Count != 0)
        {
            int temp = GameState.popupQueue.Dequeue();
            StartCoroutine(InitializePanel(temp));
        }

        int num = 1;

        while(inZone)
        {
            if (this.gameObject.tag == "NarrativeEvent" + num)
            {
                if (Input.GetKeyDown(KeyCode.E))
                {
                    Destroy(GameObject.FindGameObjectWithTag("Notification"));
                    Destroy(GameObject.FindGameObjectWithTag("NarrativeEvent" + num));

                    Constants.GameState.popupQueue.Enqueue(num);
                }

                return;
            }
            num++;
        }
    }

Код для InitializePanel

IEnumerator InitializePanel(int num)
{
    popupIsPlaying = true;

    panel = GameObject.Find("Panel").GetComponent<PanelConfig>();
    currentEvent = JSONAssembly.RunJSONFactoryForScene(1);

    StartCoroutine(IntroAnimation());

    panel.characterIsTalking = true;
    panel.Configure(currentEvent.dialogues[num - 1]);

    yield return new WaitForSeconds(6f);

    StartCoroutine(ExitAnimation());

    Debug.Log("Event " + num + " destroyed");

    popupIsPlaying = false;

}

public IEnumerator IntroAnimation()
{
    panelAnimator.SetBool("IntroAnimationIn", true);
    yield break;
}

public IEnumerator ExitAnimation()
{
    panelAnimator.SetBool("IntroAnimationIn", false);
    yield break;

}

Когда я запускаю игру, всплывающая панель без текста. Анимация выхода, похоже, тоже не вызывается.

Класс сборки JSON.

namespace JSONFactory {
class JSONAssembly {

    private static Dictionary<int, string> _resourceList = new Dictionary<int, string>
    {
        {1, "/Resources/GameScript.json"}
    };

    public static NarrativeEvent RunJSONFactoryForScene(int sceneNumber)
    {
        string resourcePath = PathForScene(sceneNumber);

        if (isValidJSON(resourcePath) == true)
        {
            string jsonString = File.ReadAllText(Application.dataPath + resourcePath);
            NarrativeEvent narrativeEvent = JsonMapper.ToObject<NarrativeEvent>(jsonString);

            return narrativeEvent;
        }
        else
        {
            throw new Exception("JSON is not valid");
        }
    }

    private static string PathForScene(int sceneNumber)
    {
        string resourcePathResult;

        if (_resourceList.TryGetValue(sceneNumber, out resourcePathResult))
        {
            return _resourceList[sceneNumber];
        }
        else
        {
            throw new Exception("Scene not in resource list");
        }
    }

    private static bool isValidJSON(string path)
    {
        return (Path.GetExtension(path) == ".json") ? true : false;
    }
}

}

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

В сборках нельзя использовать путь к ресурсам для загрузки файлов во время выполнения с использованием File.ReadAllText. Файлы в ресурсах / каталогах упаковываются в запатентованный формат упакованных ресурсов в процессе сборки и не могут быть извлечены таким путем.

Вы должны использовать API ресурсов, если вы хотите загружать файлы таким образом.

Однако файлы, помещенные в Application.streamingAssetsPath (он же /Assets/StreamingAssets) CAN , могут быть прочитаны во время выполнения таким образом. Файлы в этой папке сохраняются как есть. Они могут быть доступны для

System.IO.Path.Combine(
  Application.streamingAssetsPath, "/Path/To/file.json");

// assuming path is:
//   /Assets/StreamingAssets/Path/To/file.json

Ресурсы, вероятно, ближе к тому, что вы хотите.

В качестве альтернативы, Unity импортирует файлы json (или любой другой текстовый файл в этом отношении) как TextAssets. Вы можете ссылаться на эти TextAsset файлы в инспекторе, как и на любой другой тип активов.

public class MyMono : MonoBehaviour
{  
    public TextAsset json;

    void Start() {
        Debug.Log(json.text);
    }
0 голосов
/ 30 октября 2018

В то время как в редакторе запускаются текстовые уведомления с анимацией, но не тогда, когда я строю и запускаю.

Я могу выделить несколько возможных причин, по которым ваш код не работает в сборке. Могло быть больше, что я пропустил, но вижу их ниже:

1 . Откуда вы пытаетесь загрузить файл json:

{1, "/Resources/GameScript.json"}

A . При чтении из папки «Ресурсы» вы не включаете «Ресурсы» в путь. Путь относительно папки Resource.

B . Не включайте в путь имена расширений файлов, например .txt, .jpeg, .mp3.

Чтобы исправить оба, заменить :

{1, "/Resources/GameScript.json"}

с

{1, "GameScript"}

2 . Как вы сейчас читаете файл:

string jsonString = File.ReadAllText(Application.dataPath + resourcePath);

В данный момент вы читаете файл с File.ReadAllText. Это будет работать в редакторе, но не в сборке, потому что это не то, как читать файл в папке ресурсов.

Файлы в папке «Ресурсы» читаются с помощью Resources API.

Чтобы исправить это, заменить :

string jsonString = File.ReadAllText(Application.dataPath + resourcePath);

с

TextAsset txtAsset = Resources.Load<TextAsset>(resourcePath);
string jsonString = txtAsset.text;

Убедитесь, что файл json находится в папке с именем «Resources» в вашем проекте, и это должно быть написано правильно.


Другие проблемы, вероятно, возникнут позже:

Бесконечный цикл:

Код while(inZone) не может выйти. Если вы когда-нибудь столкнетесь с этим, вы рискуете заморозить вашу программу, потому что в этом цикле нет кода, который мог бы сделать inZone ложным. Вы должны найти способ переписать этот код.

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