Возможно, вы захотите использовать шаблон State (также известный как шаблон State Machine , поскольку он основан на математической теории конечного состояниямашины).Идея состоит в том, что персонаж (или любой другой тип игрового объекта, в этом отношении) всегда находится в точно одном состоянии (выбранном из заранее определенного набора возможных состояний), и что определенные события могут вызывать переходы вдругие штаты.Затем метод tick()
может выполнять различные действия в зависимости от текущего состояния.Более продвинутая версия этого шаблона - иметь классы для разных состояний и использовать экземпляры классов состояний для сбора информации, например, о том, как долго вы были в этом состоянии.Таким образом, в вашем случае возможными состояниями являются Walking
, PickingUp
, Idle
и т. Д.
На самом деле, вы почти изобрели этот шаблон сами, поскольку ваша концепция IAction
по сути одно и то жекак государство.Поэтому я думаю, что вы движетесь в правильном направлении.
Редактировать: Чтобы быть более конкретным в вашей ситуации, я бы посоветовал вам просто отказаться от требования, что IAction
является атомным;вместо этого это может длиться несколько тиков.IAction.execute()
должен просто выполнять столько действий, сколько может быть выполнено за один тик, например, пройти небольшое расстояние по нужному пути.Само действие может, например, отслеживать, где находится целевая позиция, как далеко он продвинулся и т. Д.
(Историческая справка: оригинальный движок Unreal Engine был основан на состояниях (и я предполагаю, что более новые версиитоже) - при кодировании, например, пользовательского оружия, вы должны разделить код на один раздел для каждого возможного состояния, например Firing
, Reloading
, Idle
и т. д.)