Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122

Как передать несколько GameObject в функцию?

24.06.2020, 11:41. Показов 4820. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно передать GameObject в функцию, если она в Start() то она есть и выводится, но вот функции GetDt() её уже невидно

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Dt : MonoBehaviour{
  public GameObject en1;
  public GameObject en2;
  public GameObject en3;
  public List<ConstructSpawnEnemy> listSpawn = new List<ConstructSpawnEnemy>();
  private void Start(){
    // Instantiate(en1, transform.position, transform.rotation); для проверки
    }
  public List<ConstructSpawnEnemy> GetDt(){
    // Instantiate(en1, transform.position, transform.rotation); для проверки
    listSpawn.Add(new ConstructSpawnEnemy(en1,2,false));
    listSpawn.Add(new ConstructSpawnEnemy(en2,5,false));
    listSpawn.Add(new ConstructSpawnEnemy(en3,10,false));
    return listSpawn;
    }
  }
Что не так?
Простые переменные передаются без проблем, GameObject нет...

Добавлено через 46 минут
ConstructSpawnEnemy если что таков
C#
1
2
3
4
5
6
7
8
9
10
public class ConstructSpawnEnemy{
    public GameObject Prefab;
    public float TimeFromStart;
    public bool HasSpawned;
    public ConstructSpawnEnemy(GameObject prefab, float timeFromStart, bool hasSpawned){
        Prefab = prefab;
        TimeFromStart = timeFromStart;
        HasSpawned = hasSpawned;
        }
    }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.06.2020, 11:41
Ответы с готовыми решениями:

Как передать несколько параметров в функцию
Как передать несколько параметров в функцию? пытаюсь передать переменную s она объявлена глобально но бъет ошибку function...

Как передать несколько переменных в функцию ?
Всем доброго дня. Это выборочные строчки кода, мне кажется не стоит скидывать весь код, так как проблема локальная. Подскажите, пожалуйста,...

Как передать в функцию потока несколько аргументов?
Приветствую. Вот программа. Хочу передать в потоки 2 функции min и max, как передать в pthread_create аргументы к ним? #include...

18
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 11:56
Ну и где ошибка?
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 12:00  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Ну и где ошибка?
GameObject не передается в GetDt(), я для примера показал что если раскомментировать 7ю строку то объект появится на сцене, то есть GameObject туда передается, в вот если раскомментировать 10ю строку (то есть проверить есть ли она), то там ошибка "NullReferenceException", то есть туда уже GameObject не попадает, хотя обычные переменные туда попадают, через лог просматривал и они там есть, GameObject нету...
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 12:24
Ты метод GetDt вызываешь в старте? Или где?

Добавлено через 2 минуты
Кстати ошибка будет ArgumentException: The Object you want to instantiate is null.
А ты говоришь про NullReferenceException... что-то не сходится.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 12:35  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Ты метод GetDt вызываешь в старте? Или где?
в другом классе

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Spawner : MonoBehaviour{
    
    //public GameObject enemy1;
    //public GameObject enemy2;
    //public GameObject enemy3;
    
    List<ConstructSpawnEnemy> listSpawn = new List<ConstructSpawnEnemy>();
    public float spawnTime = 3f;
    public float startSpawnTime = 0f;
    private float timer = 0;
    private void Start(){
        EnemyData ar = new EnemyData();
        listSpawn = ar.GetDt();
        }
    
    void Update(){
        timer -= Time.deltaTime;
        startSpawnTime += Time.deltaTime;
        foreach(var cse in listSpawn){
            if(!cse.HasSpawned && cse.TimeFromStart < startSpawnTime){
                if(cse.Prefab!=null) Instantiate(cse.Prefab, transform.position, transform.rotation);
                cse.HasSpawned = true;
                }
            
        }
        }
}
HasSpawned и TimeFromStart передаются проверял, Prefab нет...

Добавлено через 3 минуты
Цитата Сообщение от 1max1 Посмотреть сообщение
Кстати ошибка будет ArgumentException: The Object you want to instantiate is null.
А ты говоришь про NullReferenceException... что-то не сходится.
вот я показал весь скрипт что его касается, ошибка вот такая, может из-за того что в другом классе...

Добавлено через 5 минут
Я немного переделывал, я выложу тот вариант который сейчас
ConstructSpawnEnemy
C#
1
2
3
4
5
6
7
8
9
10
public class ConstructSpawnEnemy{
    public GameObject Prefab;
    public float TimeFromStart;
    public bool HasSpawned;
    public ConstructSpawnEnemy(GameObject prefab, float timeFromStart, bool hasSpawned){
        Prefab = prefab;
        TimeFromStart = timeFromStart;
        HasSpawned = hasSpawned;
        }
    }
EnemyData
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class EnemyData : MonoBehaviour{
    public GameObject enemy1;
    public GameObject enemy2;
    public GameObject enemy3;
    public List<ConstructSpawnEnemy> listSpawn = new List<ConstructSpawnEnemy>();
    public List<ConstructSpawnEnemy> GetDataEnemy(){    
        listSpawn.Add(new ConstructSpawnEnemy(enemy3,2,false));
        listSpawn.Add(new ConstructSpawnEnemy(enemy2,5,false));
        listSpawn.Add(new ConstructSpawnEnemy(enemy1,8,false));
        return listSpawn;
        }
    }
Spawner
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Spawner : MonoBehaviour{
    List<ConstructSpawnEnemy> listSpawn = new List<ConstructSpawnEnemy>();
    public float spawnTime = 3f;
    public float startSpawnTime = 0f;
    private float timer = 0;
    private void Start(){
        EnemyData ar = new EnemyData();
        listSpawn = ar.GetDataEnemy();
        }
    
    void Update(){
        timer -= Time.deltaTime;
        startSpawnTime += Time.deltaTime;
        foreach(var cse in listSpawn){
            if(!cse.HasSpawned && cse.TimeFromStart < startSpawnTime){
                if(cse.Prefab!=null) Instantiate(cse.Prefab, transform.position, transform.rotation);
                cse.HasSpawned = true;
                }
            
            }
        }
    }
так я думаю будет удобнее рассматривать
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 12:41
C#
1
EnemyData ar = new EnemyData();
Может ты не знал, но монобехи так создавать нельзя) Но даже, если так, ты создаешь новый экземпляр EnemyData, поля enemy1 и тд пустые, ты их нигде не заполняешь.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 13:21  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Может ты не знал, но монобехи так создавать нельзя) Но даже, если так, ты создаешь новый экземпляр EnemyData, поля enemy1 и тд пустые, ты их нигде не заполняешь.
я пробовал их добавлять прямо в класс Spawner
C#
1
2
3
public GameObject enemy1;
public GameObject enemy2;
public GameObject enemy3;
и префабы туда подтягивал, тоже самое...

Добавлено через 51 секунду
да и простые переменные то так подтягиваются...

Добавлено через 12 минут
В общем как можно передать GameObject в другой класс?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 13:22
Вот упрощенный пример того что ты делаешь сейчас:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class EnemyData
{
    public GameObject enemy1; // Изначально null
    public GameObject enemy2; // Изначально null
    public GameObject enemy3; // Изначально null
}
 
class Spawner : MonoBehaviour
{
    void Start()
    {
        EnemyData ar = new EnemyData();
 
        print(ar.enemy1); // null, потому что этому полю нигде не присвоено значение
    }
}
 
// Надо что-то типа такого:
 
class Spawner2 : MonoBehaviour
{
    // Заполняем в инспекторе
    public GameObject enemy1; 
    public GameObject enemy2;
    public GameObject enemy3;
 
    void Start()
    {
        EnemyData ar = new EnemyData();
 
        ar.enemy1 = enemy1;
        ar.enemy2 = enemy2;
        ar.enemy3 = enemy3;
 
        print(ar.enemy1); // Уже не null
    }
}
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 13:24  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
, поля enemy1 и тд пустые
кроме enemy1, timeFromStart и hasSpawned передаются, проверял в логах...
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 13:27

Где ты их передаешь? Я не вижу в твоем коде этого.

Добавлено через 1 минуту
Ты из EnemyData в методе GetDataEnemy создаешь экземпляр ConstructSpawnEnemy, но у тебя же там поля enemy1/2/3 пустые...
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 13:32  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Где ты их передаешь? Я не вижу в твоем коде этого.
добавив логи
C#
1
2
3
4
5
........
foreach(var cse in listSpawn){
  Debug.Log("S => "+ cse.HasSpawned);
  Debug.Log("T => "+ cse.TimeFromStart);
........
я вижу что они выводятся, то есть передаются.
А задаются здесь
C#
1
2
3
4
5
6
7
8
9
10
public GameObject enemy1;
public GameObject enemy2;
public GameObject enemy3;
public List<ConstructSpawnEnemy> listSpawn = new List<ConstructSpawnEnemy>();
public List<ConstructSpawnEnemy> GetDataEnemy(){    
        listSpawn.Add(new ConstructSpawnEnemy(enemy3,2,false));
        listSpawn.Add(new ConstructSpawnEnemy(enemy2,5,false));
        listSpawn.Add(new ConstructSpawnEnemy(enemy1,8,false));
        return listSpawn;
        }
вот же добавление в массив listSpawn.Add(new ConstructSpawnEnemy(enemy1,8,false)); , сюда добавляются в массив префаб и значения к примеру 2 и false, вот эти 2 и false туда передаются (в класс Spawner) там я их вижу, префаба нет...
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 13:39
Я тебе уже объяснил что у тебя enemy1/2/3 == null, в твоем классе, ты их не заполняешь нигде, или ты думаешь что каким-то волшебным образом они сами заполнятся? Ты понимаешь, что если ты тупо напишешь:
C#
1
public GameObject enemy1;
то в этой переменной будет null изначально. Нет? Ну тогда я больше ничем не могу тебе помочь, извини.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 13:47  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
то в этой переменной будет null изначально. Нет? Ну тогда я больше ничем не могу тебе помочь, извини.
но в инспекторе я туда префаб вставляю, значит уже не null, разве не так?
для проверки я в том же классе EnemyData делаю

C#
1
2
3
private void Start(){
    Instantiate(enemy1, transform.position, transform.rotation);
    }
и префаб появляется на сцене, значит он не null он есть, а вот далее уже в функции GetDataEnemy() этого же класса он уже null...
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 13:50
У скрипт тебя EnemyData висит на объекте? Так а зачем ты экземпляр его создаешь? Нужно делать GetComponent.
C#
1
2
EnemyData ar = GetComponent<EnemyData>(); // !!!
listSpawn = ar.GetDataEnemy();
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 14:03  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
У скрипт тебя EnemyData висит на объекте? Так а зачем ты экземпляр его создаешь? Нужно делать GetComponent.
Есть объект Spawner (куб на сцене) к нему прикреплен скрипт Spawner, оттуда начинают движение enemy1,2,3
Есть объект EnemyData (просто невидимый объект), к нему прикреплен скрипт EnemyData и префабы enemy1,2,3
Может я тут неправильно построил?

Цитата Сообщение от 1max1 Посмотреть сообщение
EnemyData ar = GetComponent<EnemyData>(); // !!!
listSpawn = ar.GetDataEnemy();
Заменил, предупреждение моно пропало, но теперь после запуска скрипта
HTML5
1
2
NullReferenceException: Object reference not set to an instance of an object
Spawner.Update () (at Assets/Scripts/Spawner.cs:45)
сюда матерится
C#
1
foreach(var cse in listSpawn){
Добавлено через 1 минуту
Смысл в чём, есть класс который выстраивает последовательность появления enemy, далее эти данные передаются в Spawner и он уже их спавнит...
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 14:08
Лучший ответ Сообщение было отмечено Nebiros как решение

Решение

В класс Spawner добавь еще одно поле:
C#
1
public EnemyData enemyData;
перетащи туда свой пустой объект и уже с ним работай.
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 14:16  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
перетащи туда свой пустой объект и уже с ним работай.
сделал, ошибка та же, может теперь и массив по другому нужно получать?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
24.06.2020, 14:29
Боже, я уже не знаю как тебе объяснить... Это видео будет моим последним сообщением в этой теме...
https://youtu.be/29Taao_uNzA
1
 Аватар для Nebiros
41 / 40 / 16
Регистрация: 23.03.2010
Сообщений: 3,122
24.06.2020, 14:33  [ТС]
C#
1
listSpawn = enemyData.GetDataEnemy();
вот, фух...
Спасибо большое за помощь

Добавлено через 2 минуты
Цитата Сообщение от 1max1 Посмотреть сообщение
Боже, я уже не знаю как тебе объяснить...
Прошу прощения что так туплю, еще раз спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.06.2020, 14:33
Помогаю со студенческими работами здесь

Как передать в функцию несколько аргументов, и другие глупые вопросы
Доброго времени суток. Накопилось несколько вопросов, от простых до очень простых, и все же нужную информацию по ним не нашел. Глупо для...

Как получить из кода GameObject, прикреплённый к другому GameObject?
Суть- есть GameObject enemy, классика. Есть GameObject ObjectHandler, пустышка, чьё предназначение- носить на себе ссылки на все основные...

Передать несколько значений в качестве одного входящего параметра в табличную функцию
Привет всем! Нужно передать несколько значений в качестве одного входящего параметра в табличную функцию. На примере обычного...

Хочу передать в функцию несколько разнотипных массивов. Можно так делать?
Хочу передать в функцию несколько разнотипных массивов. Можно так делать? Надо в функцию чар. передать несколько разных аргументов. ...

Не получается передать ссылку в функцию при разделении кода на несколько файлов
В подключаемом файле parse.cpp находится функция и её объявление в parse.h int parse(Lexem &amp;lexer, In &amp;in) { int lev = 0;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru