Unityが2Dモードである場合、なぜスケーリングとデフォルトのothographicサイズを採用しているのですか?


8

以前にSFML、XNA、Monogameなどを使用して2Dゲームを作成しました。画面に100pxのスプライトを表示すると、100px かかります。128pxタイルを使用して背景を作成する場合、最初のタイルは(0、0)にあり、2番目のタイルは(128、0)にあります。

一方、Unityには独自の奇妙な単位系があり、すべての変換、ピクセルから単位への変換、オソグラフィックサイズなどでスケーリングされます。つまり、私の質問は2つあります。

  1. Unityがデフォルトで2Dのこのシステムを持っているのはなぜですか?モバイル開発用ですか?私には見られない大きなメリットはありますか?
  2. Photoshopに128x128のスプライトがある場合、ゲームを実行するとUnityで128x128のスプライトとして表示されるように、環境を設定するにはどうすればよいですか?

デスクトップのみをターゲットにしていることに注意してください。


1
これが発生する理由は、Unityが最近2Dグラフィックスが組み込まれた3Dエンジンだったためです。しかし、すべてを処理する方法は、答えを見て、他の誰かが私よりも優れたアプローチを持っているかどうかを知りたいと思っています。
ジョッキング、2014年

UnityのGUI関数とGUITextureコンポーネントを使用すると、テクスチャを直接ネイティブサイズで画面に描画できます。docs.unity3d.com/Documentation/ScriptReference/GUI.html docs.unity3d.com/Documentation/Components/class-GuiTexture.html さらに柔軟性が必要な場合は、1U = 128pxなどの一貫したスケールを定義するのが最善策です。すべてのクワッド/スプライト/カメラに一貫して適用します。
DMGregory

UnityのGUIクラスは避けます。UnityのイミディエイトモードGUIはかなり非効率的であるため、新しいGUIシステムを構築しています(バージョン4.6で実際にリリースする予定です)。
ジョッキング

回答:


4

Unityでの2D座標とスケーリングの処理はかなり単純ですが、自明ではなく、他の開発ツールの動作とは異なります。これが発生するのは、Unityが最近2Dグラフィックスが組み込まれた3Dエンジンだったからです。

特に、Unityの1ユニットが画像の1ピクセルであるとは限りません。画像を2Dスプライトとしてインポートする場合、実際には1対1で設定できるPixels-to-Units設定がありますが、いくつかの理由でデフォルトの100:1のままにすることをお勧めします(物理エンジンが1で正しく動作しません。 1、そしてデフォルトは他の人のコードとの互換性のために優れています)。

このスケーリング設定は、すべての位置が100で除算されることを意味します。スケーリングを常に覚えている限り、それは非常に簡単です。スプライトを256ピクセル(たとえば)移動したい場合は、それを移動します2.56数値を小数点以下2桁/最も近いピクセルに丸めるユーティリティ関数を作成することもできます:Mathf.Round(float * 100)/ 100f


ピクセルパーフェクトカメラの設定については、まず正射投影カメラとして設定を解除します。カメラを選択すると、その設定には透視投影または正投影のドロップダウンがあります。遠近法は、物が3Dに見える一方で、正投影法はシーンをフラットに表示することを意味します。このドロップダウンのすぐ下にサイズがあります。カメラの正射投影サイズを、必要な画面のピクセル寸法の半分に設定します。

たとえば、ピクセルパーフェクトな1024x768の画面が必要だとします。つまり、カメラの高さは384ピクセルでなければなりません。これを100で除算すると(ピクセルと単位のスケールのため)、カメラサイズは3.84になります。繰り返しますが、その計算は単にSCREEN_SIZE / 2 / 100fです。


(私は他の答えが最初に来るのを待つのを待っていましたが、それは数日でした。2DToolkitを使用してUnityで2Dをやっていますが、組み込みの2D機能は比較的新しいです)


2

jhockingが言うように、それは2Dを3D IDEにシューホーンした結果です。しかし、解決策はありますが、それは少し難解です。

最初のステップは、プロジェクトペインからスプライトのインポート設定を開くことです。Texture TypeがSpriteまたはAdvancedに設定されると(Advancedには他の便利なオプションがありますが、最初に2Dプロジェクトを作成した場合はSpriteがデフォルトです)、デフォルトの100のPixels To Unitsフィールドがあります。

私はタイルシステムをいじくり回しているので、16x16ピクセルタイルを使用して、Pixels To Unitsを16に設定しています。計算は次のように機能します。 。PTU 16の16ピクセルキューブは、Unityスペースで1ユニットを占めます。

まだ試していませんが、PTUを1にすると、ピクセルが完璧になります。

しかし、正射投影カメラの設定は少し頭痛の種です。繰り返しますが、それはそのPixels to Units設定に基づいていますが、他にもいくつかのものがあります。基本的には、プレーヤーの設定からの画面の高さの半分(つまり、iPhone 5が何であれ、1080、768は気にすることはできません)をピクセルからユニットに分割したものです。


1

浮動小数点数の動作方法により、ピクセル単位は大きな世界を表現するのに適した方法ではありません。浮動小数点数を使用すると、非常に大きな数では精度が失われます。0に近い数値が最も精度が高くなります。したがって、一部のゲームエンジンは、MKSシステムのメトリック(メートル/キログラム/秒)を好む傾向があります。Unityはデフォルトでメートルに設定されているため、ゲームキャラクターは非常に高い精度で高さ1.0〜2.0メートルとして簡単に表現できます。

人間の男性の平均体重と身長は約50kg、身長1.8メートルです。高さが1200ピクセルの文字を作成しようとすると、その重量は約33,000ピクセル単位になります。その後、バスのような非常に重いオブジェクトをゲームに追加したい場合は、膨大な数のピクセル単位があります。これにより、衝突の計算が非常に不正確になる可能性があることを簡単に確認できます。

ピクセル単位を使用すると非常に決心している場合は、ピクセルとメーターの比率を簡単に計算できます。


しかし、これらすべては、物理学を使用する必要さえほとんどないほとんどの2Dゲームには当てはまりません。問題は、Unityが2Dのサポートを提案していることですが、それは非常に初歩的なものであり、2Dエンジンから本当に必要なものまで単純化するには多くの研究が必要です。
Kokodoko、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.