Событие вызывается только в том классе, где оно было объявлено, извне его вызывать нельзя. Подписываться на события нужно извне.

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
    }
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *