using System.Collections.Generic;
using UnityEngine;
public class TriggerDoorController : MonoBehaviour
{
public GameObject hud;
public GameObject hud2;
[SerializeField] private Animator myDoor = null;
[SerializeField] private bool openTrigger = false;
[SerializeField] private bool closeTrigger = false;
[SerializeField] private string doorOpen = "OpenRight";
[SerializeField] private string doorClose = "DoorClose";
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
hud.SetActive(true);
if (Input.GetKeyDown(KeyCode.E))
{
hud2.SetActive(true);
}
}
}
}`
Witam.
Pracuje w unity i mam problem z drzwiami chciałbym żeby nie otwierały się automatycznie tyko wtedy gdy nacisnę E i tylko w okolicznościach gdzie gracz będzie stał na triggerze ale nie wiem jak, ktoś wie? (Problem w tym że jak klikam E to nic się nie dzieje. Prosiłbym też o proste wytłumaczenie, ponieważ jestem nowy w temacie programowania i dopiero się uczę.
Ten kod wykona się tylko w zdarzeniu OnTriggerEnter
. Twoja logika mówi że ma coś zrobić gdy gracz wejdzie na trigger z wciśniętym klawiszem E. Potem już klawisz nie jest sprawdzany. Prawdopodobnie chcesz sprawdzać klawisz E w każdej klatce - OnUpdate, za to w OnTriggerEnter możesz sobie tylko gdzieś na boku zapisać że player jest w zasięgu triggera
https://answers.unity.com/questions/554003/check-if-player-is-colliding-with-a-trigger.html
Możesz też zapewne sprawdzić klawisz w OnTriggerStay
obscurity napisał(a):
Możesz też zapewne sprawdzić klawisz w
OnTriggerStay
Nie, nie powinien tego robić w OnTriggerStay bo OnTriggerStay nie jest wywoływane w każdej klatce więc czasem mogłoby nie zadziałać.
Dodatkowe wytłumaczenie.
OnTriggerEnter wywołuje się w jednej klatce w momencie zderzenia 2 colliderów gdzie co najmniej jeden ma zaznaczone isTrigger.
Input.GetKeyDown również wykonuje się tylko w jednej klatce (tj, zwraca wartość true tylko w klatce w której zostało wciśnięte)
Żeby Twój kod zadziałał musiałbyś wcisnąć "E" dokładnie w tej samej klatce w której dochodzi do kolizji.
OnTriggerStay z kolei wykonuje się niemal w każdej klatce podczas kolizji, po wywołaniu OnTriggerEnter
Tak jak obscurity mówi, powinieneś sprawdzać Input w Update i w trigger możesz przestawiać np. boola który powie ci czy znajdujesz się w zasięgu drzwi.
Ogólnie polecam odpowiedzialnością za tego typu rzeczy jak otwieranie drzwi obarczyć playera, a nie drzwi. Będziesz miał mniej MonoBehaviourów na scenie (lepsza wydajność) i łatwiej będzie tym zarządzać z jednego miejsca.
Dziękuję wszystkim za pomoc problem rozwiązany :)