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
我有两个脚本; 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