

※ iOSやAndroid向けに開発したUnityタイトルをWindowsストアアプリとして移植する場合に遭遇する問題です。

Windows
8.1ではWindowsストアアプリのウィンドウサイズを変更することができるのですが、UnityからビルドしたWindowsストアアプリを実行し、ウィンドウサイズを変更すると、画面の両側が切れた状態で表示されます。

フルスクリーンの状態  
![フルスクリーンの状態の画像](https://i.stack.imgur.com/r5ZLx.png)

ウィンドウサイズを変更した状態  
![ウィンドウサイズを変更した状態](https://i.stack.imgur.com/CDRqg.png)

元のアスペクト比を維持したまま表示を行うにはUnity C# Scriptでどんなコードを書けばよいでしょうか？


CC BY-SA 4.0
2014-12-11T09:43:12.380
1523
2018-12-29T03:49:31.200
2018-12-29T03:49:31.200
19769
2099
question
windows unity3d windows-store-apps
UnityからビルドしたWindows ストアアプリで、ウィンドウサイズの変更に対応するには？


期待した通りに動かすにはTerrainなどプレー中に削除されないGameObjectのどれかにC# Scriptを追加し、
[UnityEngine.WSA.Application](http://docs.unity3d.com/ScriptReference/WSA.Application.html).windowSizeChangedのイベントハンドラーを実装します。なぜかUnityのドキュメントには記載されていません。

メインカメラをmainCameraという名前にしていると仮定し、次のコードで解決できます。
デバイスの向きが変わった時も、アスペクトを維持したまま動作します。

<http://gamedesigntheory.blogspot.jp/2010/09/controlling-aspect-ratio-in-
unity.html> にあるコードを参考にしています。

[code]

    void Start()
    {
    #if UNITY_METRO
        UnityEngine.WSA.Application.windowSizeChanged += Application_windowSizeChanged;
    #endif
    }
    
    void Application_windowSizeChanged(int width, int height)
    {
        // set the desired aspect ratio (the values in this example are
        // hard-coded for 16:9, but you could make them into public
        // variables instead so you can set them at design time)
        float targetaspect = 16.0f / 9.0f;
    
        // determine the game window's current aspect ratio
        float windowaspect = (float)width / (float)height;
    
        // current viewport height should be scaled by this amount
        float scaleheight = windowaspect / targetaspect;
    
        // obtain camera component so we can modify its viewport
        Camera camera = GameObject.Find("mainCamera").camera;
        if (camera == null)
        {
            return;
        }
    
        // if scaled height is less than current height, add letterbox
        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 // add pillarbox
        {
            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;
        }
    
    }
    
[/code]


CC BY-SA 3.0
2014-12-11T09:43:12.380
1524
2014-12-11T10:34:12.390
2014-12-11T10:34:12.390
2099
2099
1523
answer