Как да използвам void функция с делегати?

Опитвам се да използвам обработка на събития за въвеждане на игра. Когато видят, че други използват подобни методи, те могат да добавят void функция към променливата делегат без грешка. Всеки път, когато се опитвам да добавя функцията Move() към OnAxisChange, получавам следната грешка:

Не може косвено да конвертира тип „void“ в „CharacterView.InputAction“

public class CharacterView : MonoBehaviour {
    public delegate void InputAction();
    public static event InputAction OnAxisChange;

    public Vector2 InputAxis
    {
        get
        {
            float x = Input.GetAxisRaw("Horizontal");
            float y = Input.GetAxisRaw("Vertical");
            return (new Vector2(x, y));
        }
    }

    private void Update()
    {

        Vector2 input = InputAxis;
        if (input.x != 0 || input.y != 0)
        {
            if (OnAxisChange != null)
            {
                OnAxisChange();
            }
        } 
    }
}

Следва класът, който обработва събитието.

public class CharacterController : MonoBehaviour {

    private void OnEnable()
    {
        CharacterView.OnAxisChange += Move();
    }
    private void OnDisable()
    {
        CharacterView.OnAxisChange -= Move();
    }

    public void Move()
    {
        Debug.Log("Entered the move function!");
    }

}

Използването на делегати за обработка на събития все още ми е малко чуждо, така че предполагам, че не разбирам нещо.


person Richard Mcilwain    schedule 29.06.2017    source източник
comment
Вместо да създавате свои собствени делегати, обмислете използването на EventHandler. msdn.microsoft.com/en-us /библиотека/   -  person Rand Random    schedule 29.06.2017
comment
@RandRandom има ли някакво вродено предимство за това?   -  person Richard Mcilwain    schedule 29.06.2017
comment
Единственото предимство на използването на EventHandler е, че той налага подписа на стандартния .NET модел на събитие на object sender, EventArgs e. В противен случай е идентично с използването на стандартни делегати.   -  person Enigmativity    schedule 29.06.2017
comment
@RichardMcilwain единствената истинска причина за мен е, че съм мързеливо копеле и предпочитам да използвам EventHandler, вместо да пиша свои собствени делегати. Просто се опитвам да ви заразя с мързела си. :)   -  person Rand Random    schedule 29.06.2017


Отговори (1)


Трябва да премахнете () след Move. Подобно на това, че извиквате своя метод и се опитвате да добавите връщащия тип към него, което е нищо. Просто го променете на следното.

CharacterView.OnAxisChange += Move;

CharacterView.OnAxisChange -= Move;
person NtFreX    schedule 29.06.2017
comment
Откъде взехте цитата "Event declaration adds a layer of protection on the delegate instance..." и защо го поставихте в отговора? Какво общо има с въпроса? - person Enigmativity; 29.06.2017
comment
И защо предлагате да използвате EventHandler вместо делегат? Все още е делегат. - person Enigmativity; 29.06.2017
comment
@Enigmativity Имам го от друг въпрос и го поставих, защото той използва делегати като манипулатори на събития. EventHandlers не могат да бъдат директно нулирани като делегат. Или не си съгласен? - person NtFreX; 29.06.2017
comment
@Enigmativity, но ако смятате, че няма значение и дори е толкова лошо, че заслужава гласуване против, мога да го извадя отново. Просто не разбирам защо - person NtFreX; 29.06.2017
comment
@Enigmativity се надявам да сте щастливи. Все пак бих искал да знам защо смятате, че публикацията е лоша.... - person NtFreX; 29.06.2017
comment
Мисля, че не си разбрал цитата. EventHandler може да бъде директно нулиран. Декларация за събитие не може да бъде директно нулирана. Но това не е свързано с използването на EventHandler или не. - person Enigmativity; 29.06.2017
comment
@Enigmativity според този приет отговор е единствената причина да се използват събития директно над делегати . Или аз нещо погрешно разбирам? - person NtFreX; 29.06.2017
comment
Да, не разбирате. Отговорът, към който се свързвате, обсъжда разликата между делегати и събития, а не делегати и EventHandlers. EventHandler не е събитие. - person Enigmativity; 29.06.2017
comment
@Enigmativity хм... ах сега го разбирам. Благодаря за обяснението.. Сега се чувствам глупав от corese EventHandler е просто делегат... - person NtFreX; 29.06.2017
comment
И така, как бихте направили същото нещо, ако преместите необходимите параметри? - person Richard Mcilwain; 07.07.2017