头图

1)限制Unity帧率的方式
2)只在编辑器内,纹理不开启Read&Write情况下,如何获取纹理所有颜色值
3)如何在FBX剔除Lit.shader依
4)如何在iPhone 12mini设备上禁止竖屏


这是第373篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

UWA社区主页:community.uwa4d.com
UWA QQ群:465082844

Platform

Q:目前我们想把游戏设置为30帧,是通过Application.targetFrameRate实现的;但是会有一些兼容性问题,比如一些设备会动态调整设备刷新率导致游戏帧率过低(比如设备从120HZ动态降为60HZ时,游戏就从30帧掉为15帧了),我们也尝试过跟进设备的刷新率变化动态调整Application.targetFrameRate,但是一些设备还是出问题,主要是一些支持高刷新的设备,如120HZ、180HZ,设备在标准模式下本身会动态调整刷新率的,节约能耗。

不知道大家有没有相关的经验或者更好的解决方案?

A:可以尝试挂一个Update脚本,估计可以跟上高刷新的设备120HZ、180HZ的动态调整刷新率。

感谢NG週@UWA问答社区提供了回答

Editor

Q:只想在编辑器内优化一些纹理图片,纹理不开启Read&Write。

目前方案如下,但是会有几个问题:
1. LoadImage只支持PNG、JPG格式,像TGA、PSD格式则返回为空。
2. 对于那些几十MB的PNG纹理,也是返回空。

请问有无其他方式?

代码如下:

var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(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<Texture2D>(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问答社区提供了回答

Asset

Q:测试发现只能通过后处理才能去掉Lit.shader依赖,尝试使用AssetDatabase.LoadAssetAtPath<GameObject>(fbxPath)然后执行下面代码,并不能去掉依赖。请问还有什么其他办法吗?

protected void OnPostprocessModel(GameObject model)
    {
        var renderers = model.GetComponentsInChildren<Renderer>();
        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<GameObject>(“Assets/Editor/Cube.prefab”);
var renderer = prefabGO.GetComponent<Renderer>();
renderer.sharedMaterial.shader = null;

感谢范世青@UWA问答社区提供了回答,欢迎大家转至社区交流:

iOS

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
UWA学堂:edu.uwa4d.com
官方技术QQ群:465082844


侑虎科技
62 声望21 粉丝

UWA官网:[链接]