Skip to content

Entity.Input method behavior RU

Shararvev edited this page Jun 12, 2023 · 4 revisions

This page is available in English

Я рекомендую использовать метод Entity:Fire в вашем коде, вместо Entity:Input. Вопреки распространенному мнению, Entity:Fire тоже принимает аргументы activator и caller, а еще имеет аргумент delay, что невероятно полезно. Метод Entity:Input запускает инпут мгновенно, до того как завершится инициализация контроллера, это может привести к непредсказуемому поведению. Однако сам контроллер использует внутри себя Entity:Input для добавления оутпутов через инпут AddOutput, это сделано для совместимости, не более.

local button = controller:GetMetaTarget("start_button_no")

button:Input("Press", ply, ply, nil)
button.OnPressed = function(ent, activator)
	print(activator, "just pressed", ent)
end

button:Input("Press", ply, ply, nil)
button.OnPressed = function(ent, activator)
	print(activator, "just activated", ent)
end

В примере выше инпут Press сработает еще до того, как будет добавлен оутпут OnPressed через AddOutput. Однако второй Press по логике должен напечатать just pressed. На самом деле напечатает just activated. Вы можете увидеть порядок вызовов с помощью консольной команды developer 2.

(19.77) input TIMON_Z1535: start_button_no.Press()
(19.77) input map_logic_controller1: start_button_no.AddOutput(OnPressed map_logic_controller1:__OnPressed::0:-1)
(19.77) input TIMON_Z1535: start_button_no.Press()
(19.77) output: (func_button,start_button_no) -> (map_logic_controller1,__OnPressed)()
+ [MapLogic] Initialized successfully
# AcceptInput:	__OnPressed	Player [1][TIMON_Z1535]	Entity [1306][func_button]	nil
+ Player [1][TIMON_Z1535]	just activated	Entity [1306][func_button]

Используем тот же самый пример, но заменим Entity:Input на Entity:Fire. Теперь инпуты Press сработают после завершения инициализация, и оутпута будет два! Закономерно, что оба они выведут just activated, ведь мы переопределили Lua функцию.

(11.30) input map_logic_controller1: start_button_no.AddOutput(OnPressed map_logic_controller1:__OnPressed::0:-1)
+ [MapLogic] Initialized successfully
(11.30) input TIMON_Z1535: start_button_no.Press()
(11.30) output: (func_button,start_button_no) -> (map_logic_controller1,__OnPressed)()
(11.30) input TIMON_Z1535: start_button_no.Press()
(11.30) output: (func_button,start_button_no) -> (map_logic_controller1,__OnPressed)()
# AcceptInput:	__OnPressed	Player [1][TIMON_Z1535]	Entity [1306][func_button]	nil
+ Player [1][TIMON_Z1535]	just activated	Entity [1306][func_button]
# AcceptInput:	__OnPressed	Player [1][TIMON_Z1535]	Entity [1306][func_button]	nil
+ Player [1][TIMON_Z1535]	just activated	Entity [1306][func_button]

Clone this wiki locally