学习《GameFramework框架——FlappyBird》记录

学习了自然妙有猫仙人的FlappyBird基于GameFramework的教程受益很大。 现记录一下学习过程中的思考。避免以后自己忘记了,后续再拿出来看看。其实写的这些问题都是花了我很多时间的总结。


我根据教程自己学着做了一个FlappyBird,新添加了一个暂停按钮。
我的unity版本是2022.3.1LST


我的GitHub项目地址:https://github.com/LinYi6/GameFramework-My_FlappyBird
国内Gitee项目地址:https://gitee.com/linjiangxue8/GameFramework-My_FlappyBird

一、关于流程的一些记录

GameFramework主要还是基于流程的,不同场景是对流程的切换,然后在流程里面实现功能。比如点击开始游戏时从ProcedureMenu切换到ProcedureMain流程,游戏结束选择返回主菜单时又从ProcedureMain切换到ProcedureMenu。这里有一点要注意,在出现游戏结束界面时,游戏还在ProcedureMain流程里,并没有切换流程,我们可以看到游戏界面的背景和管道还在生成和运动。

所以当小鸟死亡时,积分界面脚本收到小鸟死亡事件,然后它打开了游戏结束界面,此时积分界面的脚本会执行OnPause(),会清除当前积分,并更改显示文本,同时OnPause()利用gameObject.SetActive(false);隐藏积分界面。

当游戏结束界面选择重新开始时,积分界面默认执行OnResume(),利用gameObject.SetActive(true);显示积分界面,ProcedureMain一直在执行OnUpdate()里的东西。

当在游戏结束界面选择返回主菜单时ProcedureMain流程执行了OnLeave(),把积分界面UI关闭了,切换至ProcedureMenu流程。

以上几点值得注意。如果不清楚可以自己在疑惑的地方打Debug.Log(),看看输出信息就知道其中执行顺序了。一开始可能感觉比较乱。

二、关于一些函数的提醒

在流程rocedureBase基类里有OnEnter()、OnInit()、OnOpen()、OnLeave()、OnUpdate()、OnDestroy()函数
在UIFormLogic基类里有 OnOpen()、 OnUpdate()、OnShow()、OnPause()、OnResume()、OnClose()函数
在EntityLogic基类里有OnHide()、OnUpdate()、OnHide()、OnShow()函数
这些函数得看看源代码,里面有解释,感觉会混淆,多用用,多体会体会

三、slider动态value值问题

slider这个滑条UI感觉比较坑。写的函数需要用到value值时,我们在按钮或滑条类想调用函数名时要先把脚本挂载到物体上,然后在UI的OnClick或OnValueChange处选择挂载了脚本的物体,这样就可以选择函数名了。但是sliderUI需要注意,我们如果想要获得滑动改变的value值并动态传递给函数里的value参数时,需要在sliderUI界面选择dynamic 值的函数名。否则value传参一直是固定的0,除非我们手动改。

例如:
slider滑条
比如下面这几行代码,我们想让上面slider滑动时的值动态的传递给OnMusicButtonChange函数的value变量。

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

我们得先让把上面代码脚本挂载到SettingForm这个预制体上。然后在slider界面“值改变时”选择这个预制体。
选择slider
这样我们就可以选择这个OnMusicButtonChange函数了,但是一定要记得选上面的Dynamic float,不能选择下面的Static Parameters,不然value值传递不到给OnMusicButtonChange,就是一个定值了!
在这里插入图片描述

四、图层数值大小提醒

图层的顺序很重要,值越大,越靠前,大值图层会覆盖小值图层。如果生成某个精灵看不到,有可能是图层被覆盖了,需要把它的图层值改大一点。

五、背景音乐记录

关于播放背景音乐这个事,是根据我们在Assets/GameMain/DataTables/配置的两个数据表(Musicte.txt、Scene.txt)来的。我们发现他们对应的编号和名称都是保持一致的。因为方便下面切换流程代码对编号的获取来播放背景音乐。

Music.txt如下

#	音乐配置表		
#	Id		AssetName
#	int		string
#	音乐编号	策划备注	资源名称
	1	菜单场景背景音乐	Menu
	2	主场景背景音乐	Main

Scene.txt如下

#	场景配置表			
#	Id		AssetName	BackgroundId
#	int		string	int
#	场景编号	策划备注	资源名称	背景音乐编号(没有就设置为0)
	1	菜单场景	Menu	1
	2	主场景	Main	2

下面是\Assets\GameMain\Scripts\Procedure\Builtin\ProcedureChangeScene.cs里的代码,我们主要看 m_BackgroundMusicId = drScene.BackgroundMusicId;这一句代码,他表示通过场景来获得背景音乐编号。

//读取流程状态机中的数据
            gotoSceneId = procedureOwner.GetData<VarInt>(Constant.ProcedureData.NextSceneId).Value;
            IDataTable<DRScene> dtScene = GameEntry.DataTable.GetDataTable<DRScene>();
            DRScene drScene = dtScene.GetDataRow(gotoSceneId);
            if (drScene == null)
            {
                Log.Warning("Can not load scene '{0}' from data table.", gotoSceneId.ToString());
                return;
            }
            GameEntry.Scene.LoadScene(AssetUtility.GetSceneAsset(drScene.AssetName), this);
            m_BackgroundMusicId = drScene.BackgroundMusicId;

然后通过GameEntry.Sound.PlayMusic(m_BackgroundMusicId);来播放对应场景的对应背景音乐的。

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 (m_BackgroundMusicId > 0)
            {
                GameEntry.Sound.PlayMusic(m_BackgroundMusicId);
            }

            m_IsChangeSceneComplete = true;
        }

这样我们就可以根据Music.txt和Scene.txt来放置不同场景下的音乐。框架程序自动帮我们播放了。如果不想播放可以查看音乐控制脚本:\Assets\GameMain\Scripts\Sound\SoundExtension.cs,里面有很多关于背景音乐的操作。
更多音乐音效的操作函数,可以看Assets\GameFramework\Scripts\Runtime\Sound\SoundComponent.cs

六、在打包AB资源时出现的问题

在打包过程中,首先在AssetBundle Editor里左侧AssetBundle List(0)下方选择Add手动添加资源文件名。如果是有父级目录的,需要用“/”来添加,比如UI/UIForms,这样就会得到下面这个效果,同时要在UIForms前打勾再选择Packed。
在这里插入图片描述
下图给UIForms选择了Packed。
在这里插入图片描述
其他同理直接点Add,输入右侧对应的包名就行了。我们可以看到,左右两侧的List名称是一样的。添加好后再给左侧每个包添加资源。选择名称一样的,然后选择“<<”箭头就可以把右侧的加到左侧了。
在这里插入图片描述
在这里插入图片描述
添加完了直接Save就行,它会在Configs目录下生成AssetBundleCollection.xml这个文件。


还有个问题就是我遇到了,就是在AssetBundle Builder界面,我的电脑屏幕显示界面不全,就像下面这样。

在这里插入图片描述
解决方法是在\Assets\GameFramework\Scripts\Editor\AssetBundleBuilder\AssetBundleBuilder.cs,这个脚本第28行window.minSize = window.maxSize = new Vector2(666f, 570f);,直接修改new Vector2(666f, 700f)第二个参数就行。修改数值按自己电脑显示为主,看得见就行 。下面是效果图
在这里插入图片描述
终于可以了,设置好了上面的信息后,点击Save,会生成AssetBundleBuilder.xml,然后我们点击Start Build AssetBundles 慢慢等待就行了。生成完成后我们在StreamingAssets目录会自动添加刚刚生成的AB包资源,StreamingAssets这是单机状态下的资源目录。

更改物体BuildIn下的编辑器资源模式的勾,运行成功就是成功打包了!
在这里插入图片描述


以上先记录这么多,其他后续再补充。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值