2015-04-09 4 views
0

Я внедряю объявления Unity3D в свою игру для Android. Я использую вспомогательный класс, который 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

Мероприятия/делегаты? – ryanyuyu

+4

Передайте текущий экземпляр вашего CandyManager статическому методу? –

ответ

2

Во-первых, нет ничего, что мешало бы вам выполнять операции над объектным объектом из статического метода, на самом деле, если статический метод находится в другом классе, есть без разницы в том, что вам нужно сделать в для выполнения операции.

Это требование прост, вам нужно иметь ссылку на экземпляр объекта, который вы хотите выполнить. Особая вещь о static заключается в том, что у нее нет доступа к справочнику/указателю относительно его членов класса, поэтому вам нужно еще нужна ссылка на экземпляр для его работы, тогда как обычный член класса может просто использовать this (обычно неявно).

Таким образом, найти свой объект и получить его CandyManager компонент, и называют обычно:

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

Или что-то подобное. В других технологиях (или даже в Unity) вы можете просто передать ссылку в статический метод. Как отмечено в комментариях, статический класс также может вызвать событие, которое прослушивает CandyManager.

+0

Да, это работает отлично. – LooMeenin

0

Чтобы обновить поле экземпляра от статического члена, необходимо иметь экземпляр. Одним из возможных путей для хранения экземпляра CandyManager как статическое свойство в вас классе с 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.