OnTriggerEnter вызывается один раз, когда объект входит в триггер. Соответственно, все эти проверки выполняются единожды. Т.е. в одном кадре у объекта, вошедшего в триггер должен быть тэг player и должна быть нажата кнопка F. Первое условие может быть и соблюдено, если тэг правильно написан, но чтобы соблюсти второе, нужно одновременно с входом в триггер нажать кнопку F, что сделать сложно. Умники, конечно, посоветуют использовать OnTriggerStay, но не нужно этого делать. Нужно отделить ввод. Получится что-то типа этого:
private void OnTriggerEnter(Collider other)
{
if (other.TryGetComponent(out Player player))
{
PlayerInput.ActionButtonPressed += DoStuff;
}
}
private void OnTriggerExit(Collider other)
{
if (other.TryGetComponent(out Player player))
{
PlayerInput.ActionButtonPressed -= DoStuff;
}
}
private void DoStuff()
{
//Do stuff
}
В OnTriggerEnter проверяется, присутствует ли компонент Player на объекте. Именно компонент, а не тэг. Не нужно делать проверки по тэгу, т.к. это строки и ты можешь ошибиться в написании этой строки, делай проверки по наличию компонента. Если компонент имеется, то подписываем нужный метод на событие ActionButtonPressed. В OnTriggerExit, соответственно, отписываемся. И в OnDestroy тоже, если объект будет уничтожен. Отписываться нужно всегда.
И грубый пример PlayerInput ниже:
public class PlayerInput : MonoBehaviour
{
public static event Action ActionButtonPressed;
private void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
ActionButtonPressed?.Invoke();
}
}
}