はらけんログ

unity触ったりバイクに乗ったり

【Unity】RectTransformのインスタンスとサイズの話

僕のunityを使ったお仕事では、だいたい(というか必ず)uGUIを使って実装するのだが、uGUIのGameObject(って表現があってるかわかんないけど)って普通のTransformと違ってちょっとめんどいだんよね。

 

なんで、毎回作る度にどっかしらつまずくんスよ。

ってことで、今日つまずいたとこを一応メモっとく。

 

 

uGUIをインスタンス化してなんかの子にするとき

まずは、uGUIのGameObjectをprefab化して、そいつをスクリプトでuGUIのGameObjectの子にインスタンス化するとき。

 

いつものTransformのGameObjectを子にインスタンス化するときは

 

public GameObject gObj; //uGUIのGameObject
public GameObject prefabObj; //上の奴の子にするprefab
void ObjInstantiate() //関数名は適当やで
{
GameObject ui= Instantiate ((GameObject)prefabObj);
ui.transform.parent = gObj.transform;
}

 とかって書くと思うんだけど、このとき

”Parent of RectTransform is being set with parent property. Consider using the SetParent method instead, with the worldPositionStays argument set to false. This will retain local orientation and scale rather than world orientation and scale, which can prevent common UI scaling issues.”

 っていう黄色エラーが出た。

 

まぁ黄色だから大丈夫だと思うんだけど、会社にいるプログラムの師匠に「わーにんぐ、きもい」って言われそうだった(ってか、見たことないエラーだったから自分でもキモイと思った。)ので、解決策を探した。

 

んで、こういう時は

ui.transform.parent = gObj.transform;

 のとこを

ui.transform.SetParent (gObj.transform);

 ってしたら黄色エラーが消えるんだってさ。

 

 

uGUIのサイズをスクリプトで変えるとき

RectTransformって普通のTransformの値のほかに、サイズとかアンカーとかピボットとかが追加されている。(Transformを継承してるからposition、rotation、Scaleもある)

 

んで、RectTransformはScaleで大きさを変えるんじゃなくて、Sizeってのを変えることでソースのImageに大きさをあわせることが多い。(ここも日本語あってるかわからん)

そのSizeってのはインスペクターで見るとWidthとかHeightって書いてあるやつね。

f:id:HarakeN:20161111183423p:plain

 

Sizeはpositionとかと違ってVector2なんすよ。

で、これにスクリプトで設定するには

 

public RectTransform uiObj;
void UiObjSize() //関数名は適当やで
{
uiObj.sizeDelta = new Vector2 (100,100); //サイズも適当やで
}

 

ってしてやれば指定の大きさにできるっぽい。