Проблемы с префабами.(Решено)

Программирование на Юнити.

Проблемы с префабами.(Решено)

Сообщение Akslm 17 май 2019, 17:33

Здравствуйте.
Пытаюсь сделать взаимодействие игрока с дверью. При приближении закрытая дверь подсвечивается, а при нажатии на клавишу открывается и становится недоступной для взаимодействия.
Реализовано с помощью манипулирования со слоями. Т.е. есть 3 спрайта открытой(opened), закрытой(closed) и подсвеченной двери(backlight), в зависимости от события происходит их вытягивание из под слоя либо сокрытие. Все они находятся на родительском объекте Door(является префабом), на котором висит скрипт для обработки событий, BoxCollider2D(триггер) и CapsuleCollider2D(чтобы игрок не прошёл сквозь дверь раньше времени).
При наличии на сцене более одного префаба приоритет отдаётся тому у кого выше позиция. Соответственно всё работает не так как надо, т.е. работает правильно только тот который в приоритете.
Подскажите как сделать каждый префаб уникальным, но с одним универсальным кодом. Дверей может быть много и создавать под каждую свой скрипт и уникальные имена или теги очень не хочется.
Может совершенно иной подход есть, я новичок и многого не знаю. Заранее спасибо.
Изображение

Вот сам код:
Синтаксис:
Используется csharp
public class door : MonoBehaviour
{
    TilemapRenderer _opened, _closed, _backlight;
    bool isOpened = false;
    CapsuleCollider2D doorColliderBlock;

    void Start()
    {
        GameObject o_opened = GameObject.FindGameObjectWithTag("opened");
        GameObject o_closed = GameObject.FindGameObjectWithTag("closed");
        GameObject o_backlight = GameObject.FindGameObjectWithTag("backlight");
        _opened = o_opened.GetComponentInChildren<TilemapRenderer>();
        _closed = o_closed.GetComponentInChildren<TilemapRenderer>();
        _backlight = o_backlight.GetComponentInChildren<TilemapRenderer>();
        doorColliderBlock = GetComponentInChildren<CapsuleCollider2D>();
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Player") && !isOpened)
        {
            _backlight.sortingOrder = 9;
            _closed.sortingOrder = 0;
        }
    }

    private void OnTriggerStay2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Player") && Input.GetKeyDown(KeyCode.E) && !isOpened)
        {
            isOpened = true;
            _backlight.sortingOrder = 0;
            _closed.sortingOrder = 0;
            _opened.sortingOrder = 9;
            doorColliderBlock.isTrigger = true;
        }

    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Player") && !isOpened)
        {
            _backlight.sortingOrder = 0;
            _closed.sortingOrder = 8;
        }
    }
}
 
Последний раз редактировалось Akslm 17 май 2019, 22:39, всего редактировалось 1 раз.
Akslm
UNец
 
Сообщения: 15
Зарегистрирован: 17 май 2019, 16:48

Re: Проблемы с префабами.

Сообщение AngryCat 17 май 2019, 19:47

Синтаксис:
Используется csharp
        GameObject o_opened = GameObject.FindGameObjectWithTag("opened");
        GameObject o_closed = GameObject.FindGameObjectWithTag("closed");
        GameObject o_backlight = GameObject.FindGameObjectWithTag("backlight");
Этот код будет искать только одну дверь с нужным тэгом. Для того, чтобы скрипт искал все двери нужно в конце добавить 's' :
Синтаксис:
Используется csharp
GameObject[] o_opened = GameObject.FindGameObjectsWithTag("opened");
        GameObject[] o_closed = GameObject.FindGameObjectsWithTag("closed");
        GameObject[] o_backlight = GameObject.FindGameObjectsWithTag("backlight");
После этого у тебя в массиве будут все двери. Тебе остается только найти нужную.
Скрытый текст:
Чесно говоря, я бы делал совсем иначе)
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Проблемы с префабами.

Сообщение Akslm 17 май 2019, 20:46

Сделал проще. Просто вешаю на скрипт нужные объекты с спрайтами.
Но всё равно большое спасибо за ответ. А как бы вы сделали? В двух словах если не затруднит.
Изображение
Синтаксис:
Используется csharp
public class door : MonoBehaviour
{
    public TilemapRenderer _opened, _closed, _backlight;
    bool isOpened = false;
    CapsuleCollider2D doorColiderBlock;
    AudioSource objAudio;

    void Start()
    {
        doorColiderBlock = GetComponentInChildren<CapsuleCollider2D>();
         objAudio = GetComponentInChildren<AudioSource>();
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Player") && !isOpened)
        {
            _backlight.sortingOrder = 9;
            _closed.sortingOrder = 0;
        }
    }

    private void OnTriggerStay2D(Collider2D collision)
    {

        if (collision.gameObject.CompareTag("Player") && Input.GetKeyDown(KeyCode.E) && !isOpened)
        {
            isOpened = true;
            _backlight.sortingOrder = 0;
            _closed.sortingOrder = 0;
            _opened.sortingOrder = 9;
            doorColiderBlock.isTrigger = true;
            objAudio.PlayOneShot(objAudio.clip);
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.CompareTag("Player") && !isOpened)
        {
            _backlight.sortingOrder = 0;
            _closed.sortingOrder = 8;
        }
    }
}
 
Akslm
UNец
 
Сообщения: 15
Зарегистрирован: 17 май 2019, 16:48

Re: Проблемы с префабами.

Сообщение AngryCat 17 май 2019, 21:50

Я бы сделал, чтоб из камеры вылетал рейкаст и проверял наличие дверей. Если дверь была обнаружена, то она бы загоралась, и при нажатии на кнопку открывалась! Если интересует могу подробнее описать. P.S Если игра в 2d или доступ к дверям нельзя проверять при помощи рейкастов, то на помощь придут триггеры !
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Проблемы с префабами.

Сообщение AngryCat 17 май 2019, 21:52

Хотя, то что вы сделали во второй раз уже больше смахивает на приличный код)
Здесь могла бы быть ваша реклама.
Аватара пользователя
AngryCat
Старожил
 
Сообщения: 716
Зарегистрирован: 20 июл 2018, 22:29
Skype: Дискорд - Флеш#4099

Re: Проблемы с префабами.

Сообщение Akslm 17 май 2019, 22:37

AngryCat писал(а):Я бы сделал, чтоб из камеры вылетал рейкаст и проверял наличие дверей. Если дверь была обнаружена, то она бы загоралась, и при нажатии на кнопку открывалась! Если интересует могу подробнее описать. P.S Если игра в 2d или доступ к дверям нельзя проверять при помощи рейкастов, то на помощь придут триггеры !

Да, игра в 2D, первый проект. Триггеры уже использую. Спасибо.
Akslm
UNец
 
Сообщения: 15
Зарегистрирован: 17 май 2019, 16:48


Вернуться в Скрипты

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

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