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

时间:2015-04-09 22:11:11

标签: c# unity3d static-methods ads instance-variables

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

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

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;
        }
    }

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

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

[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类的当前实例

如果我无法从静态方法更新实例变量,那么在成功显示视频后如何更新?

2 个答案:

答案 0 :(得分:2)

首先,没有什么能阻止你从静态方法对一个实例对象执行操作,事实上,如果静态方法在一个不同的类中,那么你的没有区别需要这样做才能执行操作。

这个要求很简单,你需要引用你想要执行操作的对象的实例。关于static的特殊之处在于它无法访问有关其类成员的this引用/指针,因此需要对该实例的引用工作,而普通的班级成员可以只使用this(通常是隐含的)。

因此,找到您的对象并获取其CandyManager组件,然后正常调用:

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

或类似的东西。在其他技术中,(甚至在Unity中)您只需将引用传递给静态方法即可。如注释中所述,静态类还可以引发CandyManager侦听的事件。

答案 1 :(得分:0)

要从静态成员更新实例字段,必须拥有该实例。一种可能的方法是使用CandyManagerHandleShowResult实例存储为您的类中的静态属性:

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

    public static CandyManager MyCandyManager{get;set;}
}

但在这种情况下,您只有{strong>一个 CandyManager实例非常重要。对于多个实例,区分它们更加困难。

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