第十章 游戏剧情(Game Plot)
在大部分的RPG中,故事剧情是非常重要的。例如某些播放某些过场动画,人物台词等文字叙述的显示。这些可以推动整个游戏流程。
在Unity商店中,有一些剧情类的插件。我们编写的这个可以配合那些插件使用。
八 menu命令执行器与菜单界面 (menu Command Exeuctor and UI Menu Panel)
我们接下来进行的是mennu
命令。
类似text
命令,写命令之前,我们要先有UI能够显示我们的选项菜单。
1 界面结构 (Panel Structure)
菜单的显示方式可以有:
-
垂直;
-
水平;
-
网格;
-
自定义。
我这里只使用了垂直作为例子,如果你需求可选,需要加入参数(就像在本章第一节中所说的一样)。如果你需要自定义位置,那么每个按钮还要有位置参数。
具体位置如 图 10.2 显示:
- 图 10.2:UI Menu Panel
就像图中显示的,你也可以为你的菜单选项添加背景,或者标题。如果需要显示问题,也可以在顶部放上问题的文本。一切都是按照游戏的需求。
同样的,我们创建一个子UI来解决这个菜单问题。这个子UI类似于Unity的Dropdown
(只是没有caption
,显示和隐藏不是点击caption
,而是执行器决定),如果你熟悉Dropdown
源码的话,那么很容易实现。不熟悉也没关系,我们接下来一步一步来创建它。
2 子UI按钮组(Sub UI Button Layout Group)
在创建它时要记得,我们并不需要像Dropdown
一样那么复杂,我们只取所需:
-
为了选项按钮能够自动调整位置,给它添加一个
VerticalLayoutGroup
组件,是否是垂直的就看游戏需求了; -
选项按钮需要一个模板,所有的按钮都和它一样;
-
每一个按钮都需要一个设置;
-
每一个按钮还需要一个运行时组件,我们建立一个空的脚本,叫它
SubUIRuntimeButtonProxy
(Dropdown
也有一个运行时组件,只有运行游戏时才可以看到,我这里添加也是因为有需求)。
了解这些之后,我们先来看按钮的设置。关于按钮的设置我们这里只需要一个字符串,而使用选项所在的Index
作为选择结果,所以是从0开始,菜单打开之前要将选项结果重置为-1。
创建类:
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace DR.Book.SRPG_Dev.UI
{
[DisallowMultipleComponent]
[AddComponentMenu("SRPG/UI/Button Layout Group")]
public class SubUIButtonLayoutGroup : UIBehaviour
{
#region struct ItemOption
/// <summary>
/// item参数
/// </summary>
[Serializable]
public struct ItemOption
{
/// <summary>
/// 如果模版存在Text组件或模版子物体存在Text组件,Text组件的text属性
/// </summary>
[SerializeField, Tooltip("Text")]
public string text;
public ItemOption(string text)
{
this.text = text;
}
}
#endregion
#region UI Fields
[SerializeField]
private LayoutGroup m_LayoutGroup;
[SerializeField]
private GameObject m_ItemTemplate;
[SerializeField]
private List<ItemOption> m_ItemOptions = new List<ItemOption>();
private readonly List<SubUIRuntimeButtonProxy> m_Items = new List<SubUIRuntimeButtonProxy>();
#endregion
#region UI Properties
// 省略UI属性
#endregion
public void Display(bool show)
{
gameObject.SetActive(show);
}
// TODO 创建按钮、销毁按钮
}
在SubUIButtonLayoutGroup.ItemOption
和Dropdown.OptionData
相比没有了sprite
。不过源码中还有其它选项,我们的游戏用不到,有兴趣可以查看。
2.1 按钮点击事件(On Item Click Event)
在Dropdown
中有一个onValueChanged
事件,我们同样可以创建一个类似的。
#region Unity Event
/// <summary>
/// 当item被点击时
/// Args:
/// GameObject buttonGameObject, // 被点击的按钮
/// int index, // 在此group中的下标,
/// </summary>
[Serializable]
public class OnItemClickEvent : UnityEvent<GameObject, int> {
}
[Space, SerializeField]
private OnItemClickEvent m_OnItemClickEvent = new OnItemClickEvent();
/// <summary>
/// 当item被点击时
/// Args:
/// GameObject buttonGameObject, // 被点击的按钮
/// int index, // 在此group中的下标,
/// </summary>
public OnItemClickEvent onItemClick
{
get
{
if (m_OnItemClickEvent == null)
{
m_OnItemClickEvent = new