UGF游戏框架实例开发教程—FlappyBird(五)菜单流程的代码编写

在正式开始写代码之前,我们需要先将命名空间给重命名一下

随便找一个Scripts下的文件,修改命名空间为FlappyBird



修改命名空间后,有几个地方需要重新设置








OK,接下来处理流程相关的东西,创建两个类,分别命名为ProcedureMenu和ProcedureMain,代表菜单流程与主流程,作为流程类,需要继承ProcedureBase

namespace FlappyBird
{
    /// <summary>
    /// 菜单流程
    /// </summary>
    public class ProcedureMenu : ProcedureBase
    {

    }

}


namespace FlappyBird
{
    /// <summary>
    /// 主流程
    /// </summary>
    public class ProcedureMain : ProcedureBase
    {

    }

}


然后找到ProcedureComponent所在的游戏物体,勾选所有流程类,并设置入口流程



打开ProcedureChangeScene(这个流程负责切换场景的处理),找到TODO的地方,编写如下代码

 protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

            if (!m_IsChangeSceneComplete)
            {
                return;
            }

            //TODO:在这里根据切换到的场景编号进行对应的流程切换
            switch (gotoSceneId)
            {
                case 1:
                    ChangeState<ProcedureMenu>(procedureOwner);
                    break;

                case 2:
                    ChangeState<ProcedureMain>(procedureOwner);
                    break;

                default:
                    break;
            }
        }


接着打开ProcedurePreload(负责处理预加载的流程),找到TODO的地方,编写如下代码

protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

            IEnumerator<bool> iter = m_LoadedFlag.Values.GetEnumerator();
            while (iter.MoveNext())
            {
                if (!iter.Current)
                {
                    return;
                }
            }

            // TODO:这里开始,切换到你的场景,场景编号可在DefaultConfig中配置
            procedureOwner.SetData<VarInt>(Constant.ProcedureData.NextSceneId, GameEntry.Config.GetInt("Scene.Menu"));
            ChangeState<ProcedureChangeScene>(procedureOwner);
        }


这些TODO的地方处理完成后,可以开始编写菜单流程的相关代码了

using UnityGameFramework.Runtime;
using GameFramework.Procedure;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;

namespace FlappyBird
{
    /// <summary>
    /// 菜单流程
    /// </summary>
    public class ProcedureMenu : ProcedureBase
    {
        public bool IsStartGame { get; set; }

        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);

            IsStartGame = false;

            //打开UI界面
            GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this);
        }

        protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

            if (IsStartGame)
            {
                //切换到主要场景
                procedureOwner.SetData<VarInt>(Constant.ProcedureData.NextSceneId, GameEntry.Config.GetInt("Scene.Main"));
                ChangeState<ProcedureChangeScene>(procedureOwner);
            }
        }

      
    }

}

这里的OnEnter和OnUpdate是流程的生命周期方法,在UGF中,流程是一种特殊的状态,受状态机管理,所以也有相应的生命周期方法


在上面那段代码中,我们打开了菜单UI,所以我们接下来需要编写菜单UI的相关代码

先去UIComponent里添加一个UIGroup,并且指定InstanceRoot




把MenuForm拖到UI Form Instances下面,然后新建一个MenuForm脚本,继承UGuiForm,编写如下代码


    /// <summary>
    /// 菜单界面脚本
    /// </summary>
    public class MenuForm : UGuiForm
    {
        /// <summary>
        /// 菜单流程
        /// </summary>
        private ProcedureMenu m_ProcedureMenu = null;

        protected override void OnOpen(object userData)
        {
            base.OnOpen(userData);
            m_ProcedureMenu = (ProcedureMenu)userData;
        }

        protected override void OnClose(object userData)
        {
            m_ProcedureMenu = null;
            base.OnClose(userData);
        }

        public void OnStartButtonClick()
        {
            m_ProcedureMenu.IsStartGame = true;
        }

        public void OnSettingButtonClick()
        {
            GameEntry.UI.OpenUIForm(UIFormId.SettingForm);
        }


把这个脚本拖到MenuForm上面,然后把MenuForm下的两个按钮的Button组件删除,添加CommonButton脚本,在OnClick委托中注册MenuForm的PlaySound方法,参数输入1



然后分别将MenuForm里的按钮监听方法注册到对应的按钮上




应用预制体变更,完善菜单流程类的代码

using UnityGameFramework.Runtime;
using GameFramework.Procedure;
using ProcedureOwner = GameFramework.Fsm.IFsm<GameFramework.Procedure.IProcedureManager>;
using GameFramework.Event;

namespace FlappyBird
{
    /// <summary>
    /// 菜单流程
    /// </summary>
    public class ProcedureMenu : ProcedureBase
    {
        public bool IsStartGame { get; set; }

        /// <summary>
        /// 菜单界面脚本
        /// </summary>
        private MenuForm m_MenuForm = null;

        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);

            IsStartGame = false;

            //订阅UI打开成功事件
            GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);

            //打开UI界面
            GameEntry.UI.OpenUIForm(UIFormId.MenuForm, this);
        }

        protected override void OnUpdate(ProcedureOwner procedureOwner, float elapseSeconds, float realElapseSeconds)
        {
            base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);

            if (IsStartGame)
            {
                //切换到主场景
                procedureOwner.SetData<VarInt>(Constant.ProcedureData.NextSceneId, GameEntry.Config.GetInt("Scene.Main"));
                ChangeState<ProcedureChangeScene>(procedureOwner);
            }
        }

        protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
        {
            base.OnLeave(procedureOwner, isShutdown);

            if (m_MenuForm != null)
            {
                m_MenuForm.Close(isShutdown);
                m_MenuForm = null;
            }

            //取消订阅UI打开成功事件
            GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
        }

        private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
        {
            OpenUIFormSuccessEventArgs ne = (OpenUIFormSuccessEventArgs)e;
            if (ne.UserData != this)
            {
                return;
            }

            m_MenuForm = (MenuForm)ne.UIForm.Logic;
        }


    }

}


我们刚才在MenuForm里编写了打开设置界面的代码,因此我们也需要来编写设置面板的脚本

创建一个SettingForm脚本拖到对应UI物体上,为其编写如下代码

    /// <summary>
    /// 设置界面脚本
    /// </summary>
    public class SettingForm : UGuiForm
    {
        public void OnCloseButtonClick()
        {
            Close();
        }

        public void OnMusicSettingValueChange(float value)
        {
            GameEntry.Sound.SetVolume("Music", value);
        }

        public void OnSoundSettingValueChange(float value)
        {
            GameEntry.Sound.SetVolume("Sound", value);
            GameEntry.Sound.SetVolume("UISound", value);
        }
    }

在这个脚本里监听了按钮的点击与两个Slider的变化,因此我们也需要将这三个方法注册进去





应用预制体变更,现在我们可以点击运行来看看项目能不能跑起来了



点击设置,调整音乐大小



点击开始按钮,进入Main场景



虽然没有做UI,但已经可以听到背景音乐了

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Unity游戏框架是一种基于Unity引擎的游戏开发框架,它提供了一系列的工具和功能,帮助开发者快速构建游戏。该框架包括了游戏逻辑、资源管理、UI界面、网络通信、音效、动画等方面的功能,可以大大提高游戏开发的效率和质量。同时,Unity游戏框架也支持多平台发布,包括PC、移动设备、Web等。 ### 回答2: Unity Game Framework(简称UGF)是一款用于开发游戏的开源框架。它基于Unity引擎,并提供了一系列功能模块,使开发者可以更加轻松、高效地创建游戏UGF具有以下几个主要特点: 1. 强大的模块化设计:UGF采用了模块化设计的思想,将游戏开发中常用的功能分解为多个独立的模块,如资源管理、事件系统、状态机等,每个模块都可以独立使用,也可以根据需要进行组合和定制。这种设计使得开发者能够更加灵活地构建自己的游戏逻辑。 2. 简化的编程模式:UGF提供了一套简化的编程模式,包括了一些常用的编程工具和常用功能的封装,如对象池、定时器、网络通信等,这些工具和功能使得开发者在编写代码时能够更加高效地处理游戏逻辑,提升开发效率。 3. 可扩展性强:UGF的设计允许开发者自定义扩展功能模块,以满足项目特定需求。开发者可以通过编写新的模块,并将其集成到框架中,从而实现特定功能的扩展。这种可扩展性可以满足不同类型的游戏开发需求,并提供了更大的自由度。 4. 多平台支持:UGF基于Unity引擎,因此可以支持多平台的游戏开发,包括PC、移动设备、主机等。开发者只需要根据具体平台的需求进行相应的适配,就可以在不同的平台上发布游戏。 总之,Unity Game Framework是一款功能强大、灵活可扩展的游戏开发框架,通过其提供的模块化设计、简化的编程模式、可扩展性强、多平台支持等特点,使得游戏开发者能够更加高效地开发出优秀的游戏作品。 ### 回答3: Unity Game FrameworkUGF)是一个用于开发 Unity 游戏的开源框架。它提供了一套易于使用和扩展的工具和功能,可以帮助开发者更高效地创建游戏UGF的核心特性是模块化和可扩展性。开发者可以根据项目的需求选择和集成所需的模块,从而实现游戏的定制化开发UGF还提供了一套灵活的开发架构,使开发者能够轻松地扩展和定制框架,以适应不同类型的游戏开发UGF提供了许多常用的功能模块,例如资源管理、对象池、状态机等。这些模块可以帮助开发者简化开发流程,并提供高效的游戏性能。UGF还提供了一套可视化的编辑器工具,使开发者能够更直观地管理和配置游戏资源。 UGF还支持多平台发布,可以轻松地发布到多个平台,包括PC、移动设备和主机。这使得开发者可以更广泛地覆盖用户群体,并实现跨平台游戏开发。 总之,Unity Game Framework是一个强大且灵活的游戏开发框架,它可以帮助开发者提高游戏开发效率和性能,同时还具备了可定制化和跨平台发布等特点,是游戏开发者的不错选择。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值