SRPG游戏开发(五十)第十章 游戏剧情 - 八 menu命令执行器与菜单界面 (menu Command Exeuctor and UI Menu Panel)

返回总目录

第十章 游戏剧情(Game Plot)

在大部分的RPG中,故事剧情是非常重要的。例如某些播放某些过场动画,人物台词等文字叙述的显示。这些可以推动整个游戏流程。

在Unity商店中,有一些剧情类的插件。我们编写的这个可以配合那些插件使用。



八 menu命令执行器与菜单界面 (menu Command Exeuctor and UI Menu Panel)

我们接下来进行的是mennu命令。

类似text命令,写命令之前,我们要先有UI能够显示我们的选项菜单。


1 界面结构 (Panel Structure)

菜单的显示方式可以有:

  • 垂直;

  • 水平;

  • 网格;

  • 自定义。

我这里只使用了垂直作为例子,如果你需求可选,需要加入参数(就像在本章第一节中所说的一样)。如果你需要自定义位置,那么每个按钮还要有位置参数。

具体位置如 图 10.2 显示:

UI Menu Panel

  • 图 10.2:UI Menu Panel

就像图中显示的,你也可以为你的菜单选项添加背景,或者标题。如果需要显示问题,也可以在顶部放上问题的文本。一切都是按照游戏的需求。

同样的,我们创建一个子UI来解决这个菜单问题。这个子UI类似于Unity的Dropdown(只是没有caption,显示和隐藏不是点击caption,而是执行器决定),如果你熟悉Dropdown源码的话,那么很容易实现。不熟悉也没关系,我们接下来一步一步来创建它。


2 子UI按钮组(Sub UI Button Layout Group)

在创建它时要记得,我们并不需要像Dropdown一样那么复杂,我们只取所需:

  • 为了选项按钮能够自动调整位置,给它添加一个VerticalLayoutGroup组件,是否是垂直的就看游戏需求了;

  • 选项按钮需要一个模板,所有的按钮都和它一样;

  • 每一个按钮都需要一个设置;

  • 每一个按钮还需要一个运行时组件,我们建立一个空的脚本,叫它SubUIRuntimeButtonProxyDropdown也有一个运行时组件,只有运行游戏时才可以看到,我这里添加也是因为有需求)。

了解这些之后,我们先来看按钮的设置。关于按钮的设置我们这里只需要一个字符串,而使用选项所在的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.ItemOptionDropdown.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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值