Событие вызывается только в том классе, где оно было объявлено, извне его вызывать нельзя. Подписываться на события нужно извне.
using System;
using UnityEngine;
public class PlayerInput : MonoBehaviour
{
public static event Action ActionButtonPressed;
public static event Action<float> MovementDirectionChanged;
private void Update()
{
if (Input.GetKeyDown(KeyCode.F))
{
ActionButtonPressed?.Invoke(); // Invoke можно вызвать только в классе, в котором ивент объявлен, извне его вызвать нельзя
}
var direction = Input.GetAxis("Horizontal");
MovementDirectionChanged?.Invoke(direction);
}
}
Здесь есть два ивента ActionButtonPressed
и MovementDirectionChanged
. Первый вызывается, когда нажата кнопка F, второй при каждом изменении горизонтальной оси. Вызывается событие, собственно, через метод Invoke
.
Далее есть класс, который будет подписывать свои методы на это событие:
public class Dummy : MonoBehaviour
{
private void OnEnable()
{
PlayerInput.ActionButtonPressed += DoStuff; // += Move нельзя, т.к. сигнатура метода не совпадает
PlayerInput.MovementDirectionChanged += Move;
}
private void OnDisable()
{
PlayerInput.ActionButtonPressed -= DoStuff;
PlayerInput.MovementDirectionChanged -= Move;
}
private void DoStuff()
{
//DoStuff
}
private void Move(float direction) //Сигнатура метода должна совпадать с сигнатурой делегата, т.е, если делегатом будет Action<SomeType>, то у метода должен быть параметр с тем же типом, то бишь Move(SomeType something)
{
//двигаться в направлении direction
}
}