Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/47: Рейтинг темы: голосов - 47, средняя оценка - 4.83
109 / 50 / 14
Регистрация: 06.03.2012
Сообщений: 810
1

Найти на сцене префаб

19.06.2017, 21:06. Показов 8525. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть объект "Лампочка - Красная" и "Лампочка - Зелёная" при нажатии на кнопку необходимо чтоб "Лампочка - Красная" удалялась и на её месте создавался префаб "Лампочка - Зелёная", при повторном нажатии необходимо чтоб "Лампочка - Зелёная" удалялась, и на её месте создавался префаб "Лампочка - Красная".

Получается что-то вроде:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
if (open) { //
            if (!completed) {
                //GameObject On = GameObject.Find ("AllertOn");
                //GameObject Off = GameObject.Find ("AllertOff");
                //Instantiate(AllertOff, AllertOn.transform.position, Quaternion.identity);
                //Instantiate(AllertOff, On.transform.position, Quaternion.identity);
                //Destroy (On);
 
                completed = false;
            }               
        } else {
            if (!completed) {
                //GameObject On = GameObject.Find ("AllertOn");
                //GameObject Off = GameObject.Find ("AllertOff");
                //Не работает
                //Instantiate(AllertOn, AllertOff.transform.position, Quaternion.identity);
                //Instantiate(AllertOn,Off.transform.position, Quaternion.identity);
                //Destroy (Off);
 
                completed = false;
            }
        }
Но это не работает, если созданный префаб, не обозначен в скрипте как объект уже имеющийся на сцене... (Необходимо найти объект на сцене вручную и обратится к нему из скрипта, но как?!)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.06.2017, 21:06
Ответы с готовыми решениями:

Найти координаты щелчка мыши в 3D сцене (WebGL, Three.js)
Здравствуйте, форумчане! Помогите, пожалуйста, с решением вот такой вот задачи: Имеется...

Префаб
Здравствуйте! А существует ли какой-то класс префаба? То есть есть класс GameObject - он описывает...

Префаб в Unity2d
Есть префаб врага!Когда он умирает, нужно этот префаб заменить другим объектом!

Добавить префаб в скрипт
Есть компонент Скрипт в объекте, как добавить Префаб в этот компонент ?

12
C# Brain.net
35 / 35 / 7
Регистрация: 21.10.2012
Сообщений: 333
Записей в блоге: 12
19.06.2017, 23:31 2
Создай префаб и спрячь на сцене и через Find добавляй.
Или создай префаб и закинь его в скрипт.
0
11 / 11 / 3
Регистрация: 19.05.2015
Сообщений: 37
20.06.2017, 01:14 3
Как-то так.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
bool Enabled = false; // - красная лампочка, а true - зелёная
 
// сюда нада засунуть префарбы лампочек
public GameObject LightGreen; // зелёная
public GameObject LightRed; // красная
 
public void ChangeLight() { // функция изменения света
  if (Enabled == true) {
    GameObject On = GameObject.Find ("AllertOn"); // находим зелёную
    Instantiate(LightRed, On.transform.position, Quaternion.identity); // создаём красную
    Destroy (On); // удаляем зелёную
    Enabled = false; // отмечаем что изменили цвет на красный
  } else { // и наоборот
    GameObject Off = GameObject.Find ("AllertOff"); // находим красную
    Instantiate(LightGreen, Off.transform.position, Quaternion.identity); // создаём зелёную
    Destroy (Off); // удаляем красную
    Enabled = true; // отмечаем что изменили цвет на зелёный
  }
}
1
458 / 402 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
20.06.2017, 07:15 4
А зачем удалять и заново устанавливать? Не проще просто скрывать / показывать. Instatiate и destroy довольно затратные операции.
1
109 / 50 / 14
Регистрация: 06.03.2012
Сообщений: 810
20.06.2017, 12:37  [ТС] 5
Prog_maker, Ну дело в том, что помимо лампочек есть еще куча разных префабов, при создании которых на сцене происходит взаимодействие. А так, как их раньше на сцене небыло, или они были удалены, то к вновь созданным обратится было для меня невозможно.

Добавлено через 1 минуту
Prog_maker, ...взять тех же убитых монстриков.
0
458 / 402 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
20.06.2017, 13:19 6
Возможно есть возможность изменить саму логику. Что то как то сильно сложно у вас все организовано.
0
195 / 115 / 30
Регистрация: 05.08.2013
Сообщений: 491
20.06.2017, 14:46 7
А не проще у ОДНОЙ лампочки менять цвет света/текстуры?
0
109 / 50 / 14
Регистрация: 06.03.2012
Сообщений: 810
20.06.2017, 18:17  [ТС] 8
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());
так же возникала ошибка на этой комманде.
0
109 / 50 / 14
Регистрация: 06.03.2012
Сообщений: 810
20.06.2017, 18:26  [ТС] 9
lexa_30, Ну вот... Сделал так:
C#
1
Debug.Log("Найден объект" + On);
...а то, что 1700.... ошибок, так там тоже необходим поиск созданного префаба на сцене. Так что пока с этим не разберусь, то так же не решить)))
Миниатюры
Найти на сцене префаб  
0
109 / 50 / 14
Регистрация: 06.03.2012
Сообщений: 810
20.06.2017, 18:56  [ТС] 10
И вот еще ошибка....
G:\Projects\...\Assets\Scripts\NextScene.cs(36,36): Warning CS0618: "UnityEngine.Application.LoadLevel(string)" является устаревшим: "Use SceneManager.LoadScene" (CS0618) (Assembly-CSharp)

Добавлено через 22 минуты
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
public void ChangeLight() { // функция изменения света
        if (Enabled == true) {
                try {
                    GameObject Off = GameObject.Find ("AlertOff"); // находим зелёную
                    Instantiate(LightRed, Off.transform.position, Quaternion.identity); // создаём красную
                    Destroy (Off); // удаляем зелёную
                    Enabled = false; // отмечаем что изменили цвет на красный
                }
                catch {
                    GameObject Off = GameObject.Find ("AlertOff(Clone)"); // находим зелёную
                    Instantiate(LightRed, Off.transform.position, Quaternion.identity); // создаём красную
                    Destroy (Off); // удаляем зелёную
                    Enabled = false; // отмечаем что изменили цвет на красный
                }
        } else { // и наоборот
            try {
                GameObject On = GameObject.Find ("AlertOn"); // находим красную
                Instantiate(LightGreen, On.transform.position, Quaternion.identity); // создаём зелёную
                Destroy (On); // удаляем красную
                Enabled = true; // отмечаем что изменили цвет на зелёный
            }
            catch {
                GameObject On = GameObject.Find ("AlertOn(Clone)"); // находим красную
                Instantiate(LightGreen, On.transform.position, Quaternion.identity); // создаём зелёную
                Destroy (On); // удаляем красную
                Enabled = true; // отмечаем что изменили цвет на зелёный
            }
        }
    }
0
11 / 11 / 3
Регистрация: 19.05.2015
Сообщений: 37
20.06.2017, 20:35 11
Лучший ответ Сообщение было отмечено Jylik как решение

Решение

Ты видимо пока не совсем шариш.
Кода много лишнего.
Можно уменьшить код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public void ChangeLight() { // функция изменения света
        if (Enabled == true) {
            GameObject Off = null;
            try { Off = GameObject.Find ("AlertOff"); } // находим зелёную
            catch { Off = GameObject.Find ("AlertOff(Clone)"); } // находим зелёную
            Instantiate(LightRed, Off.transform.position, Quaternion.identity); // создаём красную
            Destroy (Off); // удаляем зелёную
            Enabled = false; // отмечаем что изменили цвет на красный
        } else { // и наоборот
            GameObject On = null;
            try { On = GameObject.Find ("AlertOn"); } // находим красную
            catch { On = GameObject.Find ("AlertOn(Clone)"); } // находим красную
            Instantiate(LightGreen, On.transform.position, Quaternion.identity); // создаём зелёную
            Destroy (On); // удаляем красную
            Enabled = true; // отмечаем что изменили цвет на зелёный
        }
    }
p.s. Я написал тебе в самом начале примерный метод. Очевидно, что тебе необходимо самостоятельно подогнать его под свой проект.

Добавлено через 7 минут
Ещё короче
C#
1
2
3
4
5
6
7
8
public void ChangeLight() { // функция изменения света
  string Name = (Enabled ? "AlertOff" : "AlertOn");
  GameObject Light = null;
  try { Light = GameObject.Find (Name ); } catch { Light = GameObject.Find (Name + "(Clone)"); } // находим
  Instantiate( (Enabled ? LightRed : LightGreen), Light.transform.position, Quaternion.identity); // создаём
  Destroy (Light); // удаляем
  Enabled = (Enabled ? false : true); // отмечаем
}
1
458 / 402 / 153
Регистрация: 23.01.2011
Сообщений: 1,054
20.06.2017, 20:44 12
Jylik, давайте пока код опустим. Расскажите нам доступным языком, что вы хотите СДЕАЛАТЬ? Желательно по подробнее.

Добавлено через 39 секунд
Кроме лампочек ... ))))
0
109 / 50 / 14
Регистрация: 06.03.2012
Сообщений: 810
21.06.2017, 11:18  [ТС] 13
Prog_maker, это секретная информация.
0
21.06.2017, 11:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2017, 11:18
Помогаю со студенческими работами здесь

Вставка контента в префаб
Здравствуйте, форумчане. Есть несколько префабов (Panel), которые создаются посредством...

Префаб через скрипт
Как создать префаб не в редакторе, а во времы выполнения скрипта (т.е. в самом скрипте C#)?

Как удалить префаб со сцены?
Решил сделать монетки в виде префаба, как отдельные GameObject'ы они удаляются, а вот в виде...

Создать префаб из удаленного объекта
Доброго времени суток, в общем, при загрузке объекта (куба) из c4d в формате fbx (в любом другом...


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

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