Unity 中不显示静态变量
Statics varibales dont show in Unity
好的,首先,请原谅我的英语。好吧,我一直在用 [Serializable()] 制作 SAVEFILE,没有问题,问题是,当我尝试更改此 static 字符串时 使用用户名,我无法在其他带有 de InputField 的脚本中找到对此变量的引用。没什么奇怪的,SAVEFILE 脚本只是说:
脚本保存:
public static UIsettings uisettings;
//Data to save.
public string AirlineName = "Unknow";
public string UserName = "Unknow";
//Autoload.
public bool StartupLoad;
void Awake()
{
if(uisettings == null)
{
uisettings = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
void Start()
{
if (StartupLoad)
{
Load();
}
}
//Guardar
public void Save() //Start the SAVEGAME code
稍后,我更改了 InputFields 中其他两个脚本的 Airline Name 和 Username 的值,这两个方法如下所示:
public void SubmitName(string newAirlineName)
{
if(newAirlineName == "")
{
print("Write a valid name");
}
else
{
print(newAirlineName + " es valido.");
profileData.AirlineName = newAirlineName;
profileData.Save();
Debug.Log(UIsettings.uisettings.AirlineName);
}
}
如果我这样称呼它,工作,但是当我改变场景时这些值再次变为默认值是无用的,所以我在以下值中使用 static:
{
public static string AirlineName = "Unknow";
}
没有钥匙,很明显。但是,当我这样做时,第二个脚本的方法无法显示分配的变量,说: error CS0176: Member 'UIsettings.AirlineName' cannot be accessed with an instance reference;用类型名称限定它...
我有几天时间尝试自己解决这个问题,但是,我不知道该怎么做。
是知道SAVEGAME脚本是一个DontDestoyOnLoad文件,就像在第一个脚本中看到的那样,但我认为这不是因为脚本工作正常没有 static.
当你有一个静态变量 (public static string AirlineName
) 时,你只能使用 class 名称引用它——而不是 class 的实例——因为只有一个 AirlineName
存在,并且它与您的 class.
的任何实例无关
以下是您收到错误原因的示例:
// This example shows why are you getting the error. Skip to the second example
// to see the solution that you should use
public class UiSettings : MonoBehaviour
{
public static string AirlineName = "Unknow";
}
// ...
public void SubmitName(string newAirlineName)
{
// Just an example of getting the current instance of UiSettings
UiSettings profileData = (UiSettings)GameObject.FindObjectOfType(typeof(UiSettings));
// You can't do this because AirlineName is a static property, so you can't use an
// instance variable (profileData) to access it because AirlineName doesn't belong
// to an instance
profileData.AirlineName = newAirlineName;
// You would have to access it like this
UiSettings.AirlineName = newAirlineName;
}
但是由于您要使用 DontDestroyOnLoad
使 UiSettings
成为单例 class,您会这样做
public class UiSettings : MonoBehaviour
{
public static UIsettings uisettings;
// Do not make these static
public string AirlineName = "Unknow";
public string UserName = "Unknow";
void Awake()
{
if(uisettings == null)
{
uisettings = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
// ...
public void SubmitName(string newAirlineName)
{
// uisettings contains an instance of UiSettings, so you are allowed to say
// UiSettings.uisettings.AirlineName = ...
UiSettings.uisettings.AirlineName = newAirlineName;
}
我还建议将名称 uisettings
更改为 Instance
以明确 属性 引用 class 的单例实例。像这样:
public class UiSettings : MonoBehaviour
{
// Instead of public static UiSettings uisettings
public static UiSettings Instance { get; private set; }
}
好的,首先,请原谅我的英语。好吧,我一直在用 [Serializable()] 制作 SAVEFILE,没有问题,问题是,当我尝试更改此 static 字符串时 使用用户名,我无法在其他带有 de InputField 的脚本中找到对此变量的引用。没什么奇怪的,SAVEFILE 脚本只是说:
脚本保存:
public static UIsettings uisettings;
//Data to save.
public string AirlineName = "Unknow";
public string UserName = "Unknow";
//Autoload.
public bool StartupLoad;
void Awake()
{
if(uisettings == null)
{
uisettings = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
void Start()
{
if (StartupLoad)
{
Load();
}
}
//Guardar
public void Save() //Start the SAVEGAME code
稍后,我更改了 InputFields 中其他两个脚本的 Airline Name 和 Username 的值,这两个方法如下所示:
public void SubmitName(string newAirlineName)
{
if(newAirlineName == "")
{
print("Write a valid name");
}
else
{
print(newAirlineName + " es valido.");
profileData.AirlineName = newAirlineName;
profileData.Save();
Debug.Log(UIsettings.uisettings.AirlineName);
}
}
如果我这样称呼它,工作,但是当我改变场景时这些值再次变为默认值是无用的,所以我在以下值中使用 static:
{
public static string AirlineName = "Unknow";
}
没有钥匙,很明显。但是,当我这样做时,第二个脚本的方法无法显示分配的变量,说: error CS0176: Member 'UIsettings.AirlineName' cannot be accessed with an instance reference;用类型名称限定它...
我有几天时间尝试自己解决这个问题,但是,我不知道该怎么做。
是知道SAVEGAME脚本是一个DontDestoyOnLoad文件,就像在第一个脚本中看到的那样,但我认为这不是因为脚本工作正常没有 static.
当你有一个静态变量 (public static string AirlineName
) 时,你只能使用 class 名称引用它——而不是 class 的实例——因为只有一个 AirlineName
存在,并且它与您的 class.
以下是您收到错误原因的示例:
// This example shows why are you getting the error. Skip to the second example
// to see the solution that you should use
public class UiSettings : MonoBehaviour
{
public static string AirlineName = "Unknow";
}
// ...
public void SubmitName(string newAirlineName)
{
// Just an example of getting the current instance of UiSettings
UiSettings profileData = (UiSettings)GameObject.FindObjectOfType(typeof(UiSettings));
// You can't do this because AirlineName is a static property, so you can't use an
// instance variable (profileData) to access it because AirlineName doesn't belong
// to an instance
profileData.AirlineName = newAirlineName;
// You would have to access it like this
UiSettings.AirlineName = newAirlineName;
}
但是由于您要使用 DontDestroyOnLoad
使 UiSettings
成为单例 class,您会这样做
public class UiSettings : MonoBehaviour
{
public static UIsettings uisettings;
// Do not make these static
public string AirlineName = "Unknow";
public string UserName = "Unknow";
void Awake()
{
if(uisettings == null)
{
uisettings = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
// ...
public void SubmitName(string newAirlineName)
{
// uisettings contains an instance of UiSettings, so you are allowed to say
// UiSettings.uisettings.AirlineName = ...
UiSettings.uisettings.AirlineName = newAirlineName;
}
我还建议将名称 uisettings
更改为 Instance
以明确 属性 引用 class 的单例实例。像这样:
public class UiSettings : MonoBehaviour
{
// Instead of public static UiSettings uisettings
public static UiSettings Instance { get; private set; }
}