GameFramework框架教程很多都是面向纯新手的,稍微再深入一点的东西就没有了,只能是看着打飞机的demo照猫画虎的研究。
以下都是在实际开发中遇到的问题,在大佬们看来有些不应该称之为问题,没办法自己太菜了,还是需要多多沉淀多多学习,遇到新的问题会继续记录…
1.问题描述
使用GF框架打AB包时,点击按钮后无反应,Console无报错,指定路径下却已经生成了空的文件夹
原因+解决:
是因为表格被占用,且该提示信息不在Error中,一般警告信息容易被忽略,把占用的表格关掉即可
2.问题描述
打飞机Demo在unity编辑器中通过AB包的形式加载资源,材质丢失(此时打包到手机上应该是没有问题的)
解决:
切换到安卓平台,修改渲染方式为OpenGL
3.问题描述
编辑器模式下使用EPPlus读取gf中DataTables中的文件,读取失败报错:(使用编辑器拓展开发一个可以读取配表的工具,发现报错了,EPPlus应该是不支持.csv的文件,动了个歪脑筋,把配表都转换成xlsx来实现读取)
解决:
这是因为gf中的表格是.csv的文件,EPPlus应该是不支持.csv的文件,可以使用EPPlus把.csv的文件转换成xlsx,具体做法参考
unity编辑器拓展使用具体功能的第6点
4.问题描述
使用ab包模式加载资源,使用后处理相关的文件时在切换场景时报错:GameFrameworkException: GameFramework.Resource.ResourceManager+ResourceLoader+AssetObject.Asset PoolGameFramework.Resource.ResourceManager+ResourceLoader+AssetObject.Asset Pool', target type is 'UnityEngine.Rendering.VolumeProfile', target value is 'SampleSceneProfile (UnityEngine.Rendering.VolumeProfile)'.
原因+解决:
无需对后处理文件进行打ab包,对ab包的工作原理不是很理解,一股脑的先把所有资源打进去了,后处理的文件在场景中是有引用的,把这些资源取消打ab后解决
5.问题描述
再次显示实体时报错
具体复现的流程:首次是能够正常显示实体的,当切换场景后再切回来重新显示实体时报以上错误。
原因+解决:
原因就是:首次显示实体时修改了实体的父物体到了新的场景下,在切换场景时会把场景中的物体都卸载掉,导致再次显示实体时找不到了。
解决:不要修改实体的父物体即可解决。
6.问题描述
多个UI切换时,不能使用 GameEntry.UI.OpenUIForm( );
要使用GameEntry.UI.RefocusUIForm(GameEntry.UI.GetUIForm(UIFormId.DefineFaceForm).UIForm,this);
7.问题描述
显示实体时,在OnShowEntitySuccess回调中设置实体的位置,有时候可以正确设置到指定的值,有时候却不行,位置归零了。暂不知道原因…
原因+解决:
原因:暂时未知
解决:在实体中的OnShow方法中设置位置
8.问题描述
使用GF自带的下载资源页面时文字发生重叠(几天后记录文章时复现的时候正常了,很奇怪。。。 )
原因+解决:
原因:项目中使用了URP,相机的RenderType不正确
解决:修改为 Overlay后效果正常
9.问题描述
GF加载ab包资源时,提示依赖资源加载错误,明明我ab包中打入该资源。如图
原因+解决:
原因:图中的材质球中有多张贴图,而贴图和材质球打成了两个ab包,首次启动时只下载了材质球的ab包,导致材质球获取不到贴图
解决:把贴图和材质球打到了一个ab包中
10.问题描述
目前这个项目需要实现点击按钮下载对应的资源,由于GF热更资源没法同时多个进行只能一个一个的下载,导致用户点击过快时没法打到预期效果
原因+解决:
原因:好像设计如此,说法好像是叫不能并行下载?
解决:使用队列的方式,把用户要下载的资源依次下载。
// 队列中保存的单个请求
private struct UpdateRequest
{
public string GroupName;
public UpdateResourcesCompleteCallback Callback;
}
// 更新队列与状态
private readonly Queue<UpdateRequest> m_UpdateQueue = new Queue<UpdateRequest>();
private bool m_IsUpdating = false;
public void EnqueueUpdate(string resourceGroupName, UpdateResourcesCompleteCallback onUpdateComplete)
{
if (string.IsNullOrEmpty(resourceGroupName))
{
Debug.LogError("资源组名称为空");
return;
}
// 入队
m_UpdateQueue.Enqueue(new UpdateRequest { GroupName = resourceGroupName, Callback = onUpdateComplete });
// 如果不在更新,则立即启动下一次
TryStartNext();
}
private void TryStartNext()
{
if (m_IsUpdating || m_UpdateQueue.Count == 0)
return;
UpdateRequest req = m_UpdateQueue.Dequeue();
m_IsUpdating = true;
Debug.Log($"开始更新资源组:{req.GroupName}");
GameEntry.Resource.UpdateResources(req.GroupName, (group, success) =>
{
// 调用用户回调
req.Callback?.Invoke(group, success);
// 标记结束
m_IsUpdating = false;
if (!success)
{
Debug.LogError($"资源组 {req.GroupName} 更新失败,中止后续更新。");
// 清空队列,不再继续
m_UpdateQueue.Clear();
}
else
{
Debug.Log($"资源组 {req.GroupName} 更新完成,继续下一个。");
// 启动下一次
TryStartNext();
}
});
}
调用逻辑:
IEnumerator DownloadResourceGroup(string resourceGroupName)
{
bool isCompleted = false;
GameEntry.ResourceManager.EnqueueUpdate(resourceGroupName,((group, result) =>
{
if (result)
{
Debug.Log("资源组更新完成: " + resourceGroupName);
isCompleted = true; // Set the completion flag to true
}
else
{
Debug.LogError("资源组更新失败: " + resourceGroupName);
isCompleted = true; // Set the completion flag to true even on failure to avoid blocking
}
}));
// Wait until the resource group update is completed
while (!isCompleted)
{
yield return null; // Wait for the next frame
}
}
GF菜鸡群:684702145
欢迎各位大佬进群交流沟通!