Проблема с уникальностью копий префаба в редакторе [РЕШЕНО]

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Проблема с уникальностью копий префаба в редакторе [РЕШЕНО]

Сообщение VVM 23 ноя 2011, 20:51

Grids001.rar
Всем доброе время суток! Устал биться в одиночку ~x( [curved_hands] , прошу помощи. Есть префаб двери. Коробка, собственно дверь и скрипт, открывающий ее по нажатию "e". В сцене несколько дверей. Так вот, проблема в том, что подхожу к одной и тыкаю "е" (через триггер реализовано), открываются они все, одновременно. Двери расставлял и перетаскивая префаб драг&дропом, и через "Ctrl+D" в окне "иерархия".
Пробовал убрать ссылку копии на префаб (путем добавления компонента/чайлда).
Что делаю не так?

По форуму искал. В хелпе копался (http://unity3d.com/support/documentatio ... efabs.html). Ответа не нашел.
Юнька 3.4.2f3 Pro.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось VVM 24 ноя 2011, 12:14, всего редактировалось 1 раз.
Аватара пользователя
VVM
UNец
 
Сообщения: 47
Зарегистрирован: 16 сен 2011, 11:57
Откуда: Санкт-Петербург

Re: Проблема с уникальностью копий префаба в редакторе

Сообщение bomberest 23 ноя 2011, 20:57

Скрипты скинь
Основы Unity3D Свой 2D-движок Фильм для разработчиков Кастомизация едитора
Лекции игрового программирования
Skype: Andrewf56 | Steam: bomberest (-AnF-) | Vk: _https://vk.com/andrewshut
Аватара пользователя
bomberest
Старожил
 
Сообщения: 538
Зарегистрирован: 22 июн 2011, 14:38
Откуда: Минск
  • ICQ

Re: Проблема с уникальностью копий префаба в редакторе

Сообщение VVM 23 ноя 2011, 21:06

Там всего 1 небольшой:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Reshetka : MonoBehaviour {
       
    public GameObject resh;
        public GUISkin G;
               
        Vector3 vec;   
        public float moveSpeed = 0.03f;
        public float min;
        public float max;      
        float x, y, z;
        bool showMessage = false;
        bool openResh = false;
        string msg01 = "Press 'e' to activate";
       
        // Use this for initialization
        void Start () {        
                x = resh.transform.position.x;
                y = resh.transform.position.y;
                z = resh.transform.position.z;
        }
       
        void OnGUI()
        {
                GUI.skin = G;
                if (showMessage)       
                GUI.Label(new Rect(Screen.width / 2 - msg01.Length / 2, Screen.height / 2, 200, 20), msg01);
        }
       
        void OnTriggerStay()
        {
                if (!openResh)
                        showMessage = true;
                else
                        showMessage = false;           
        }
       
        void OnTriggerExit()
        {
                showMessage = false;           
        }
       
       
        void FixedUpdate () {          
                if (Input.GetKeyDown("e"))
                        openResh = true;
                if (openResh && resh.transform.position.y < max)
                {      
                        vec = new Vector3(x, y += moveSpeed, z);
                        resh.transform.position = vec; 
                        if (!audio.isPlaying)
                        {
                                audio.pitch = 1.0f + Random.Range(0.1f, 0.3f);
                                audio.Play();
                        }
                }
        }
}

 
Аватара пользователя
VVM
UNец
 
Сообщения: 47
Зарегистрирован: 16 сен 2011, 11:57
Откуда: Санкт-Петербург

Re: Проблема с уникальностью копий префаба в редакторе

Сообщение seaman 23 ноя 2011, 21:10

Что делаю не так?

Скрипт.
Кроме проверки на нажатие клавиши нужно делать проверку на расстояние до игрока, желательно на расположение двери перед игроком (а не позади).
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Проблема с уникальностью копий префаба в редакторе

Сообщение VVM 24 ноя 2011, 11:00

Скрипт.
Кроме проверки на нажатие клавиши нужно делать проверку на расстояние до игрока, желательно на расположение двери перед игроком (а не позади).


Спасибо. Проблем с реализацией нет, правильного поведения дверей можно добиться. Просто хотелось бы разобраться почему так происходит. Разобраться до конца в механизме.

Понятно, что префаб может контролировать свойства своих инстансов (копий в сцене), если есть активные ссылки между ними. И, получается, что я обращаюсь к своийствам именно инстанса. Например, я могу у любой копии изменить, к примеру, масштаб - и это не отразится на других копиях, так ведь? Или получается, что скрипт просто не различает одну копию от другой? Перебирает все объекты в сцене и работает с теми, которые подходят по параметрам? Ведь у каждой копии префаба есть своя копия скрипта, которая, по логике вещей, должна работать именно с этой копией... :-?
Аватара пользователя
VVM
UNец
 
Сообщения: 47
Зарегистрирован: 16 сен 2011, 11:57
Откуда: Санкт-Петербург

Re: Проблема с уникальностью копий префаба в редакторе

Сообщение IDoNotExist 24 ноя 2011, 11:44

VVM писал(а):И, получается, что я обращаюсь к своийствам именно инстанса. Или получается, что скрипт просто не различает одну копию от другой? Перебирает все объекты в сцене и работает с теми, которые подходят по параметрам? Ведь у каждой копии префаба есть своя копия скрипта, которая, по логике вещей, должна работать именно с этой копией... :-?

Так и есть каждая копия префаба в сцене - полностью самостоятельный объект у вас проблема в другом.
Вот что у вас написано:
Синтаксис:
Используется csharp
void FixedUpdate () {          
                if (Input.GetKeyDown("e"))
                        openResh = true;
                        ...
}
 

Это значит что каждый скрипт прикрепленной к каждой вашей решетке будет полностью самостоятельно ловить нажатие клавиши "e".
Кроме проверки на нажатие клавиши нужно делать проверку на расстояние до игрока, желательно на расположение двери перед игроком (а не позади).

А не легче ли прописать в OnTriggerStay() переменную (можно использовать ту же showMessage) которая будет разблочивать тот самый функционал который отвечает за нажатие кнопки "e", ибо вычислять расстояние до каждой двери это более ресурсозатратно.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1432
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Проблема с уникальностью копий префаба в редакторе

Сообщение VVM 24 ноя 2011, 11:59

void FixedUpdate () {
if (Input.GetKeyDown("e"))
openResh = true;
...
}


Это значит что каждый скрипт прикрепленной к каждой вашей решетке будет полностью самостоятельно ловить нажатие клавиши "e".


Все, понял в чем косяк. Спасибо. Необходимо и достаточно было перенести это:
Синтаксис:
Используется csharp
if (Input.GetKeyDown("e")) openResh = true;

в функцию OnTriggerStay(), теперь сообщение о нажатой клавише "е" отправляется только той решетке, в триггере которой стоит игрок, а не всем решеткам.

Всем спасибо!
Аватара пользователя
VVM
UNец
 
Сообщения: 47
Зарегистрирован: 16 сен 2011, 11:57
Откуда: Санкт-Петербург


Вернуться в Почемучка

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26