/// <summary> /// Set content scale factor. /// </summary> /// <param name="designResolutionX">Design resolution of x axis.</param> /// <param name="designResolutionY">Design resolution of y axis.</param> /// <param name="screenMatchMode">Match mode.</param> public static void SetContentScaleFactor(int designResolutionX, int designResolutionY, UIContentScaler.ScreenMatchMode screenMatchMode) { UIContentScaler.designResolutionX = designResolutionX; UIContentScaler.designResolutionY = designResolutionY; UIContentScaler.screenMatchMode = screenMatchMode; constantScaleFactor = false; ApplyChange(); }
// バトルスペースのアスペクト比を設定 private void UpdateCameraViewport(Camera tCamera, float aw, float ah, float dx, float dy, float dw, float dh) { if (tCamera == null) { return; } float tSW = Screen.width; float tSH = Screen.height; ScreenMatchMode tScreenMatchMode = screenMatchMode; if (tCamera.targetTexture != null) { // バックバッファのサイズを基準にする必要がある tSW = tCamera.targetTexture.width; tSH = tCamera.targetTexture.height; } float sx, sy, sw, sh; // 想定アスペクト比(仮想解像度) float tVW = aw; float tVH = ah; float vw, vh; // 仮想解像度での表示領域 float tRX = dx; float tRY = dy; float tRW = dw; float tRH = dh; float rx, ry, rw, rh; sx = 0; sy = 0; sw = 1; sh = 1; rx = 0; ry = 0; rw = 1; rh = 1; if ((tSH / tSW) >= (tVH / tVW)) { // 縦の方が長い(横はいっぱい表示) // Debug.LogWarning( "縦の方が長い" ) ; vw = tVW; vh = tVH; // 完全に 9 : 16 にすると、フェードなどで 1 ライン余計なものが見えてしまうので、少し正方形寄りにする。 if (tScreenMatchMode == ScreenMatchMode.Expand) { // 常にアスペクトを維持する(Expand) 縦に隙間が出来る sx = 0; sw = 1; sh = tSW * vh / vw; sh = sh / tSH; sy = (1.0f - sh) * 0.5f; } else if (tScreenMatchMode == ScreenMatchMode.Width) { // 横の仮想解像度を維持する(Width) 全体表示 縦方向の仮想解像度が増加 sx = 0; sw = 1; sy = 0; sh = 1; tVH = tVW * tSH / tSW; } else if (tScreenMatchMode == ScreenMatchMode.Height) { // 縦の仮想解像度を維持する(Height) 全体表示 横方向の仮想解像度が減少 sx = 0; sw = 1; sy = 0; sh = 1; tVW = tVH * tSW / tSH; // 解像度が減少した分表示位置を移動させる tRX = tRX - ((vw - tVW) * 0.5f); } } else { // 横の方が長い(縦はいっぱい表示) // Debug.LogWarning( "横の方が長い" ) ; vh = tVH; vw = tVW; // 完全に 9 : 16 にすると、フェードなどで 1 ライン余計なものが見えてしまうので、少し正方形寄りにする。 if (tScreenMatchMode == ScreenMatchMode.Expand) { // 常にアスペクトを維持する(Expand) 横に隙間が出来る sy = 0; sh = 1; sw = tSH * vw / vh; sw = sw / tSW; sx = (1.0f - sw) * 0.5f; } else if (tScreenMatchMode == ScreenMatchMode.Height) { // 縦の仮想解像度を維持する(Height) 全体表示 横方向の仮想解像度が増加 sx = 0; sw = 1; sy = 0; sh = 1; tVW = tVH * tSW / tSH; } else if (tScreenMatchMode == ScreenMatchMode.Width) { // 横の仮想解像度を維持する(Width) 全体表示 縦方向の仮想解像度が減少 sx = 0; sw = 1; sy = 0; sh = 1; tVH = tVW * tSH / tSW; // 解像度が減少した分表示位置を移動させる tRY = tRY - ((vh - tVH) * 0.5f); } } //---------------------------------------------------------- if (tRW > 0) { rx = tRX / tVW; rw = tRW / tVW; } else { // 0以下ならフル指定 rx = 0; rw = 1; } if (tRH > 0) { ry = tRY / tVH; rh = tRH / tVH; } else { // 0以下ならフル指定 ry = 0; rh = 1; } if (rx < 0) { rw = rw + rx; rx = 0; } if (rx > 0 && (rx + rw) > 1) { rw = rw - ((rx + rw) - 1); } if (rw > 1) { rw = 1; } if (rw == 0) { rx = 0; rw = 1; } if (ry < 0) { rh = rh + ry; ry = 0; } if (ry > 0 && (ry + rh) > 1) { rh = rh - ((ry + rh) - 1); } if (rh > 1) { rh = 1; } if (rh == 0) { ry = 0; rh = 1; } // Debug.LogWarning( "sx:" + sx + " sw:" + sw + " rx:" + rx + " rw:" + rw ) ; // Debug.LogWarning( "sy:" + sy + " sh:" + sh + " ry:" + ry + " rh:" + rh ) ; tCamera.rect = new Rect(sx + rx * sw, sy + (sh - ((ry + rh) * sh)), rw * sw, rh * sh); }