UGF结合demo的使用3--sound管理,设置窗口,过渡场景

  • Sound

现在想要给游戏添加声音,在starforce工程里我们能找到各种音源文件,在config目录下能找到一个audio mixer 文件这个是对音源输出做些混响处理的,具体可以看看网上相关文档。

 

再看下starforce上UGF预制体上的Sound节点是怎么设置的。在我的工程中也参照starforce设置了

 

上面的 1 处 audio mixer 就是我根据音源文件在我的项目中手动创建的结构如下

 

上面 2 处的是什么意思呢? 其实就是播放音源的代理 比如 我们的背景音乐是放在music group下的的代理个数是2,就是会创建两个游戏对象可负责播放游戏的背景音乐,在gamesounds group 下的是游戏内物体交互时的音效。个数是4 比如我连续攻击游戏内的4个单位时 每个单位都会发出声音 每个声音有一定的持续时间 有可能 播放这个音源的同时也播放别的音源所以不妨多设置几个。

 

在切换关卡的时候会读取场景的bgm

 

载入成功的时候会播放音乐

 

设置各种音效的路径(根据个人项目不同),音效文件名改成和数据配置表里面相对应就行了。

 

以上就是背景音乐的使用。

 

  • 设置窗口同理参考StarForce里的窗口逻辑

 

这里有几个地方要注意就是

  1. 在buildSetting中要让Launcher场景在编号0的位置因为提交的时候会重启框架。
  2. 在Launcher场景里面实现这个两个函数。
  • 初始化语言设置就是 如果是编辑器资源模式并且选择了语言就用那个语言,如果不是就是用在设置界面使用的语言。
  • 初始化默认字典就是 在设置界面上的语言文字,这些key ,value不是在对应语言的本地化目录(localization)下的

 

  • 过渡场景就是在因为UGF里的场景都是异步加载的所以可以在载入下个场景前进入一个Loading场景,

逻辑我放在procedureChangeScene 里下面是我的逻辑代码。

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

namespace GameMain
{
    public class ProcedureChangeScene : ProcedureBase
    {
        private const int MenuSceneId = 1;
        private bool m_ChangeToMenu = false;
        private bool m_IsChangeSceneComplete = false;
        private int m_BackgroundMusicId = 0;
        private bool m_InLoadingScene = false;
        private string[] loadedSceneAssetNames = null;
        private int m_NextScene = 0;
        private string m_NextSceneName = null;
        private Slider m_LoadingSlider = null;

        public override bool UseNativeDialog
        {
            get
            {
                return false;
            }
        }

        protected override void OnEnter(ProcedureOwner procedureOwner)
        {
            base.OnEnter(procedureOwner);
            m_IsChangeSceneComplete = false;
            GameEntry.Event.Subscribe(LoadSceneSuccessEventArgs.EventId, OnLoadSceneSuccess);
            GameEntry.Event.Subscribe(LoadSceneFailureEventArgs.EventId, OnLoadSceneFailure);
            GameEntry.Event.Subscribe(LoadSceneUpdateEventArgs.EventId, OnLoadSceneUpdate);
            GameEntry.Event.Subscribe(LoadSceneDependencyAssetEventArgs.EventId, OnLoadSceneDependencyAsset);

            // 停止所有声音
            GameEntry.Sound.StopAllLoadingSounds();
            GameEntry.Sound.StopAllLoadedSounds();

            // 隐藏所有实体
            GameEntry.Entity.HideAllLoadingEntities();
            GameEntry.Entity.HideAllLoadedEntities();

            GameEntry.Scene.LoadScene(AssetUtility.GetSceneAsset("Loading"), Constant.AssetPriority.SceneAsset, this);
            m_InLoadingScene = true;

             卸载所有场景
            //string[] loadedSceneAssetNames = GameEntry.Scene.GetLoadedSceneAssetNames();
            //for (int i = 0; i < loadedSceneAssetNames.Length; i++)
            //{
            //    GameEntry.Scene.UnloadScene(loadedSceneAssetNames[i]);
            //}

            // 还原游戏速度
            GameEntry.Base.ResetNormalGameSpeed();
            m_NextScene = procedureOwner.GetData<VarInt>("NextSceneId");
            //int sceneId = procedureOwner.GetData<VarInt>("NextSceneId");
            //m_ChangeToMenu = sceneId == MenuSceneId;
            //IDataTable<DRScene> dtScene = GameEntry.DataTable.GetDataTable<DRScene>();
            //DRScene drScene = dtScene.GetDataRow(sceneId);
            //if (drScene == null)
            //{
            //    Log.Warning("Can not load scene '{0}' from data table.", sceneId.ToString());
            //    return;
            //}

            //GameEntry.Scene.LoadScene(AssetUtility.GetSceneAsset(drScene.AssetName), Constant.AssetPriority.SceneAsset, this);
            //m_BackgroundMusicId = drScene.BackgroundMusicId;
        }

        protected override void OnLeave(ProcedureOwner procedureOwner, bool isShutdown)
        {
            GameEntry.Event.Unsubscribe(LoadSceneSuccessEventArgs.EventId, OnLoadSceneSuccess);
            GameEntry.Event.Unsubscribe(LoadSceneFailureEventArgs.EventId, OnLoadSceneFailure);
            GameEntry.Event.Unsubscribe(LoadSceneUpdateEventArgs.EventId, OnLoadSceneUpdate);
            GameEntry.Event.Unsubscribe(LoadSceneDependencyAssetEventArgs.EventId, OnLoadSceneDependencyAsset);

            base.OnLeave(procedureOwner, isShutdown);
        }

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

            if (!m_IsChangeSceneComplete)
            {
                return;
            }

            if (m_ChangeToMenu)
            {
                ChangeState<ProcedureMenu>(procedureOwner);
            }
            else
            {
                ChangeState<ProcedureMain>(procedureOwner);
            }
        }

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

            Log.Info("Load scene '{0}' OK.", ne.SceneAssetName);
            if (ne.SceneAssetName == AssetUtility.GetSceneAsset("Loading"))
            {
                //m_InLoadingScene = false;
                loadedSceneAssetNames = GameEntry.Scene.GetLoadedSceneAssetNames();

                //载入下个场景
                m_ChangeToMenu = m_NextScene == MenuSceneId;
                IDataTable<DRScene> dtScene = GameEntry.DataTable.GetDataTable<DRScene>();
                DRScene drScene = dtScene.GetDataRow(m_NextScene);
                if (drScene == null)
                {
                    Log.Warning("Can not load scene '{0}' from data table.", m_NextScene.ToString());
                    return;
                }
                m_NextSceneName = drScene.AssetName;
                GameEntry.Scene.LoadScene(AssetUtility.GetSceneAsset(drScene.AssetName), Constant.AssetPriority.SceneAsset, this);
                m_BackgroundMusicId = drScene.BackgroundMusicId;
                return;
            }
            else//卸载掉进载入场景时的获取的场景
            {
                for (int i = 0; i < loadedSceneAssetNames.Length; i++)
                {
                    GameEntry.Scene.UnloadScene(loadedSceneAssetNames[i]);
                }
            }


            if (m_BackgroundMusicId > 0)
            {
                GameEntry.Sound.PlayMusic(m_BackgroundMusicId);
            }

            m_IsChangeSceneComplete = true;
        }

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

            Log.Error("Load scene '{0}' failure, error message '{1}'.", ne.SceneAssetName, ne.ErrorMessage);
        }

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

            if (m_InLoadingScene && m_NextSceneName != null && ne.SceneAssetName == AssetUtility.GetSceneAsset(m_NextSceneName))
            {
                if (m_LoadingSlider == null)
                    m_LoadingSlider = GameObject.FindObjectOfType<Slider>();
                m_LoadingSlider.value = ne.Progress;
            }

            Log.Info("Load scene '{0}' update, progress '{1}'.", ne.SceneAssetName, ne.Progress.ToString("P2"));
        }

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

            Log.Info("Load scene '{0}' dependency asset '{1}', count '{2}/{3}'.", ne.SceneAssetName, ne.DependencyAssetName, ne.LoadedCount.ToString(), ne.TotalCount.ToString());
        }
    }
}

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值