簡體   English   中英

如何從靜態方法中更改實例變量?

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

我正在我的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類的當前實例

如果無法通過靜態方法更新實例變量,那么如何在成功顯示視頻后如何更新它?

首先,沒有什么可以阻止您使用靜態方法對實例對象執行操作,實際上,如果靜態方法位於不同的類中,則執行操作所需執行的操作沒有任何區別

要求很簡單,您需要引用要對其執行操作的對象的實例。 關於static的特別之處在於,它無法訪問有關其類成員的this引用/指針,因此您需要引用該實例才能使其正常工作,而普通的類成員只能使用this (通常是隱式的)。 )。

因此,找到您的對象並獲取其CandyManager組件,然后正常調用:

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

或類似的東西。 在其他技術中(甚至在Unity中),您可以將引用傳遞給靜態方法。 如注釋中所述,靜態類還可以引發CandyManager偵聽的事件。

要從靜態成員更新實例字段,必須具有該實例。 一種可能的方式是將存儲CandyManager實例作為你與類的靜態屬性HandleShowResult

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

    public static CandyManager MyCandyManager{get;set;}
}

但是在這種情況下,只有一個 CandyManager實例非常重要。 對於多個實例,更難區分它們。

PS:也可以在CandyManager類型中存儲靜態屬性。 在這種情況下,請使用單例模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM