如何从静态方法中更改实例变量?
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.
我正在 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.