Сделать дверь в юнити2d
Хочу сделать калитку, открывающуюся на кнопку E, если дистанция от игрока до калитки меньше 1.5.
При открытии калитки должен поменяться спрайт, и отключиться компонент BoxCollider2D. На эту же кнопку калитка должна закрыться: BoxCollider2D включиться, а спрайт поменяться обратно.
Вот код двери:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorSetActive : MonoBehaviour
{
public void OpenDoor()
{
gameObject.SetActive(false);
}
public void CloseDoor()
{
gameObject.SetActive(true);
}
void Update()
{
}
}
А вот триггер нажатий:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DoorTriggerButton : MonoBehaviour
{
[SerializeField] private DoorSetActive door;
private void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
door.OpenDoor();
}
if (Input.GetKeyDown(KeyCode.G))
{
door.CloseDoor();
}
}
}
Ответы (1 шт):
Автор решения: Максим Фисман
→ Ссылка
Я точно помню, что уже такой вопрос задавался и я сам на него развернуто отвечал. Если получше погуглите, возможно, найдете его.
Главная проблема вашего вопроса в том, что вы не указали, что у вас не работает. Поэтому будем отталкиваться от нуля:
Используемые функции:
- Input.GetKeyDown(KeyCode key) - обрабатывает нажатие клавиши
- Vector3.Distance(Vector3 a, Vector3 b) - возвращает расстояние между a и b.
Возможный код:
[RequireComponent(typeof(SpriteRenderer))]
[RequireComponent(typeof(BoxCollider2D))]
[DisallowMultipleComponent]
publiс class Gate : MonoBehaviour
{
private const float OPENABLE_DISTANCE = 1.5f;
private bool isOpened;
private SpriteRenderer rend;
private BoxCollider2D collider;
[SerializeField] private Sprite OpenedGate, ClosedGate;
private void Awake () {
rend = GetComponent<SpriteRenderer>();
collider = GetComponent<BoxCollider2D>();
}
private void Update () {
if (Input.GetKeyDown(KeyCode.E)) {
float dist = Vector3.Distance(transform.position, Player.transform.position);
if (dist <= OPENABLE_DISTANCE) {
MoveGate(!isOpened);
}
}
}
private void MoveGate (bool open) {
if (open) {
rend.sprite = OpenedGate;
collider.enabled = false;
}
else {
rend.sprite = ClosedGate;
collider.enabled = true;
}
}
}
P.S. Где Player - ссылка на игрока