C# 静力学变量不能统一显示
好的,首先,请原谅我的英语。好吧,我一直在用[Serializable()]制作一个保存文件,这没有问题,问题是,当我试图用用户名更改这个静态字符串时,我在另一个带有de-InputField的脚本中找不到这个变量的引用。没什么奇怪的,SAVEFILE脚本只是说: 并保存脚本:C# 静力学变量不能统一显示,c#,unity3d,static,static-variables,C#,Unity3d,Static,Static Variables,好的,首先,请原谅我的英语。好吧,我一直在用[Serializable()]制作一个保存文件,这没有问题,问题是,当我试图用用户名更改这个静态字符串时,我在另一个带有de-InputField的脚本中找不到这个变量的引用。没什么奇怪的,SAVEFILE脚本只是说: 并保存脚本: public static UIsettings uisettings; //Data to save. public string AirlineName = "Unknow";
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";
}
显然没有钥匙。但是,当我这样做时,第二个脚本的metod无法显示指定的变量,比如:错误CS0176:Member'UIsettings.AirlineName'不能通过实例引用访问;改用类型名称限定它
我有几天时间自己解决这个问题,但我不知道该怎么办
要知道SAVEGAME脚本是一个dontdestoonload文件,就像在第一个脚本中可以看到的一样,但我认为这不是因为没有静态变量,脚本工作正常。当您有一个静态变量(
公共静态字符串AirlineName
)只能使用类名引用它,而不是类的实例,因为只有一个AirlineName
,并且它与类的任何实例都不相关
下面是一个示例,说明了为什么会出现错误:
// 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
设置为一个单例类,因此您可以这样做
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
,以明确属性引用类的单例实例。像这样:
public class UiSettings : MonoBehaviour
{
// Instead of public static UiSettings uisettings
public static UiSettings Instance { get; private set; }
}