如何从静态方法中更改实例变量?

How can I change an instance variable from within a static method?

我正在 Android 游戏中实施 Unity3D 广告。我正在使用 Unity 提供的助手 class 来帮助管理不同的事件。

如果用户观看视频并完成它,我会奖励用户游戏币(糖果)。此方法在视频广告初始化后调用:

private static void HandleShowResult (ShowResult result)
    {
        switch (result)
        {
        case ShowResult.Finished:
            Debug.Log("The ad was successfully shown.");

            break;
        case ShowResult.Skipped:
            Debug.Log("The ad was skipped before reaching the end.");
            break;
        case ShowResult.Failed:
            Debug.LogError("The ad failed to be shown.");
            break;
        }
    }

在 class 评论中说我应该自定义此方法以根据广告是否成功展示来执行操作。

如果广告成功展示我想更新用户的糖果。这是我的 CandyManager class,它更新用户在游戏中收集或赚取的糖果:

[System.Serializable]
public class CandyManger : MonoBehaviour {

    // START
    public Text candyBarText; 
    public Text candyBarTextShadow;

    // PLAY
    public Text candyBarText2; 
    public Text candyBarTextShadow2;

    public int candy; 

    void Update(){
        candyBarText.text = "" + candy;
        candyBarTextShadow.text = "" + candy;

        candyBarText2.text = "" + candy;
        candyBarTextShadow2.text = "" + candy;
    }
}

我想做的是能够从静态 HandleShowResult() 中像这样更新糖果:

candyManager.candy = candyManager.candy + 5;

"candyManager" 是 CandyManager 的当前实例 class

如果我无法从静态方法更新实例变量,那么当视频成功播放时如何更新它?

首先,没有什么可以阻止您从静态方法对实例对象执行操作,事实上,如果静态方法在不同的 class 中,则 no差异 执行操作所需的操作。

这个要求很简单,您需要有一个对您希望对其执行操作的对象的实例的引用。 static 的特殊之处在于它无法访问关于其 class 成员的 this reference/pointer,因此您 still 需要对实例的引用才能工作,而普通的 class 成员可以只使用 this(通常是隐式的)。

所以,找到你的对象,得到它的CandyManager组件,然后正常调用:

//In the static method
GameObject.Find("MyManagerObject").GetComponent<CandyManager>().UpdateCandy(value);

或类似的东西。在其他技术中,(甚至在 Unity 中)您可以将引用传递给静态方法。如评论中所述,静态 class 也可能引发 CandyManager 监听的事件。

要从静态成员更新实例字段,必须有实例。一种可能的方法是将 CandyManager 实例作为静态 属性 存储在 class 中 HandleShowResult:

public static class MyClass{
    private static void HandleShowResult (ShowResult result)
    {
        //...
        //Access to MyCandyManager
    }

    public static CandyManager MyCandyManager{get;set;}
}

但在这种情况下,重要的是您只有 一个 CandyManager 实例。多个实例更难区分它们。

PS:也可以在CandyManager类型中存储一个静态的属性。在这种情况下,您使用 singleton pattern.