Как я могу вызвать эту функцию из другого метода в C #?

#c# #unity3d

#c# #unity3d

Вопрос:

Я пытаюсь вызвать levelSystemAnimated.ExpSkip() ее другим методом, так как я хочу использовать ее с помощью кнопки.

 [SerializeField]
private LevelUI levelUI;

private LevelSystem levelSystem = new LevelSystem();

void Start() {
  LevelSystemAnimated levelSystemAnimated = new LevelSystemAnimated(levelSystem);

  if (File.Exists(Application.persistentDataPath   "/data.save")) {
    SaveData data = SaveSystem.LoadData();

    levelSystemAnimated.AddLoadExp(data.exp);
    levelSystemAnimated.SetLoadLevel(data.level);
    levelSystem.SetLoadLevel(data.level);
    levelSystem.AddLoadExp(data.exp);
  }
  levelSystem.AddExperience(0);

  levelUI.SetLevelSystemAnimated(levelSystemAnimated);
  levelUI.SetLevelSystem(levelSystem);

  youCrashed.SetActive(false);
  LoadPlusScore();
  YouCrashed();
  InvokeRepeating("AddPlusXP", 1.0f, 0.0f);
}

public void SkipExp() {
  levelSystemAnimated.ExpSkip();
  SkipExpButton.SetActive(false);
}
 

Вот мой код, не удалось этого сделать.

Обратите внимание, что я новичок.

Комментарии:

1. Итак? Напишите другой метод, который вызывает эту строку? Вы создаете ее только в start .. вне вашей локальной переменной не существует => вместо этого создайте поле в своем классе private LevelSystemAnimated levelSystemAnimated; и удалите LevelSystemAnimated из своего Start метода

2. @derHugo Я знаю, что ты пытаешься сказать, но LevelSystemAnimated использую LevelSystem , поэтому, если я это сделаю, я получу CS0236: A field initializer cannot reference the non-static field, method, or property .

3. Я сказал удалить LevelSystemAnimated объявление типа.. я не имел в виду не инициализировать поле в Start .. вы все равно должны сохранить саму эту строку 😉

4. @derHugo Большое вам спасибо, на самом деле очень помогло!

Ответ №1:

Я приведу вам пример со сценарием пустого игрового объекта, содержащего кнопку.

Во-первых, вам нужно получить доступ к скрипту, вы можете сделать это с помощью

 public levelSystemAnimated levelSystem;
 

И перетащите GameObject скрипта внутрь инспектора, или вы можете

 void Start()
{
   GameObject levelSystem = GameObject.FindGameObjectWithTag("levelSystemObj");
   //then you can easily access to the script with a GetComponent
}
 

В любом случае, теперь у вас будет доступ к скрипту, поэтому вы можете просто

 public void ButtonToPress()
{
  levelSystem.SkipExp();
}
 

Итак, в кнопку при нажатии вы помещаете функцию ButtonToPress() , и когда вы нажимаете ее, она запускает эту функцию

Комментарии:

1. Спасибо за помощь, но levelSystemAnimated не является сценарием с одним поведением, поэтому его нельзя добавить ни в один GameObject, вот откуда возникла проблема.

2. вы можете получить к ней доступ с помощью общедоступной переменной и объекта, доступного для сценариев, есть много способов, это зависит от вашего проекта @Pupaak