(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

RectTransformのPositionを変更してからsizeDeltaを変更するとPositionの変更が戻される【Unity】【トラブルシューティング】


このエントリーをはてなブックマークに追加

タイトル通りなのですが、RectTransformのPositionを変更してから

sizeDeltaを変更すると、Positionの変更が戻されるようになりました。

追記 : Unity 2018.2で修正されたようです。




実際の例で説明すると、以下のようなImageがあった時に


f:id:kan_kikuchi:20180407210016j:plain


RectTransformのPositionを変更した後、sizeDeltaを変更すると、

Positionの変更が戻され、なかった事になります。(正確にはzだけは正常に変更される。)

RectTransform rectTransform = gameObject.GetComponent<RectTransform>();

//位置変更(この時点では位置は変更されている)
rectTransform.localPosition = new Vector3(-100, -100, -100);

//サイズ変更(ここで位置の変更が戻され、なかった事にされる!)
rectTransform.sizeDelta = new Vector2(150, 50);

//サイズ変更の後に位置変更すれば問題はない
//rectTransform.localPosition = new Vector3(-100, -100, -100);

f:id:kan_kikuchi:20180407210104j:plain


最初の「なりました」という言い方からお気付きかもしれませんが、

ちょっと前まではこういう事は起きませんでした。


具体的なバージョンで言うと、

2017.3.1.p1, 2017.4.0f1, 2018.1.0b7, 2018.1.0b13ではPositionの変更が戻され、

5.3.4f1, 5.6.5f1, 2017.3.1f1ではPositionの変更は戻されませんでした。


なので2017.3.1.p1辺りからの仕様変更もしくはバグのようです。

また、エディタ上だけでなく実機でも同様の動作をします。


ちなみに、Awakeで位置を変えて、Startでサイズを変えるといった

別フレームで位置とサイズの変更を行う場合には、Positionの変更は戻されません。

private void Awake() {
  //位置変更
  RectTransform rectTransform = gameObject.GetComponent<RectTransform>();
  rectTransform.localPosition = new Vector3(-100, -100, -100);
}

private void Start () {
  //サイズ変更(位置の変更はそのまま!)
  RectTransform rectTransform = gameObject.GetComponent<RectTransform>();
  rectTransform.sizeDelta     = new Vector2(150, 50);
}

f:id:kan_kikuchi:20180407210945j:plain


余談ですが、Canvsを非Activeにした状態で

ゲームを開始するとRect Transformの諸々0になるという注意点もあったりします。