Unity 2D:異なるディスプレイ解像度のスプライトでの作業



バージョン4.3以降、Unityは2Dグラフィックスを使用できるようになりました。この更新の直前にCorona SDKから切り替えたばかりなので、ほとんどの新しい標準ソリューションが気に入りました。

しかし、私が気に入らなかったのは、さまざまな画面解像度に合わせてスプライトを最適化するための標準ツールの欠如でした。これは、低電力デバイスのパフォーマンスに非常に大きな影響を及ぼします。



もちろん、2D Toolkitに似たものを使用してこの問題を解決できますが、すべてを自分でできるのに75ドルを支払うのはなぜですか?



Unity公式フォーラムのユーザーによると、少なくともUnityのバージョン5のリリースまで、開発者は2D機能をすぐに拡張する予定はなく、今のところユーザーはこの問題を自分で解決する必要があります。 答えを見つけることを期待してインターネットをサーフィンしていると、2014年の夏のNordic Game Conference 2014でUnity開発者の1人による興味深いレポートに出会いました。 このレポートの資料を使用して、さまざまな解像度のディスプレイをサポートするという問題の解決策を作成しました。



開始するために必要なのは、スプライトのアトラスの最高解像度バージョンのみです。アトラスの品質を低下させる操作の残りはUnity内で発生します。



スプライトの準備



そのため、最初の段階では、SD、HD、ウルトラHDのさまざまな解像度のスプライトアトラスを整理する必要がありますが、接尾辞1x、2x、4xを使用します。



スプライトアトラスを取得します。この場合は「spritesheet1@4x.png」です。インスペクターで必要なパラメーターを選択し、必要に応じてスプライトエディターでアトラスをカットします。 Project Browserでアトラスのコピーをさらに2つ作成し(cmd + D、ctrl + D)、名前のサフィックスが「@ 2x」、「@ 1x」になるように名前を変更し、Max Sizeプロパティを2倍から4倍小さい値に変更しますそれに応じて。



スプライトはResourcesフォルダーに配置する必要があります。ない場合は作成します。 これにより、プログラムの実行中にこのフォルダーからファイルをダウンロードできます。











Pixels Per UnitおよびFormatフィールドに注目します。1つ目は、スケールを変更せずにシーンに合わせてスプライトのサイズを選択するのに役立ちます。2つ目は、正しい色、ビルドサイズ、GPUリソ​​ースの使用にとって非常に重要です。 このテーマに関するすばらしいマニュアルがあります。



プレハブの準備



ここではすべてが簡単です。接尾辞「@ 2x」が付いたスプライトアトラスに基づいてゲームオブジェクトを収集し、必要なアニメーションやその他のチップを追加します。 オブジェクトをプレハブとして保存します。

ほとんどのデバイスにはhd解像度があるため、接尾辞「@ 2x」が選択されました。ほとんどの場合、あまり多くの作業を行う必要はありません。



スクリプト



このスクリプトは、任意の数のSpriteRendererコンポーネントで動作します。 アニメーションやその他には影響しません。主なことは、アトラスとSpriteRendererのスプライトの名前が同じであることです。 この機能は、スプライトの解像度を変更するためだけでなく、たとえば別のキャラクタースキンを作成する場合など、スプライトをまったく異なるものに置き換えるためにも使用できます。



スクリプトの基本原則は次のとおりです。パブリック変数spriteSheetがあり、オブジェクトのスプライトが配置されているアトラスの名前を渡します。







GetQualityメソッドを使用して、処理しているディスプレイを見つけます(私の目的では、画面の高さに焦点を合わせるのに十分でした)。



次に、画面の解像度に関するデータを持つManageQualityメソッドで、正しい接尾辞を持つアトラスのすべてのスプライトをスプライト配列にロードします。 レンダラー配列で、オブジェクト内にあるすべてのSpriteRendererコンポーネントをロードします。 sprites配列で名前でスプライトを探し、SpriteRendererコンポーネントのスプライトが存在する場合はそれに割り当てます。 すべてのResources.UnloadUnusedAssets()を完了します。このメソッドはメモリから未使用のアセットをアンロードします。



ここにスクリプトがあります
using UnityEngine; using System.Collections; using System; public class ConstObjectsQuality : MonoBehaviour { public string spriteSheet; private string qSuffix; void Awake(){ qSuffix = GetQuality (); ManageQuality (); } private string GetQuality(){ int screenH = Screen.height; print (screenH); if (screenH > 1440) return "4x"; else if (screenH < 720) return "1x"; else return "2x"; } private void ManageQuality(){ if (qSuffix == "1x" || qSuffix == "4x") { Sprite[] sprites = Resources.LoadAll<Sprite>(spriteSheet + "@" + qSuffix); if (sprites != null) { SpriteRenderer[] renderers = GetComponentsInChildren<SpriteRenderer>(true); if (renderers.Length > 0) { foreach (SpriteRenderer r in renderers) { if (r.name != null){ string spriteName = r.sprite.name; Sprite newSprite = Array.Find(sprites, item => item.name == spriteName); if (newSprite) r.sprite = newSprite; } } } } } Resources.UnloadUnusedAssets (); } }
      
      







また、このスクリプトを使用して、シーン内のすべてのスプライトを変更できます。 これを行うには、SpriteManagerなどの新しいオブジェクトを作成し、このスクリプトを追加しますが、レンダラー配列の定義を変更します。



 SpriteRenderer[] renderers = GameObject.FindObjectsOfType<SpriteRenderer>();
      
      





ご清聴ありがとうございました。この記事がお役に立てば幸いです。



All Articles