Одна проблема заключается в том, что вы постоянно устанавливаете триггеры в каждом кадре. Это нужно делать только при нажатии клавиши.
Затем также Physics.CheckSphere
проверяет, есть ли какой-либо коллайдер в пределах диапазона. Это может быть любой коллайдер, а не только игрок. Чтобы убедиться, что это работает только в том случае, если игрок находится в пределах досягаемости, вы обязательно должны использовать Layers и дать игроку его собственный слой, например «Player». Затем вы можете передать параметр layerMask
, чтобы убедиться, что двери проверяют только слой игрока.
, поэтому я бы просто использовал
// if possible already reference this in the Inspector
[SerializeField] private Animator _animator;
[Tooltip("Here select only the Layer(s) which you assigned to your Player object(s)")]
[SerializeField] LayerMask _playerLayer;
private void Awake()
{
// as fallback get it ONCE on runtime
if(!_animator) _animator = GetComponent<Animator>();
}
private void Update()
{
// Afaik the Key is way cheaper to check so do it first
// and use physics only if actually necessary
if(Input.GetKeyDown(KeyCode.E))
{
// Only check for the Player's Layer and ignore other colliders
if(Physics.CheckSphere(transform.position, openRadius, _playerLayer.value))
{
ToggleDoorState();
}
}
}
// Since manually changing the flag in the Inspector will not have
// any effect anymore in order to be able to test it you can use
// the context menu of this component in the Inspector
[ContextMenu(nameof(ToggleDoorState))]
private void ToggleDoorState()
{
// invert the flag
doorIsOpen = !doorIsOpen;
// use the flag in ternary expressions
transform.position = doorIsOpen ? openPos.position : closedPos.position;
_animator.SetTrigger(doorIsOpen ? "OpenDoor" : "CloseDoor");
// use the value of the flag diectly
_animator.SetBool("DoorIsClosed", !doorIsOpen);
_animator.SetBool("DoorIsOpen", doorIsOpen);
}
Это немного похоже на то, как если бы вы иметь немного избыточности в вашем аниматоре. Я бы использовал либо Bools, чтобы инициировать переход, либо триггеры, чтобы оба варианта казались странными.