Пытаюсь сделать взаимодействие игрока с дверью. При приближении закрытая дверь подсвечивается, а при нажатии на клавишу открывается и становится недоступной для взаимодействия.
Реализовано с помощью манипулирования со слоями. Т.е. есть 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;
}
}
}
{
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;
}
}
}