【世界热闻】一种流水线形式的角色控制器实现思路

2023-06-27 13:04:33    来源:哔哩哔哩

灵感以及参考来自视频:

这种方法最直观的好处就像视频标题所说的那样:夺取玩家的控制权,甚至可以让AI来接管控制器进行操作。


(资料图片仅供参考)

Unity初学者一枚,欢迎各位大佬讨论,如有错误还请见谅。

实现思路及代码示例:

首先,就像视频中所说的那样,将角色的控制器与用户输入分开,分别独立为PlayerController与InputSystem,通过一个新的实例InputProvider将用户的输入传递给PlayerController。

在InputSystem与PlayerController中间可以有多个其它的系统用来对输入结果进行修改,或者接管输入,这样便组成了一个流水线。

如果要做到这点,那么很明显,InputProvider中就需要包括InputSystem中的各项输入参数,就像这样:

在得到输入后,如果可以进行跳跃,我们需要对事件进行广播,因此我们还需要一个广播事件的方法TriggerEvent,在所有系统都处理完成后进行调用。

在此基础上,为了让InputSystem等其余流水线上的系统能够修改InputState中的参数,我们还需要GetState方法,以及修改完成后将其返回给InputProvider中的SetState方法:

为了方便InputProvider在整个流水线中的调用,我的思路是将其设置为单例。

完整的InputProvider如下:

接下来以InputSystem为例,我们来看看流水线上的各个系统需要什么内容。

首先既然要修改InputProvider中的参数,我们当然需要一个InputProcess方法对其进行处理;并且,每个流水线上的系统都需要这样做,我们可以写一个接口,让流水线上的系统来实现它。

因此,完整的输入系统应该是这个样子:

同理,对话系统等需要对输入进行处理的系统都可以这样做。

如何让整个流水线运作起来,我们还需要一个ChainManager类来进行管理。

ChainManager所需要包含的功能是将所有的系统组成一条流水线,并且调用它们所拥有的Process方法进行处理。

我的思路是:既然系统是挂载在场景的GameObject上,那么可以创建一个GameObject数组,在编辑器的Inspecter窗口中,将各个系统按流水线的运作顺序添加进来。

就像这样:

然后,通过遍历数组的方式,按照运作顺序调用InputProcess方法进行处理。

(如果DialogueSystem将输入设为0,那么玩家也就不可再移动。)

完整的ChainManager如下:

最后,只需要让PlayerController调用InputProvider中的各项参数实现想要的效果即可。

标签:

X 关闭

X 关闭