Unity3d 访问游戏对象函数和 Return 字符串值

Unity3d Accessing Gameobject Function And Return String Value

我有两个脚本; Localization.cs 和 LocalizeText.cs。我正在尝试从 LocalizeText.cs 访问 Localization.cs。当我访问 GetLocalString() 函数时,我收到一个错误。错误说:

"NullReferenceException: Object reference not set to an instance of an object Localization.GetLocalString (Int32 menuId) (at Assets/Scripts/Localization.cs:162) LocalizeText.Awake () (at Assets/Scripts/LocalizeText.cs:46)"

我正在使用 Getcomponent<> 从 LocalizeText.cs 访问 Localization.cs。请问你能帮帮我吗。

感谢您的宝贵时间。

Localization.cs Script :

using UnityEngine;

using System.Collections;
using System.Collections.Generic;
using JsonFx.Json;
using UnityEngine.UI;
using System.IO;
using System;

public class Localization : MonoBehaviour {
public TextAsset LanguageFile;
private List<Language> _languages ;

private enum Languages
{
    Turkish = 0,
    English = 1,
    German = 2,
    French = 3,
    Russian = 4,
    Portuguese = 5,
    Spanish = 6
}

private void Awake()
{        
    _languages = new List<Language>(JsonReader.Deserialize<Language[]>(LanguageFile.text));
    PlayerPrefs.SetInt("Language", 0);
    Debug.Log(GetLocalString(6));//it works
}



public string GetLocalString(int menuId)
{
    string value = _languages[PlayerPrefs.GetInt("Language")].menu.MenuStrings[Convert.ToInt32(menuId)];
    return value;
}

public class Language
{
    public int LanguageId;
    public Menu menu;
    public Language()
    {
        menu = new Menu();
    }        
}

public class Menu
{
    public List<string> MenuStrings;

    public Menu()
    {
        MenuStrings = new List<string>();
    }
}

}

LocalizaText.cs Script :

  using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class LocalizeText : MonoBehaviour {

private Text _text;
private Localization _localization;

public enum MenuItems
{
    Start = 0,
    Garage = 1,
    WatchVideo = 2,
    TiltControl = 3,
    GamePadControl = 4,
    Yes = 5,
    Continue = 6,
    CityRoad = 7,
    SnowyRoad = 8,
    Ridgeway = 9,
    MainMenu = 10,
    Exit = 11,
    Speed = 12,
    Acceleration = 13,
    Brake = 14,
    Play = 15,
    Loading = 16,
    LeaderBoard = 17,
    Quests = 18,
    Achivements = 19,
    No = 20,
    AreYouSure = 21

}

public MenuItems MenuItemStrings;

private void Awake()
{
    _text = GetComponent<Text>();
    _localization = GameObject.Find("Localization").GetComponent<Localization>();
    Debug.Log(_localization);
    Debug.Log(_localization.GetLocalString(System.Convert.ToInt32(MenuItemStrings)));
}

}

Output :

private List<Language> _languages;Awake 方法中被填充,另一个脚本也试图在 Awake 方法中访问它。那么当尝试从列表中访问一种语言的脚本首先使用 Awake 方法 运行 时会发生什么?在填充列表的方法之前?

得到 NullReferenceException.

因此,请尝试将访问块放入 Start 方法中,如果这不起作用,则可能是 json 解析出了问题,或者密钥根本不起作用存在。

我假设 LOLslowSTi 说的是问题所在,Awake 中有两种方法。 你可以按照他说的改成Start。或者您可以更改 script execution order.

文档:http://docs.unity3d.com/Manual/class-ScriptExecution.html