第十一章 地图动作与地图事件(Map Action and Map Event)
我们已经有了剧本,而且可以运行剧本,但我们还缺少对地图的操作控制。
我们这一章来完成地图上的操作,地图的操作将全部由MapAction
控制。
文章目录
四 地图菜单(Map Menu)
就像上一节我们说的,游戏菜单分为主菜单和角色菜单。主菜单主要是提供一些公共的功能,例如所有角色的列表;而角色菜单提供一些角色独有的功能,例如移动、状态和攻击等。
你可以按照自己的喜好布局,并发送点击事件,让MapAction
接收事件。不过我这里使用一个SubUIButtonLayoutGroup
来控制它们,所有的回调直接让MapAction
控制。
而这需要一个UI面板UIMapMenuPanel
:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace DR.Book.SRPG_Dev.UI
{
using DR.Book.SRPG_Dev.Framework;
using DR.Book.SRPG_Dev.Models;
public class UIMapMenuPanel : UIBase
{
private SubUIButtonLayoutGroup m_ButtonLayoutGroup;
// TODO
}
}
- 图 11.1 Map Menu
1 菜单文本(Menu Text)
按钮文本可以直接写在Unity的UI中,不过为了更好的控制,我将它们放入了TextInfoConfig
中,这样就需要它们的标识,称为MenuTextID
,它是一个枚举类型,而值是在TextInfoConfig
中的id
。
/// <summary>
/// id in TextInfoConfig
/// </summary>
public enum MenuTextID
{
// Main
Unit = 100,
Item = 101,
Data = 102,
Skill = 103,
Config = 104,
Save = 105,
TurnEnd = 106,
// Common
Close = 110,
// Player
Move = 120,
Holding = 121,
Talk = 122,
Attack = 123,
Status = 124
}
而我们的TextInfoConfig.txt
中:
//id text
0 测试对话0
1 测试对话1:Hello World!Hello 是你好的意思。
2 测试对话2:Bottom Hello World!
5 测试对话5
8 测试对话8
100 作战单位
101 物品
102 数据
103 技能
104 设置
105 存档
106 回合结束
110 关闭
120 移动
121 待机
122 对话
123 攻击
124 状态
有了这些之后,我们在打开菜单时,只需要传入需要打开的值就可以了。
再添加一些帮助方法:
/// <summary>
/// 获取所有主菜单的按钮文本
/// </summary>
/// <returns></returns>
public static HashSet<MenuTextID> GetDefaultMainMenuTextIds()
{
return new HashSet<MenuTextID>()
{
MenuTextID.Unit,
MenuTextID.Item,
MenuTextID.Data,
MenuTextID.Skill,
MenuTextID.Config,
MenuTextID.Save,
MenuTextID.TurnEnd,
MenuTextID.Close
};
}
/// <summary>
/// 获取所有角色菜单按钮文本
/// </summary>
/// <returns></returns>
public static HashSet<MenuTextID> GetDefaultUnitMenuTextIds()
{
return new HashSet<MenuTextID>()
{
MenuTextID.Move,
MenuTextID.Attack,
MenuTextID.Holding,
MenuTextID.Talk,
MenuTextID.Status,
MenuTextID.Close
};
}
2 初始化UI面板与点击事件(Initialize UIMapMenuPanel and Click Event)
我们每一个按钮需要回调一个MenuTextID
给MapAction
,这其实相当于每一个按钮都做了同样的事。
private Action<MenuTextID> m_OnItemClickAction;
private void Button_onClick(MenuTextID menuTextID)
{
UIManager.views.CloseView();
if (m_OnItemClickAction != null)
{
m_OnItemClickAction(menuTextID);
m_OnItemClick