Unity 排坑攻略

arimx 发布于 22 天前 0 次阅读


用 Unity 遇到的坑太多,写个文章提醒自己。

Text Mesh Pro

部分汉字显示为方框

相关字体勾选 Multi Atlas Textures(默认未勾选)。

显示中文或日文时卡顿

相关字体取消勾选 Clear Dynamic Data On Build(默认勾选)。

Audio Mixer

线性调节分贝值

Mathf.Max(Mathf.Log10(volume) * 20, -80f)

Camera

摄像机固定 16 : 9 比例

using UnityEngine;

public class CameraRescaler : SingletonMono<CameraRescaler> {
    private int ScreenSizeX = 0;
    private int ScreenSizeY = 0;

    private void RescaleCamera() {
        int width = Screen.width;
        int height = Screen.height;
        if(Screen.fullScreen) {
            width = Screen.mainWindowDisplayInfo.width;
            height = Screen.mainWindowDisplayInfo.height;
        }

        if(width == ScreenSizeX && height == ScreenSizeY) {
            return;
        }

        if(Screen.width != width) {
            Screen.SetResolution(width, height, Screen.fullScreen);
        }

        float targetaspect = 16.0f / 9.0f;
        float windowaspect = (float)width / height;
        float scaleheight = windowaspect / targetaspect;
        Camera camera = Camera.main;

        if(scaleheight < 1.0f) {
            Rect rect = camera.rect;

            rect.width = 1.0f;
            rect.height = scaleheight;
            rect.x = 0;
            rect.y = (1.0f - scaleheight) / 2.0f;

            camera.rect = rect;
        }
        else {
            float scalewidth = 1.0f / scaleheight;

            Rect rect = camera.rect;

            rect.width = scalewidth;
            rect.height = 1.0f;
            rect.x = (1.0f - scalewidth) / 2.0f;
            rect.y = 0;

            camera.rect = rect;
        }

        ScreenSizeX = width;
        ScreenSizeY = height;
    }

    private void Start() {
        RescaleCamera();
    }

    private void Update() {
        RescaleCamera();
    }
}

Localization

本地化文本初次加载有延迟

相关 Table 勾选 Preload,或手动 Preload。

预加载时报错 OperationException : Failed to initialize localization, could not preload asset tables

在尝试使用 LocalizationSettings 前,等待其初始化完成。

LocalizationSettings.InitializationOperation.WaitForCompletion();

(这会导致主线程堵塞,有必要时需要用协程等方法处理。)

System.Diagnotics

运行中打开文件夹

System.Diagnostics.Process.Start(folder)

EventSystems

PointerEventData 获取鼠标输入按键

eventData.button

Screeen

禁止响应系统全屏快捷键

(6.0) Player > Resolution and Presentation > Allow Fullscreen Switch 取消勾选。