Как & ldquo; искать & rdquo; для публичной переменной в Unity из разных сценариев без создания новых объектов [duplicate]

Перейти вверху и удалить оператор импорта, если он есть, и повторно импортировать класс. Но если это не так, сделайте чистую сборку. Вы используете Netbeans или Eclipse?

10
задан FunctionR 24 July 2015 в 11:53
поделиться

2 ответа

Вам нужно найти GameObject, который содержит компонент скрипта, на который вы планируете получить ссылку. Убедитесь, что GameObject уже находится в сцене, или Find вернет null.

 GameObject g = GameObject.Find("GameObject Name");

Затем вы можете схватить скрипт:

 BombDrop bScript = g.GetComponent<BombDrop>();

Затем вы можете доступ к переменным и функциям скрипта.

 bScript.foo();

Я только что понял, что на тот же день я ответил на очень похожий вопрос: Не знаю, как получить здоровье врага


Я немного расскажу о вашем вопросе, так как я уже ответил на это.

Что ваш код делает, так это: «Посмотрите в мой GameObject для BombDropScript, большую часть времени сценарий не будет прикреплен к одному и тому же GameObject.

Также используйте setter и getter для maxBombs.

public class BombDrop : MonoBehaviour
{
    public void setMaxBombs(int amount)
    {
        maxBombs += amount;
    }

    public int getMaxBoms()
    {
        return maxBombs;
    }
}
18
ответ дан Community 20 August 2018 в 23:44
поделиться
  • 1
    Это звучит правильно, но один вопрос. BombPrefab - это сборник, который я не хочу оставаться на сцене. потому что после уничтожения меняет мой счетчик maxBombs. И если у меня есть бомба на сцене, это уже испортило счетчик. Разве нет способа доступа к сценарию сборщиков, не находясь в сцене? – DoubleCode 24 October 2014 в 18:55
  • 2
    Есть способы, чтобы объект класса был жив, не находясь в сцене. Например, статический класс, обычный класс C #, который не является MonoBehaviour и т. Д. Однако ваш код подразумевает, что BombDrop должен быть в сцене из-за кода Update, который создает бомбы. Также я понял, что вы можете написать свой код намного проще. Я уточню свой ответ. – FunctionR 24 October 2014 в 19:01
  • 3
    Да, у моего игрока есть сценарий BombDrop, который создает экземпляр bombPrefab. Таким образом, prefab не находится на сцене до создания экземпляра. Но может быть, цель работает, когда она создается? Значит, он все равно находит свою цель? Хорошо, это было бы очень полезно:) Мой код - это то, что я мог бы поставить из собственной плохой логики. – DoubleCode 24 October 2014 в 19:05
  • 4
    И одно! Я планирую иметь более одного игрока, поэтому бомбу нужно знать, кто ее создал. Таким образом, он не сбрасывает счетчик других игроков. Но это на потом. Сначала мне просто нужна ссылка:) – DoubleCode 24 October 2014 в 19:08
  • 5
    Спасибо:) Я посмотрю на набор и получаю логику от документации. – DoubleCode 24 October 2014 в 19:15

использовать его в начале вместо пробуждения и не использовать Destroy(gameObject);, вы уничтожаете свой игровой объект, тогда вы хотите что-то от него

void Start () {
     BombDropScript =gameObject.GetComponent<BombDrop> ();
     collider = gameObject.GetComponent<BoxCollider2D> ();

     // Call the Explode function after a few seconds
     Invoke("Explode", time);

 }

void Explode() {
//..
  //..
//at last
Destroy(gameObject);
 }

, если вы хотите получить доступ к скрипту в другом объекте gameObject назначить игровой объект через инспектор и получить доступ к нему, как это

 public gameObject another;
void Start () {
     BombDropScript =another.GetComponent<BombDrop> ();
}
2
ответ дан Milad Qasemi 20 August 2018 в 23:44
поделиться
  • 1
    Хм, все равно не работает. Может быть, это что-то вроде метода взрыва? – DoubleCode 24 October 2014 в 17:13
  • 2
    не используйте Destroy (gameObject); вы уничтожаете свой gameObject, тогда вы хотите что-то от него – Milad Qasemi 24 October 2014 в 17:14
  • 3
    использовать уничтожить после того, как вы закончите с помощью скрипта – Milad Qasemi 24 October 2014 в 17:14
  • 4
    А я вижу, так оно разрушает его, пока оно не называется? Но как я могу заставить его изменить переменную после ее уничтожения. Если я установлю его на уничтожение в Explode (), он никогда не уничтожит. – DoubleCode 24 October 2014 в 17:18
  • 5
    просто сделайте последнее, что он делает, как этот void Explode() { //.. //.. //at last Destroy(gameObject); } – Milad Qasemi 24 October 2014 в 17:20
Другие вопросы по тегам:

Похожие вопросы: