Unity как найти объект в префабе

Как получить объект находящийся в префабе?

Как получить объект находящийся в префабе?

Есть префаб, в нем есть террейн, собственно как мне получить этот террейн для работы с ним в скрипте, т.е. он ведь является частью префаба, но как к нему обратится?

Аватара пользователя
Baisangur
UNец
 
Сообщения: 39
Зарегистрирован: 05 июн 2009, 17:18
Откуда: Казахстан

Re: Как получить объект находящийся в префабе?

Сообщение Neodrop 03 ноя 2009, 20:02

Terrain terr = myPrefab.GetComponent<Terrain>();

Ваш префаб, для программы просто GameObject. Так что получать из него что-то нужно теми же методами, что и из GO

Добавить neodrop в Skype

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

Аватара пользователя
Neodrop
Админ
 
Сообщения: 8464
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Как получить объект находящийся в префабе?

Сообщение Zaicheg 03 ноя 2009, 20:34

Речь идёт, я так понимаю, об обращении к ассету, а не к инстансу.

Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Как получить объект находящийся в префабе?

Сообщение Neodrop 03 ноя 2009, 20:36

К Ассету можно обратиться только через Editor классы и только в Редакторе.
Но принцип тот же самый.

Добавить neodrop в Skype

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

Аватара пользователя
Neodrop
Админ
 
Сообщения: 8464
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Как получить объект находящийся в префабе?

Сообщение Zaicheg 03 ноя 2009, 23:31

А что конкретно ты с этим террейном хочешь сделать?

Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Как получить объект находящийся в префабе?

Сообщение lilu 04 ноя 2009, 10:04

Neodrop писал(а):Terrain terr = myPrefab.GetComponent<Terrain>();

Neodrop, у Вас здесь синтаксис неправильный.
Надо так

Terrain terr = (Terrain)myPrefab.GetComponent(«Terrain»);

Аватара пользователя
lilu
UNец
 
Сообщения: 4
Зарегистрирован: 02 ноя 2009, 12:50

Re: Как получить объект находящийся в префабе?

Сообщение Neodrop 04 ноя 2009, 10:08

Я очень польщён вниманием к моему синтаксису. :ymsmug:
Читайте справку. :-B
Естественно, по версии 2.6

Вероятно, вы будете удивлены, но можно ещё и так :

Terrain terr = myPrefab.GetComponent(typeof(Terrain)) as Terrain;

И так :

Terrain terr = myPrefab.GetComponentInChildren<Terrain>();
Terrain terr = myPrefab.GetComponentInChildren(typeof(Terrain)) as Terrain;
Terrain terr = myPrefab.GetComponentInChildren(«Terrain») as Terrain;

Добавить neodrop в Skype

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

Аватара пользователя
Neodrop
Админ
 
Сообщения: 8464
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Как получить объект находящийся в префабе?

Сообщение lilu 04 ноя 2009, 10:41

Neodrop писал(а):Terrain terr = myPrefab.GetComponent(typeof(Terrain)) as Terrain;

нет не удивлена. привела один из возможных вариантов.
что касается оператора as, то более грамотное написание, это всё-таки приведение через (Terrain)…
as надо использовать в редких случаях, так как при неправильном приведении оператор as выдаст null, а не Exception, а потом ищи ветра в поле, где была допущена ошибка.

что касается 2.6, признаюсь, что не читала :) хотя с первого взгляда, возникает ощущение, что …<Terrain>() возвратит генерик-лист, а не один экзепляр, поэтому Ваше первое выражение и смутило. Если это не так, то приношу свои извенения.
Обязательно почитаю и уточню, спасибо ;)

Аватара пользователя
lilu
UNец
 
Сообщения: 4
Зарегистрирован: 02 ноя 2009, 12:50

Re: Как получить объект находящийся в префабе?

Сообщение Neodrop 04 ноя 2009, 12:15

Вот это уже интересный ответ. Видимо вы получите пальму первенства на нашем портале, как первая девушка-программист. :ymparty:

Использование приведения через as для меня гораздо более оправдано. (тип) я практически никогда не использую, потому что получение экцепшина вместо null почти всегда равно падению броузера для WEB композиций. Куда проще проверить на null, чем рисковать работоспособностью приложения.

Приятно познакомиться. Надеюсь вы украсите наше сообщество. Рекомендую присоединиться к нашим [skype me!] чатам.

Добавить neodrop в Skype

Изображение
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.

Аватара пользователя
Neodrop
Админ
 
Сообщения: 8464
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Как получить объект находящийся в префабе?

Сообщение lilu 04 ноя 2009, 20:07

;;) спасибо за приглашение

Аватара пользователя
lilu
UNец
 
Сообщения: 4
Зарегистрирован: 02 ноя 2009, 12:50

Re: Как получить объект находящийся в префабе?

Сообщение Baisangur 07 ноя 2009, 14:23

Спасибо за помощь господа, все работает как нужно .

Аватара пользователя
Baisangur
UNец
 
Сообщения: 39
Зарегистрирован: 05 июн 2009, 17:18
Откуда: Казахстан


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 8



У меня есть prefab:

введите сюда описание изображения

Мне надо обратиться к Terrain(«0000») лежащим в этом prefab. Чтоб работать с Terrain(«0000») в «Prefab For Editing Mode»(режим работы с префабом). Программно например нарисовать дорогу или разместить деревья в Prefab в режиме «Prefab For Editing Mode», Когда открываем префаб. То есть мы в коде открываем префаб и сразу выполняем код который отрисовывает дорогу. И в результате при открытии видим изменённый префаб.

задан 1 дек 2019 в 18:31

Ivan Triumphov's user avatar

Ivan TriumphovIvan Triumphov

1,1081 золотой знак14 серебряных знаков37 бронзовых знаков

GameObject PrefabObj = Resource.Load<GameObject>("path");

PrefabObj не объект сцены, а ссылка на твой префаб. Только я не знаю сохранятся ли изменения в префабе, я так обычно цвет материалов меняю глобально.

ответ дан 6 дек 2019 в 15:02

Yaroslav's user avatar

YaroslavYaroslav

6,4183 золотых знака6 серебряных знаков25 бронзовых знаков

3

    if (prefabEditingBool)
    {
        OpenPrefabForEditing(tempPrefab);
        GameObject instance = (GameObject) tempPrefab;
        Terrain tempTerrain = instance.GetComponentInChildren<Terrain>() as Terrain;
        // Debug.Log(tempTerrain.name);
        List<Terrain> ListPrefabTerrain = new List<Terrain>();
        ListPrefabTerrain.Add(tempTerrain);
        moduleSettings settTerr = new moduleSettings();
        settTerr.DeletTrees(ListPrefabTerrain);
        settTerr.TerrainTexturing(ListPrefabTerrain);
    }

ответ дан 9 дек 2019 в 9:20

Ivan Triumphov's user avatar

Ivan TriumphovIvan Triumphov

1,1081 золотой знак14 серебряных знаков37 бронзовых знаков

Prog_maker, Я первый раз делаю продуманную игру на Юнити))

Добавлено через 1 минуту
dr_Morro, Вероятно проще будет, если вы опишите на примере, как это организовать (Но к моему сожалению этот принцип необходим не только к лампочкам, но и к системе повреждений и счету очков и прочим вещам на моей сцене, которые создаются из Префабов и прямой ссылки не имеют.)

Добавлено через 30 минут
lexa_30, ммм…. Не работает. Вот смотри полный скрипт. И все работает, кроме этих лампочек)))

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
38
39
40
41
42
43
44
45
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CompButt1 : MonoBehaviour {
 
    //Объекты дверей
    public GameObject Door1,Door2,Door3;
 
    // сюда нада засунуть префарбы лампочек
    public GameObject LightGreen; // зелёная
    public GameObject LightRed; // красная
 
    bool Enabled = false; // - красная лампочка, а true - зелёная
    // Use this for initialization
 
    void OnMouseDown() {
        //Анимация нажатия
        gameObject.GetComponent<Zastava> ().FunctionOpen ();
 
        //Меняет лампочки (Если есть красная, удаляет. Создает зеленную, и наоборот.)
        ChangeLight();
 
        //Открывает запертые двери
        Door1.GetComponent<Zastava> ().FunctionOpen ();
        Door2.GetComponent<Zastava> ().FunctionOpen ();
        Door3.GetComponent<Zastava> ().FunctionOpen ();
 
 
    }
 
    public void ChangeLight() { // функция изменения света
        if (Enabled == true) {
            GameObject Off = GameObject.Find ("AllertOff"); // находим зелёную
            Instantiate(LightRed, Off.transform.position, Quaternion.identity); // создаём красную
            Destroy (Off); // удаляем зелёную
            Enabled = false; // отмечаем что изменили цвет на красный
        } else { // и наоборот
            GameObject On = GameObject.Find ("AllertOn"); // находим красную
            Instantiate(LightGreen, On.transform.position, Quaternion.identity); // создаём зелёную
            Destroy (On); // удаляем красную
            Enabled = true; // отмечаем что изменили цвет на зелёный
        }
    }
}

До того, как действие поднял над открытием дверей, работали и они. А вот собственно и инфо об ошибке:
NullReferenceException: Object reference not set to an instance of an object
CompButt1.ChangeLight () (at Assets/Scripts/CompButt1.cs:40)
CompButt1.OnMouseDown () (at Assets/Scripts/CompButt1.cs:22)
UnityEngine.SendMouseEventsoSendMouseEvents(Int32)

Добавлено через 16 минут
lexa_30, Тоесть как я понял позиция:

C#
1
         Instantiate(LightGreen, On.transform.position, Quaternion.identity); // создаём зелёную

Неработает, так как объект «On» пуст. Или имеет неизвестный формат. Так как писал

C#
1
Debug.Log("Найден объект" + On.ToString());

так же возникала ошибка на этой комманде.

I think the problem is that the prefab can not see instantiated objects that are already in the scene. A way to think about this is: What would your game do if it instantiated the prefab in a scene without that other asset, even though you linked it in the prefab? «Well, I’m not going to do that though» is not a good excuse to the Unity Editor, for what reason I don’t know.

My preferred method to get around this is to add a reference to the object at run-time. Depending on what you are working on, it might be as simple as:

//On the Gameobject in the scene
public void Start(){//you can use start, awake, or other event as needed
    OtherComponentClassOfPrefab.staticSetupMethod(this.gameobject);//using a static method to pass this reference to other class.
}


//On the Prefab that uses the other object in the scene
public static staticSetupMethod(GameObject go){
    go.Stuff();//do stuff to go, or store it for later use.
}

Again, depending on your setup, if a singleton works for you then you can pass the reference to the instantiated prefab directly through that. And if not, a variation of the above will go pretty far if you are creative enough with it. Hope that helps!

Добрый день, только начинаю изучать Unity.
Дано:
Игровые объекты (шашки) с одним и тем же скриптом.
Префаб в виде зеленого квадрата (он показывает куда можно сходить).
Пустой объект с скриптом, в котором записываются глобальные переменные.
638db25cbcf80019021913.png
В скрипте global есть переменная, в которую записывается игровой объект (в моем случае, при нажатии на шашку, в эту переменную передается эта самая шашка) для дальнейшей работы с этим объектом в других скриптах.

public class global : MonoBehaviour
{
    public GameObject checkername = null;
}

Передается так:

[SerializeField] private global _global;

    void OnMouseDown(){
        _global.checkername = gameObject;
        Debug.Log(_global.checkername);

В этом случае, я могу к скрипту на объекте прикрепить ссылку на пустой объект global.
В случае же с префабом, я туда не могу прикрепить нужные мне игровой объект по умолчанию.
638db3821d5f2263905987.png
Как мы видим на скрине, там пусто.
Так вот, как мне сделать так, чтобы в эту переменную [SerializeField] private global _global; передавался по умолчанию игровой объект global?

UPD: Как реализовать передачу кодом в скрипте?

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как составить друга смотреть
  • Как найти работу трудоустройство
  • Кулинарион кунцево плаза как найти
  • Почему горчит квашеная капуста домашняя как исправить
  • Pnp detected fatal error windows 10 как исправить

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии