3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
1

Не работает поиск GameObject.FindGameObjectWithTag

04.05.2020, 19:32. Показов 2919. Ответов 18
Метки c#, unity (Все метки)

Author24 — интернет-сервис помощи студентам
Суть проблемы в том что такой поиск не работает если объект не на сцене.
C#
1
2
3
4
5
6
7
    private GameObject targetFollow;
    private Vector3 offset;
 
    private void Awake()
    {
        targetFollow = GameObject.FindGameObjectWithTag("Player");
    }
Он создаётся из ассетов. Как его найти там и прописать в переменную для инстантиэйта?
Находил какие то бубны про Resources.LoadAll() или создавать какието папки (уже всё создано
и разложено по папкам, осталось только достать) Resources.FindObjectsOfTypeAll тоже не понял
как пользоваться. Если есть простое решение напишите пожалуйста строкой кода.

Если targetFollow объявить public и у редакторе юнити просто перетащить то всё работает.
Как обойтись без этого?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2020, 19:32
Ответы с готовыми решениями:

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

Внутри GameObject создать новый GameObject
Как из скрипта (C#) внутри GameObject создать новый GameObject?

GameObject.renderer не работает
Вот скрипт, пытаюсь поменять цвет var newColor = Random.Range(0,...

Gameobject
1)Можно ли сделать Image и работать с ним, вместо gameobject. 2)Как уменьшить gameobject, как его...

18
3352 / 1768 / 1025
Регистрация: 26.10.2018
Сообщений: 5,197
04.05.2020, 19:50 2
Папка "Resources", туда кладешь префаб с именем "Prefab".
C#
1
var prefab = Resources.Load<GameObject>("Prefab");
0
3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
04.05.2020, 20:21  [ТС] 3
В префабах есть объект с именем Player. Как его достать ?
var prefab = Resources.Load<GameObject>("Путь к файлу или название объекта?");

Что нужно написать чтобы обратиться к нему как к объекту ?

Или в ассетах надо создать прямо папку Resources ?
0
3352 / 1768 / 1025
Регистрация: 26.10.2018
Сообщений: 5,197
04.05.2020, 20:23 4
Допустим префаб с именем Player лежит в папке Resources/Prefabs, тогда:
C#
1
var prefab = Resources.Load<GameObject>("Prefabs/Player");
0
3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
04.05.2020, 20:29  [ТС] 5
Не работает
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
05.05.2020, 12:50 6
Можно же просто создать паблик переменную типа GameObject и в инспекторе присвоить ей префаб. Потом эту переменную писать при создании объекта
0
3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
10.05.2020, 19:17  [ТС] 7
Можно. То есть нет никакого способа достать из ресурсов объект? Все до единого объекта надо свалить в сцену ?
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
10.05.2020, 19:22 8
Так сам префаб не должен быть на сцене. Он может лежать в папках, где твои текстуры, коды и т.д.

А если такое тебя всё равно не устраивает, то посмотри комент 1max1. Ты спрашивал на доли создавать папку Resources. Ответ да. Только название должно строго быть таким как он написал. Ели хочешь узнать об этом больше, посмотри документацию о Resources.Load
0
295 / 244 / 128
Регистрация: 24.12.2014
Сообщений: 708
10.05.2020, 19:55 9
Цитата Сообщение от Arbitr00 Посмотреть сообщение
Суть проблемы в том что такой поиск не работает если объект не на сцене.
Он и не должен искать объект чёрт знает где, кроме иерархии. Чтобы он нашел объект с тегом "Player", нужно создать сам объект в иерархии любым доступным способом (перетащить прямо в сцену; загрузить с ресурсов и создать).

1max1 сообщил Вам как найти объект в ресурсах. Не знаю что Вы там с этим кодом делаете, но создать и найти созданный объект можно так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Start : MonoBehavior {
 
    private void Awake()
    {
        var prefab = Resources.Load<GameObject>( "PlefabName" ); // объект "prefab" теперь можно создавать
        Instantiate<GameObject>( prefab, Vector3.zero, Quaternion.identity ); // создаём объект, теперь он виден в иерархии
 
        // ...
 
        var targetFollow = GameObject.FindGameObjectWithTag( "TagName" ); // поиск созданного объекта
        if( targetFollow != null ) {
            // targetFollow найден.
        }
 
 
    }
 
}
Найдёт при условии, что префаб "PlefabName" имеет тег "TagName".
0
3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
10.05.2020, 20:22  [ТС] 10
Я бы рад перетащить, да хрен получается.
Допустим я из префаба добавил объект в скрипт. Чтобы им управлять. №1
У него есть 4 системы частиц - №2
Перетаскивание частиц туда вручную с объекта №1 не работает. Типы соответствуют.
Более того у меня есть система частиц двигателя, которая такой же объект как и эти 4,
и она работает. Все объекты с которыми работаю имеют теги.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    private string[] tr = new string [] { "TrusterFR", "TrusterFL", "TrusterBR", "TrusterBL" }; // теги маневровых двигателей    
    private ParticleSystem [] Trusters = new ParticleSystem [4];    
    public GameObject [] TrustersObj = new GameObject [4];
    //private ParticleSystem [4] Trusters;
 
    // Start is called before the first frame update
    void Start()
    {
        // маневровые двигатели 
        for(int i =0; i < tr.Length; i++)
        {
            TrustersObj[i] = gameObject.transform.Find(tr[i]).gameObject;
            Trusters[i] = TrustersObj[i].GetComponent<ParticleSystem>();
        }
При обращении к ним пишет "NullReferenceException: Object reference not set to an instance of an object"
Миниатюры
Не работает поиск  GameObject.FindGameObjectWithTag  
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
10.05.2020, 20:33 11
Так вы в этом коде ищете префаб в папках или через паблик переменную перетягиваете?В этом коде ни того ни того не вижу
0
295 / 244 / 128
Регистрация: 24.12.2014
Сообщений: 708
10.05.2020, 21:00 12
Вы не ищите объекты по тегам в Вашем коде (transform.Find). Да и не нужны эти теги везде.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
/*
    private string[] tr = new string [] { "TrusterFR", "TrusterFL", "TrusterBR", "TrusterBL" }; // теги маневровых двигателей    
    private ParticleSystem [] Trusters = new ParticleSystem [4];    
    public GameObject [] TrustersObj = new GameObject [4];
*/
 
public ParticleSystem[] Trusters;
 
void Start() {
 
    //Trusters = GetComponents<ParticleSystem>();
 
}
В "Trusters" запихните частицы и сохраните префаб.
0
3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
10.05.2020, 21:10  [ТС] 13
К моему сожалению они давно уже там. Они в общем префабе плеера, являются его частью.
Или предлагаете их порвать на отдельные объекты?

Cliffster
Добавлено через 1 минуту
Вы правы, никак не притягиваю, в это и проблема. Если бы нашёл как это сделать, не написал бы сюда.
Поэтому прошу помочь если знаете как.
0
295 / 244 / 128
Регистрация: 24.12.2014
Сообщений: 708
10.05.2020, 21:15 14
Киньте проект. Мы так можем общаться очень долго Там сразу будет заметно что Вы пытаетесь сделать и как. А то на словах можно только догадываться )))
0
13 / 10 / 3
Регистрация: 01.01.2020
Сообщений: 85
10.05.2020, 21:16 15
https://docs.unity3d.com/Scrip... .Load.html

Это всё что я могу вам дать. Если у вас так и не получается достать префаб из папок, значит вы что-то делаете не так. Сверьте всё

wmysterio правильно говорит!
0
3352 / 1768 / 1025
Регистрация: 26.10.2018
Сообщений: 5,197
10.05.2020, 21:49 16
Цитата Сообщение от Arbitr00 Посмотреть сообщение
К моему сожалению они давно уже там. Они в общем префабе плеера, являются его частью.
Или предлагаете их порвать на отдельные объекты?
Нельзя загрузить часть внутри префаба (его ребенка), ты должен загрузить сначала весь префаб, а потом уже через GetChild взять то что надо.

Добавлено через 21 секунду
Или порезать на куски.
0
3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
11.05.2020, 06:34  [ТС] 17
Всем большое спасибо за ответы. У меня часовой пояс +7.
Сегодня буду пробовать всё что советовали сделать и прочитать.

1max1, я понял. у меня инстантиэтится корабль. Внутри него несколько систем частиц этих.
Буду пробовать.

отпишусь.
0
3 / 3 / 0
Регистрация: 02.12.2018
Сообщений: 58
17.05.2020, 15:16  [ТС] 18
В общем запихнул пока всё в кучу и пока работает.
Добираюсь таким образом:
drv = gameObject.transform.Find("Drive").gameObject;
DriveFire = drv.GetComponent<ParticleSystem>();

Через ресурсы кто то писал, пока ничег оне получилось, не понимаю как загрузить объект которого нет в иерархии потому что он там не нужен. (SetActive и без вариантов?) Если есть пример такой подгрузки было бы интересно посомтреть.
0
3352 / 1768 / 1025
Регистрация: 26.10.2018
Сообщений: 5,197
17.05.2020, 15:32 19
Посмотри видео про Resources там всё элементарно...
0
17.05.2020, 15:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.05.2020, 15:32
Помогаю со студенческими работами здесь

GameObject на gameObject
Подскажите как gameObejct поместить на другой gameObject программно.

Работа с gameObject
Доброго времени суток, в юнити не силен, изучать начал неделю назад. На этапе попыток создания...

Сериализовать GameObject
подскажите пожалуйста как сериализовать массив GameObjects?

Массив gameObject
Я создаю массив объектов gameObject fon На экране создаются эти обьекты и движуться вниз из трех...

gameObject.collider2d
Как правильно написать устаревшую команду if (gameObject.collider2D)

Удаление gameobject C#
Добрый вечер всем , хочу попросить помощи в написание скрипта сам скрипт: using...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru