[Unity] [NGUI] スクリプトからAtlasのスプライトを変更する

NGUIでスプライトをスクリプトから動的に変更するときに嵌ったメモです。

NGUIでは、スプライトはUISpriteコンポーネントで管理します。
あらかじめAtlasで作成したスプライトは、UISprite.spriteNameで設定できます。

	// スプライトコンポーネント取得
	UISprite sprite = this.GetComponent<UISprite>();

	// スプライト変更
	sprite.spriteName = "hogehoge";

しかし、スプライトのサイズは変更されません。
たとえば、小さなスプライトから大きなスプライトに変更すると、サイズが縮小された状態で描画されてしまいます。

したがって、スプライトの変更後にサイズも合わせて変更したい場合は一工夫する必要があります。

上記操作を行うスクリプトは以下のような形になります。

	// スプライトコンポーネント取得
	UISprite sprite = this.GetComponent<uisprite>();

	// スプライト変更
	sprite.spriteName = "hogehoge";

	// スプライトの位置・サイズ調整
	UISpriteData data = sprite.GetAtlasSprite();
	UIRect rect = sprite.GetComponent<uirect>();

	Vector3 tmpPos = rect.transform.localPosition;
	rect.SetRect(0, 0, data.width, data.height);	// サイズ変更
	rect.transform.localPosition = tmpPos;	// 位置をサイズ変更前に戻す

変更後のスプライトサイズに合わせてUISpriteのサイズを変更するために、
まずサイズの指定元と指定先のコンポーネントを取得します。

	UISpriteData data = sprite.GetAtlasSprite();
	UIRect rect = sprite.GetComponent<uirect>();

UISpriteDataのwidth、heightフィールドに変更後のスプライトのサイズが格納されています。
そして、サイズの指定先となるUIRectコンポーネントをspriteから取得します。

サイズをそのまま変更してしまうと、スプライトの座標がおかしくなってしまうため、
一時的に保存してあとで戻すようにします。
サイズの変更はUIRect.SetRect()メソッドにて行います。

	Vector3 tmpPos = rect.transform.localPosition;
	rect.SetRect(0, 0, data.width, data.height);	// サイズ変更
	rect.transform.localPosition = tmpPos;	// 位置をサイズ変更前に戻す

これで、サイズもスプライトに合わせて反映されるようになりました。

COMMENTS & TRACKBACKS

  • Comments ( 0 )
  • Trackbacks ( 1 )

コメントはまだありません。

  1. […] 【参考】[Unity] [NGUI] スクリプトからAtlasのスプライトを変更する | ftvlog […]