1、前言:
在模仿《Stick To The Plan》(中文名《过木不汪》)时,发现该游戏完全不需要用到鼠标。按键操作会响应到主角与UI界面,会导致同步操作。
设想将一个Scene中出现的多个不同的按键控制对象分成多个不同的Page,GamePlay时玩家操控的主角为一个Page,同时打开的UI界面为一个新的Page,同一时间只能操作一个Page,解决按键上的冲突。
框架解决的需求:
①解决GamePlay和UI同时存在相同的按键冲突。它在GamePlay时是上下左右方向键控制主角,GamePlay时打开UI选项也是上下左右方向键切换按钮。
②解决按钮非线性切换。
技术点:
①单例模式;
②事件调用;
③命令模式;
2、游戏界面实现:
这章的内容是②解决按钮非线性切换。
游戏界面:
此处的按钮不是水平或者垂直分布。
切换按键有:
①“设置”按钮--按上方向键-->“开始”按钮;
②“设置”按钮--按右方向键-->“退出”按钮。
③“设置”按钮--按下方向键-->“退出”按钮。
其中②和③都能从“退出”按钮切换到“退出”按钮,出现多种映射关系。
unity对应的界面:
简单重现了游戏的按钮分布。
对应的代码:
当前的按钮切换是在ShouyeButtonUI类中实现,ShouyeButtonUI类继承ButtonGenerate抽象类,ButtonGenerate负责生成和操作UI按钮界面,ShouyeButtonUI类负责管理UI与键盘的映射,注册按键事件。
// ShouyeButtonUI.cs
protected override void Start()
{
// 初始化UI图。
UIGraph = new int[][]{
new int[]{0, DownLeft, 0, 0, 0},
new int[]{Up, 0, DownRight, Left, 0},
new int[]{0, UpLeft, 0, 0, 0},
new int[]{0, UpRight, 0, 0, DownLeft},
new int[]{0, 0, 0, UpRight, 0},
};
// 注册事件。
AddCurrentPageAllAction(InputManager.Instance.OutOnMoveDown);
AddCurrentPageAllAction(InputManager.Instance.OutOnReturnDown);
AddCurrentPageAllAction(InputManager.Instance.OutOnSpaceDown);
base.Start();
}
“DownLeft”表示按下或者左方向键。
“new int[]{0, DownLeft, 0, 0, 0}”表示按下或者左方向键可以切换到第二个按钮。
“AddCurrentPageAllAction(Action)”表示给当前页面注册事件。
“InputManager.Instance.OutOnMoveDown”表示通用的操作。
3、