我在我的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类的当前实例
如果我无法从静态方法更新实例变量,那么在成功显示视频后如何更新?
答案 0 :(得分:2)
首先,没有什么能阻止你从静态方法对一个实例对象执行操作,事实上,如果静态方法在一个不同的类中,那么你的没有区别需要这样做才能执行操作。
这个要求很简单,你需要引用你想要执行操作的对象的实例。关于static
的特殊之处在于它无法访问有关其类成员的this
引用/指针,因此仍需要对该实例的引用工作,而普通的班级成员可以只使用this
(通常是隐含的)。
因此,找到您的对象并获取其CandyManager
组件,然后正常调用:
//In the static method
GameObject.Find("MyManagerObject").GetComponent<CandyManager>().UpdateCandy(value);
或类似的东西。在其他技术中,(甚至在Unity中)您只需将引用传递给静态方法即可。如注释中所述,静态类还可以引发CandyManager
侦听的事件。
答案 1 :(得分:0)
要从静态成员更新实例字段,必须拥有该实例。一种可能的方法是使用CandyManager
将HandleShowResult
实例存储为您的类中的静态属性:
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。