c#'静态'变量不返回值[重复]
Posted
技术标签:
【中文标题】c#\'静态\'变量不返回值[重复]【英文标题】:c# 'static' variable not returning value [duplicate]c#'静态'变量不返回值[重复] 【发布时间】:2021-11-24 23:08:15 【问题描述】:我遇到的问题
我创建了一个包含静态变量的类,我希望从中写入和读取数据,这里是数据脚本:
LocalDataContainer.cs:
public class LocalRuntimeData
/*
Local Runtime Data is the container for all local data used during runtime.
*/
public static LocalPlayer Player;
public static AvatarInstance Avatar;
public static LocomotionManager LocomotionManager;
public static TrackedDevices TrackedDevices;
/*
Methods
*/
但是使用另一个脚本从 'Start()' 方法将数据保存到 'Player' 变量,然后将该数据加载回其他组件,没有返回任何内容 - 但我不明白的是没有来自我的 IDE 和 Unity 编辑器的错误。
这是试图将数据保存到静态“播放器”变量的第二个脚本。
LocalPlayer.cs:
private void Start()
// Save player to LocalSpace runtime data.
LocalRuntimeData.Player = transform.GetComponent<LocalPlayer>();
...
我还尝试使用LocalRuntimeData.Player = this;
仅从它自身传递组件,而没有尝试一些无用的解决方法,即围绕转换执行循环回到同一组件,但这不起作用。
问题
目前,我什至不知道这是否会将数据写入静态变量,因为当我尝试使用 LocalPlayer Player = LocalRuntimeData.Player
时,实际上没有任何内容返回到尝试获取该静态变量的组件。
是的,尝试访问该静态变量的组件正在引用我们所在的命名空间“LocalRuntimeData.cs”。提醒;我的 IDE 或 Unity 编辑器都没有出现错误。
【问题讨论】:
“什么都没有返回”是什么意思?Player
变量是否为空?
@Jesse 差不多,当脚本运行它们的 Start() 方法并尝试读取 LocalRuntimeData.Player
或其他变量时,组件的 value 字段中实际上没有放置任何内容。
题外话,对static
字段/引用更好的Unity 方法 是在您的场景中说一个GameObject
,名为say "_game" 使用自定义 MonoBehaviour
引用 LocalPlayer
、AvatarInstance
等。不需要static
。这样,Unity 就可以了解和控制所有对象实例
@Ruzihm 是的!实际上在发布问题的当晚就考虑过这一点,但是是的,这解决了问题。
【参考方案1】:
if(transform.GetComponent<LocalPlayer>() == null)
transform.AddComponent<LocalPlayer>();
LocalRuntimeData.Player = transform.GetComponent<LocalPlayer>();
【讨论】:
LocalPlayer
组件在运行前已经存在。我刚刚犯了一个菜鸟错误,尝试仅在访问变量的组件中使用Start()
方法读取和写入静态变量。【参考方案2】:
已解决
我的菜鸟失误
Unity 同时提供Awake()
和Start()
方法是有原因的。尝试使用 Start()
中的静态变量做所有事情是脚本无法获取该变量的原因,因为当他们试图在写入数据的同时访问数据时,它在技术上并不存在。只需将一个正在向变量写入数据的脚本更改为 Awake()
方法,以便变量在其余组件调用 Start()
方法之前就存在。
【讨论】:
好。在 Unity 中的对象生命周期管理问题下,请参阅我的评论。最好让GameObject
s 和脚本成为对象生命周期的真实来源,而不是使用static
s 的非MonoBehaviour
类。我想我们都遇到过这种情况。一些 C# 实践通常不应该在 Unity 中使用。以上是关于c#'静态'变量不返回值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
从工厂方法和静态变量分配中了解返回值优化 (Visual Studio)