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 引用 LocalPlayerAvatarInstance 等。不需要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 中的对象生命周期管理问题下,请参阅我的评论。最好让GameObjects 和脚本成为对象生命周期的真实来源,而不是使用statics 的非MonoBehaviour 类。我想我们都遇到过这种情况。一些 C# 实践通常不应该在 Unity 中使用。

以上是关于c#'静态'变量不返回值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C中的局部静态变量范围[重复]

我如何从c ++中的函数返回多个值[重复]

从工厂方法和静态变量分配中了解返回值优化 (Visual Studio)

lambda 如何在 MSVC2017 15.9.3 中使用 /std:c++17 中的静态局部错误返回值?

C语言知识:函数详解(变量的作用域,全局变量,静态变量)

函数返回值当引用