Если вы хотите убедиться, что он работает правильно, измените текущий метод, скрывая его на переопределение. Добавьте ключевое слово «virtual» в базовый метод Start ().
virtual void Start()
{
input = GetComponent<PlayerInput>();
InputActionMap fighterMap = input.actions.FindActionMap("Fighter");
fighterMap.FindAction("Move").performed += OnMove;
fighterMap.FindAction("Attack").performed += OnAttack;
fighterMap.FindAction("Special").performed += OnSpecial;
fighterMap.FindAction("Block").performed += OnBlock;
fighterMap.FindAction("Grab").performed += OnGrab;
fighterMap.FindAction("Jump").performed += OnJump;
}
Затем добавьте ключевое слово override к производному методу и в конце вызовите base.Start ().
override void Start()
{
OnAttack = callbackContext => Debug.Log(callbackContext.performed);
base.Start();
}
В C# неабстрактные методы не переопределяются автоматически (как это работает в Java), и вы должны использовать виртуальное ключевое слово. В противном случае производный метод просто скрывает базовый метод, но можно случайно вызвать базовый метод, когда вы его не имеете в виду (например, путем приведения или просто объявив его как тип базового класса - как здесь: https://dotnetfiddle.net/FOeUL9). Вот почему это может вызвать различные проблемы, поэтому избегайте этого, если можете.
Есть еще немного информации о разнице между ними: https://www.geeksforgeeks.org/difference-between-method-overriding-and-method-hiding-in-c-sharp/
В вашем случае, скорее всего, вашей главной проблемой было то, что производный метод не его базовый метод вызывается base.Start()
, поэтому оператор fighterMap.FindAction("Attack").performed += OnAttack;
никогда не вызывался. Скрытие также может быть проблемой.
Редактировать: Мое плохое, base.Start()
, вероятно, должно быть в конце производного метода, а не в начале, так как это базовый метод, который создает подписки на события - без перед инициализацией обработчика события OnAction
он просто подписывается на событие null.