游戏UI总体结构
游戏中的UI分为几大部分,他们由UIManagerEx统一管理:
服务器登录UI:玩家登录游戏服务器,当登陆按钮触发,向逻辑层发送登陆消息.
房间登录UI:展示进入房间UI,玩家按下按钮通知逻辑层进入房间,向服务器请求进入战斗房间.
战斗UI:进入战斗场景,首先是玩家用以交互的按钮:包含虚拟摇杆,移动攻击按钮等.然后是场景的展示UI:包含排行榜,当前战斗场景倒计时,游戏过程中的Ping,玩家主动退出房间按钮以及交互面板等.当房间正常关闭时的结束面板排名等.当玩家被杀死时的死亡弹出面板,复活按钮等.
Loading:进入房间,结束这几个阶段切换时会出现loading提示
游戏提示:比如游戏关键信息,断线等等.

事件监听
UI在初始化时注册监听事件,监听玩家的按下操作.
对本机玩家控制的摇杆,攻击按钮等事件绑定到Character上,只有本机玩家控制的角色监听这些UI事件.
Character.cs:
Service.UIManager.UIBattle.BattleRunningUi.SetButtonRunEvent(OnButtonRun);
Service.UIManager.UIBattle.BattleRunningUi.SetButtonRun2Event(OnButtonDash);
Service.UIManager.UIBattle.BattleRunningUi.SetButtonAttackEvent(OnButtonAttack);
Service.UIManager.UIBattle.BattleRunningUi.SetButtonBombEvent(OnButtonBomb);
Service.UIManager.UIBattle.BattleRunningUi.SetButtonHammerEvent(OnButtonHammer);
BattleRunningUI.cs:
public void SetButtonRunEvent(Action action)
{
_buttonRun.GetComponent<Button>().onClick.RemoveAllListeners();
_buttonRun.GetComponent<Button>().onClick.AddListener(() => { action(); });
}
public void SetButtonRun2Event(Action action)
{
_buttonRun2.GetComponent<Button>().onClick.RemoveAllListeners();
_buttonRun2.GetComponent<Button>().onClick.AddListener(() => { action(); });
}
public void SetButtonAttackEvent(Action action)
{
_buttonAttack.GetComponent<Button>().onClick.RemoveAllListeners();
_buttonAttack.GetComponent<Button>().onClick.AddListener(() => { action(); });
}
public void SetButtonBombEvent(Action action)
{
_buttonBomb.GetComponent<Button>().onClick.RemoveAllListeners();
_buttonBomb.GetComponent<Button>().onClick.AddListener(() => { action(); });
}
public void SetButtonHammerEvent(Action action)
{
_buttonHammer.GetComponent<Button>().onClick.RemoveAllListeners();
_buttonHammer.GetComponent<Button>().onClick.AddListener(() => { action(); });
}
虚拟摇杆
对玩家的移动操作采用虚拟摇杆控制,监听虚拟摇杆的拖拽,停止拖拽事件.在角色初始化时注册摇杆事件,拖拽时发送移动消息携带摇杆方向,停止拖拽时发送停止消息.
Character.cs:
je.SetDraggingEvent(OnJoystickDraggingEvent);
je.SetStopDragEvet(OnStopDrag);
/// <summary>
/// 触发摇杆事件
/// </summary>
/// <param name="joystick"></param>
void OnJoystickDraggingEvent(Vector3 joystick)
{
Vector2 targetDir = new Vector2(-joystick.x, -joystick.z);
int angle = DirectionUtil.Vec3ToAngle(targetDir);
angle += 180;
angle %= 360;
if (Time.realtimeSinceStartup > _lastTime + Common.joystickSendRate)
{
_lastTime = Time.realtimeSinceStartup;
SendMsg(angle);
}
}
/// <summary>
/// 摇杆停止拖动
/// </summary>
void OnStopDrag()
{
SendMsg(0, 0);
_isStartUp = false;
}