1)限制Unity帧率的方式
2)只在编辑器内,纹理不开启Read&Write情况下,如何获取纹理所有颜色值
3)如何在FBX剔除Lit.shader依
4)如何在iPhone 12mini设备上禁止竖屏
这是第373篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
Q:目前我们想把游戏设置为30帧,是通过Application.targetFrameRate实现的;但是会有一些兼容性问题,比如一些设备会动态调整设备刷新率导致游戏帧率过低(比如设备从120HZ动态降为60HZ时,游戏就从30帧掉为15帧了),我们也尝试过跟进设备的刷新率变化动态调整Application.targetFrameRate,但是一些设备还是出问题,主要是一些支持高刷新的设备,如120HZ、180HZ,设备在标准模式下本身会动态调整刷新率的,节约能耗。
不知道大家有没有相关的经验或者更好的解决方案?
A:可以尝试挂一个Update脚本,估计可以跟上高刷新的设备120HZ、180HZ的动态调整刷新率。
感谢NG週@UWA问答社区提供了回答
Q:只想在编辑器内优化一些纹理图片,纹理不开启Read&Write。
目前方案如下,但是会有几个问题:
1. LoadImage只支持PNG、JPG格式,像TGA、PSD格式则返回为空。
2. 对于那些几十MB的PNG纹理,也是返回空。
请问有无其他方式?
代码如下:
var texture = AssetDatabase.LoadAssetAtPath(assetPath);
var bytes = File.ReadAllBytes(assetPath);
var new_texture = new Texture2D(texture.width, texture.height);
var res = new_texture.LoadImage(bytes);
if (res == false)
{
Debug.LogError($"错误提示:{assetPath}纹理资源LoadImage失败", texture);
return null;
}
var colors = new_texture.GetPixels32(); // 获取到所需颜色数组
A1:可以试试以下方法:
Texture2D texture = AssetDatabase.LoadAssetAtPath
(assetPath); // 你的纹理 byte[] rawTextureData = texture.GetRawTextureData(); Texture2D finalTex = new Texture2D(texture.width, texture.height, texture.format, false); finalTex.LoadRawTextureData(rawTextureData); finalTex.Apply(); var colors = finalTex.GetPixels32(); // 获取到所需颜色数组 请注意,所有这些方法都是在绕过Read/Write Enable的限制时的替代品,而不是直接的解决方案。如果可能,最好还是在导入纹理时启用Read/Write Enable以获得更好的性能和更简单的纹理操作。
另外一个方法:可以设置一个Camera的TargetTexture为一个RenderTexture,接着使用Graphics.Blit将目标纹理渲染到这个RenderTexture上。然后,你可以通过ReadPixels函数将RenderTexture读取为Texture2D。这种方法不依赖于Read/Write Enable。
扩展阅读:《高效访问纹理数据,持续优化整体性能》
感谢NG週@UWA问答社区提供了回答
A2:我之前用过@NG週说的办法,是可行的,不过我当时只处理PNG图片。
另外离线处理纹理,可以考虑使用Job来并行化处理,效果很高。
感谢junbin.liu@UWA问答社区提供了回答
Q:测试发现只能通过后处理才能去掉Lit.shader依赖,尝试使用AssetDatabase.LoadAssetAtPath(fbxPath)然后执行下面代码,并不能去掉依赖。请问还有什么其他办法吗?
protected void OnPostprocessModel(GameObject model)
{
var renderers = model.GetComponentsInChildren();
foreach (var renderer in renderers)
{
// 默认fbx会引用Lit.mat,会引起ab包冗余,导入时去掉
foreach (var material in renderer.sharedMaterials)
{
if (material != null && material.name == "Lit")
{
renderer.sharedMaterials = new Material[0];
}
}
}
// 去掉fbx默认自带的材质球
ModelImporter importer = (ModelImporter)base.assetImporter;
if (importer != null)
{
if (importer.materialImportMode != ModelImporterMaterialImportMode.None)
{
importer.materialImportMode = ModelImporterMaterialImportMode.None;
importer.SaveAndReimport();
}
}
}
A:可以试试在打包阶段,打AssetBundle之前,去掉Lit.mat对lit.Shader的依赖。
Cube.prefab,就是Unity默认的Cube做成的Prefab。
var prefabGO = AssetDatabase.LoadAssetAtPath
(“Assets/Editor/Cube.prefab”); var renderer = prefabGO.GetComponent (); renderer.sharedMaterial.shader = null;
感谢范世青@UWA问答社区提供了回答
Q:使用的Unity引擎是2020.347f1,已经在打包时候设置了横屏,然后又使用了以下代码设置,其它机型没问题但对面的机器还是能竖屏。
Screen.orientation = ScreenOrientation.AutoRotation;
Screen.autorotateToLandscapeLeft = true;
Screen.autorotateToLandscapeRight = true;
Screen.autorotateToPortrait = false;
Screen.autorotateToPortraitUpsideDown = false;
想要禁止竖屏,设置横屏在安卓和大部分苹果上没问题,但在iPhone 12mini上却可以竖屏,请问还有其它方法吗?
A1:先确定iPhone 12mini的出包工程跟其他苹果设备的是否是同一个,接着排除有没有不小心在Xcode工程里面设置了竖屏模式,还有就是给iPhone 12mini装一个同类型的游戏,看看能不能横屏,排除是不是手机装了强制竖屏插件问题。
感谢NG週@UWA问答社区提供了回答
A2:遇到过一次,是手机系统的Bug,打开任何游戏都能切换横竖屏,重启下手机然后好了。
感谢jj@UWA问答社区提供了回答
封面图来源于网络
今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。
UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com