GameView内のマウス座標を得る方法

GameView はサイズによってマウス座標の値も変動するようで、

640*960 のプロジェクトをテストする際、GameView のサイズを狭くしてテストすると

マウス座標もそのサイズに依存して変わっているような状態になって困ったのでメモ。



// カメラオブジェクトを取得する
// 今回の例は NGUIのカメラを指定しているが、他のカメラの時も名前を合わせればよい
GameObject obj  = transform.Find("/UI Root (2D)/Camera").gameObject;

// マウス座標を縦横各種 0~1.0f の範囲に変換
Vector3    mpos = (obj.GetComponent<Camera>()).ScreenToViewportPoint ( Input.mousePosition );

// スクリーンサイズにその範囲をかければスクリーン上の座標が求まる
float xpos = mpos.x * PlayerSettings.defaultScreenWidth;
float ypos = mpos.y * PlayerSettings.defaultScreenHeight;


こうすると GameView のリサイズを気にしないでも大丈夫っぽい。

UnityEditor 内のクラスを使用しているが、iOS 実機でも動くのかは未検証。

NGUI の UIPanel のサイズを知る方法

Unity 上の Clipping の Size に当たる部分は、


UIPanel  panel = (UIPanel) GameObject.Find("YourObj").GetComponent("UIPanel");

float    pw    = panel.clipRange.w;
float    ph    = panel.clipRange.z;


で取得する。

You can't place widgets on a layer different than the UIPanel that manages them. を解決する方法

スクリプトでアトラスプレハブを読み込み、

それを作成したスプライトに割り当てようとしたら

以下の警告が出たが、解決したのでメモ。

[Warning]
-----------------------------------------
You can't place widgets on a layer different than the UIPanel that manages them.
If you want to move widgets to a different layer, parent them to a new panel instead.
-----------------------------------------




// このコードは警告が表示される (This code is displayed warning.)
//---------------------------------------------------------------

GameObject obj = new GameObject ("SpriteObjName");
UISprite sp = obj.AddComponent <uisprite> ();

sp.atlas  = yourLoadedAtlas;
sp.spriteName  = "yourSpriteName";

obj.transform.parent = GameObject.Find("yourParentOfTheSprite").transform;



// このコードは大丈夫 (This code have not warning.)
//---------------------------------------------------------------
UISprite sp = NGUITools.AddSprite ( GameObject.Find("yourParentOfTheSprite"), yourLoadedAtlas, "SpriteObjName" );
sp.spriteName  ="yourSpriteName";

スプライトを作る時は NGUITools.AddSprite を使おう。

NGUI のアトラスプレハブをスクリプトから読み込む時


NGUI の AtlasMaker でアトラスとスプライトを作成すると、

プレハブとシェーダと統合画像が同名になる為、



GameObject prefab = GameObject.Instantiate ( Resources.Load("your atlas" );
のようにすると、Unity が正しく認識できない場合がある。

なので、この場合は
GameObject prefab = GameObject.Instantiate ( Resources.Load("your atlas", typeof (GameObject) );
と、後ろに GameObject の型指定のパラメータを付けてやる。

NGUI で新しいスプライトをアトラスに登録する方法

※ この記事を書いた時点での NGUI のバージョンは、「 2.6.4 」



1. 「メニュー」の「NGUI」 > 「Open the Atlas Maker」を選択。



2. 「Create」ボタンの右のテキストフォームに新しく作りたいアトラスセットの名前を入力し

「Create」ボタンを押すと、それ用のプレハブが作成される。



3. 自分でアトラス化した画像を使うのではなく、

このアトラスセットに画像 1 つ 1 つを登録すると NGUI 側で 1 枚のスプライトにまとめてくれる。

また、PNG で逐一用意せずとも、PSD ファイルのままで良い。



4. 「Project」ビューから追加したい画像をクリックすると、

AtlasMaker ウィンドウの下部にそのスプライト名が表示され、

緑の「Add/Update All」ボタンが出現するので、このボタンを押す事で

そのスプライトがアトラスセットに追加される。



5. UV などテクスチャ座標はNGUIがざっくり決めてくれるが、別途変更したい場合は、

Projectビューのアトラスのプレハブ( 立方体を斜め絡みたようなアイコン )をクリックし、

Inspectorの下の方にある「Dimensions」で設定する。

その下にある「Border」は Sliced スプライトにしたい時の境界線を決める。

「Sprite ▼」を押すと、アトラスセットに追加したスプライトの中から、

どのスプライトの情報を変更するかが選択できる。

なお、各数値はまとめられた画像に合わせたものとなる。元画像の座標云々は登録後は関係ない。

まとめられた画像を PhotoShop 等で開いて確認したければ、

「~~ atlas」というプレハブと同じ名前で画像も作成されているので、

Projectビューのそれを右クリックし、「Show in Explorer」した後、他のツールで開く事ができる。



これを繰り返して自分好みのアトラスセットを作成していく。

Unity + NGUI + TweenScale でクリッピングが効かなくなる

ダイアログを NGUI で作ったので、出現時の演出でもと

NGUI の Example に入っている TweenScale を使用してスケーリングさせる事にした。

が、スケール中クリッピングしているテキストがもりっとエリアをはみ出して表示されてしまい困った。

結果、XY だけではなく Z もスケール比率を合わせてやらないと正しく表示されなかったのでメモ。