【问题标题】:Method is not changing outer variable C#方法不改变外部变量 C#
【发布时间】:2021-05-25 11:59:06
【问题描述】:

我想更改方法内的外部变量 (var1),以便能够使用 getter 返回它的值。但不知何故 var1 仅在函数内更改,而不是全局更改。如何全局更改方法内部 var1 的值?

代码真的很简单:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class PlayerMovement : MonoBehaviour
{
    private float var1 = 0f;

    void Update()
    {
        var1 = 5;
        print(var1);      // output: 5
    }

    public float GetVar1() 
    {  
        print(var1);
        return var1;     // output: 0
    }
}

update 方法由游戏引擎 unity 本身调用,getter 在另一个类中调用。

调用getter的类在这里:

public class bullet : MonoBehaviour
{

    public PlayerMovement playerdata;
    private float output;



    void Update()
    {
        output = playerdata.GetVar1();
    
    }
}

【问题讨论】:

  • 你能告诉我们调用这些方法的代码吗?
  • 这不是一个完整的代码。我所看到的猜测是您在“PlayerMovement”的不同实例上调用“Update”和“GetVar1”。你能添加调用这些方法的代码吗?
  • 工作正常:Update(); var v = GetVar1(); 按预期打印 5 和 v == 5。也许您尝试了var v = GetVar1(); Update(); ,因此您得到了 0 和 5。...
  • 听起来你需要一个静态类或一个单例。
  • 调用者没有在PlayerMovement playerdata 实例上调用Update?因此它的值为 0

标签: c# variables global


【解决方案1】:

如果您希望bullet 实例的output 为5,那么您需要先在playerdata 实例上调用Update()

public class bullet : MonoBehaviour
{
    public PlayerMovement playerdata;
    private float output;

    void Update()
    {
        playerdata.Update();
        output = playerdata.GetVar1();
    }
}

我还注意到,除非bullet 是不完整的代码,否则您不会创建PlayerMovement 类的实例,因此您将获得NullReferenceException

【讨论】:

  • 谢谢,它有效:) 我没想到我必须再次通过类项目符号本身调用更新函数,因为我认为它已经被统一调用并且通过全局更改值.
  • @Stefan 以上是标准 C# 代码。我承认我从未真正使用过 Unity。它似乎有一些奇怪的行为,可能使用反射来确定子类是否具有Update 方法,而不是继承。无论如何......我找到了这个,如果它有帮助:forum.unity.com/threads/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2023-03-26
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多