学习了自然妙有猫仙人的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滑动时的值动态的传递给OnMusicButtonChange函数的value变量。
public void OnMusicButtonChange(float value)
{
GameEntry.Sound.SetVolume("Music", value);
}
我们得先让把上面代码脚本挂载到SettingForm这个预制体上。然后在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下的编辑器资源模式的勾,运行成功就是成功打包了!
以上先记录这么多,其他后续再补充。