Как получить объект находящийся в префабе?
Как получить объект находящийся в префабе?
Есть префаб, в нем есть террейн, собственно как мне получить этот террейн для работы с ним в скрипте, т.е. он ведь является частью префаба, но как к нему обратится?
-
Baisangur - UNец
- Сообщения: 39
- Зарегистрирован: 05 июн 2009, 17:18
- Откуда: Казахстан
Re: Как получить объект находящийся в префабе?
Neodrop 03 ноя 2009, 20:02
Terrain terr = myPrefab.GetComponent<Terrain>();
Ваш префаб, для программы просто GameObject. Так что получать из него что-то нужно теми же методами, что и из GO
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || 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 классы и только в Редакторе.
Но принцип тот же самый.
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || 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
Я очень польщён вниманием к моему синтаксису.
Читайте справку.
Естественно, по версии 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;
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || 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
Вот это уже интересный ответ. Видимо вы получите пальму первенства на нашем портале, как первая девушка-программист.
Использование приведения через as для меня гораздо более оправдано. (тип) я практически никогда не использую, потому что получение экцепшина вместо null почти всегда равно падению броузера для WEB композиций. Куда проще проверить на null, чем рисковать работоспособностью приложения.
Приятно познакомиться. Надеюсь вы украсите наше сообщество. Рекомендую присоединиться к нашим чатам.
«Спасибо!» нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || 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 TriumphovIvan Triumphov
1,1081 золотой знак14 серебряных знаков37 бронзовых знаков
GameObject PrefabObj = Resource.Load<GameObject>("path");
PrefabObj не объект сцены, а ссылка на твой префаб. Только я не знаю сохранятся ли изменения в префабе, я так обычно цвет материалов меняю глобально.
ответ дан 6 дек 2019 в 15:02
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 TriumphovIvan Triumphov
1,1081 золотой знак14 серебряных знаков37 бронзовых знаков
Prog_maker, Я первый раз делаю продуманную игру на Юнити))
Добавлено через 1 минуту
dr_Morro, Вероятно проще будет, если вы опишите на примере, как это организовать (Но к моему сожалению этот принцип необходим не только к лампочкам, но и к системе повреждений и счету очков и прочим вещам на моей сцене, которые создаются из Префабов и прямой ссылки не имеют.)
Добавлено через 30 минут
lexa_30, ммм…. Не работает. Вот смотри полный скрипт. И все работает, кроме этих лампочек)))
C# | ||
|
До того, как действие поднял над открытием дверей, работали и они. А вот собственно и инфо об ошибке:
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# | ||
|
Неработает, так как объект «On» пуст. Или имеет неизвестный формат. Так как писал
C# | ||
|
так же возникала ошибка на этой комманде.
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.
Дано:
Игровые объекты (шашки) с одним и тем же скриптом.
Префаб в виде зеленого квадрата (он показывает куда можно сходить).
Пустой объект с скриптом, в котором записываются глобальные переменные.
В скрипте global есть переменная, в которую записывается игровой объект (в моем случае, при нажатии на шашку, в эту переменную передается эта самая шашка) для дальнейшей работы с этим объектом в других скриптах.
public class global : MonoBehaviour
{
public GameObject checkername = null;
}
Передается так:
[SerializeField] private global _global;
void OnMouseDown(){
_global.checkername = gameObject;
Debug.Log(_global.checkername);
В этом случае, я могу к скрипту на объекте прикрепить ссылку на пустой объект global.
В случае же с префабом, я туда не могу прикрепить нужные мне игровой объект по умолчанию.
Как мы видим на скрине, там пусто.
Так вот, как мне сделать так, чтобы в эту переменную [SerializeField] private global _global;
передавался по умолчанию игровой объект global?
UPD: Как реализовать передачу кодом в скрипте?