2016-06-23 2 views
2

Я попытался дать задержку моей функции в Unity с использованием языка C#. Используя Invoke, мне удалось добавить задержку, когда курсор перемещен в определенную область. Однако теперь мне нужно отменить Invoke, когда курсор перемещается из этой определенной области. Идея заключается в том, что, когда я случайно перемещаю курсор в область, я могу отменить любую функцию, вызываемую там. Вот мой текущий код.Активировать и деактивировать функцию вызова

void SceneCall(){ 
    Application.LoadLevel (MainMenu); 
} 

void SceneCallIn(){ 
    Invoke ("SceneCall", 3f); 
} 
if (_newGameButton.Contains (Event.current.mousePosition)) { 
     SceneCallIn(); 
    } 

Я пытался использовать CancelInvoke(), как еще, и он даже не хочет, чтобы вызвать больше, когда я двигаю курсор _newGameButton потом. Как вы отменяете Invoke, а затем активируете его еще раз? Благодарим за ваш ответ.

EDIT: Как @Programmer говорит в комментариях, то, что я точно хочу сделать, это когда моя мышь находится в определенной точке, таймер начнет подсчет. Через 3 секунды будет загружена MainMenu. Пока таймер подсчитывается, и указатель удаляется от этой определенной позиции, я хочу, чтобы таймер остановился, и я не хочу, чтобы сцена MainMenu была загружена больше.

+0

Хм, когда вы снова вызываете «invoke», он просто вызовет его снова - никаких проблем. – Fattie

+0

Решение: ** добавить Debug.Log ("a"); и Debug.Log ("b"); и Debug.Log ("c"); ** строки кода во всех трех функциях, и вы будете в состоянии понять, что происходит. вероятно, он делает что-то «вы не понимаете», вы знаете? – Fattie

+0

Я сделал правильную вещь, чтобы положить CancelInvoke() после else {} ниже if (_newGameButton.Contains (Event.current.mousePosition))? потому что он немедленно отменяет Invoke еще до того, как я переместил курсор на _newGameButton? – Mikuriin

ответ

4

ЕСЛИ ВЫ ДЕЙСТВИТЕЛЬНО ХОТИТЕ

имеют "ролловеры" и так далее,

здесь является полным, всего, учебник:

https://stackoverflow.com/a/36046495/294884

это красиво написано. Пожалуйста, проголосуйте за него :)

Действительно, вам нужно будет стать полностью экспертом во всем этом, прежде чем вы сможете это сделать.

я должен сказать вам еще раз, хотя:

В течение 15 лет ........ вы никогда никогда, никогда - НИКОГДА !! - использовать прокрутки по любой причине в интерфейсе.

Вы не должны этого делать. Это невероятная трата времени!

Возвратитесь к тому, чтобы повеселиться в ваших играх!

3

Вчера я столкнулся с такой же проблемой, но решил просто снова вызвать метод invoke.

Вот мой код:

public void OnGazeEnter() 
{ 
    InvokeRepeating("OnGazeStay", 0.0f, 1.0f/30.0f); 
} 
public void OnGazeExit() 
{ 
    CancelInvoke("OnGazeStay"); 
} 

В вашем случае, если вы хотите зарегистрировать более одного метода, вам придется сохранить какой-то List<String> myMethods, так что вы сможете удалить все методы, которые вы зарегистрировались.

+1

это совершенно правильно. Я бы URGE, чтобы вы добавляли заявления Debug.Log в оба. – Fattie

+0

Я согласен, потому что отладка является самым ясным способом понять поток вашего алгоритма и внутренние состояния –

+1

Спасибо @RonaldoFelipe! Он работает. Я просто понял, что вы используете три функции: «OnGazeEnter», «OnGazeStay» и «OnGazeExit». Оказывается, я использовал только два, и именно поэтому он не – Mikuriin

Смежные вопросы