質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1485閲覧

unity2D SetParentによる親子設定で子のlocalPositionが効かなくなる原因

JectABC

総合スコア34

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/12/06 07:37

編集2017/12/08 00:26

###前提・実現したいこと
ある子オブジェクトを違う親オブジェクトの子にして、また元に戻した時に元のTransformから大きく外れ、またlocalPositionで設定し直してもその外れた場所から動きません。原因は何が考えられますか?
目標としては元の親のTransform(0,0,0)に出現し、localPositionなどで位置を移動できれはいいのですが...

イメージとしては以下のような感じです。
1.子A生成
親A
子A
親B

2.移動
親A
親B
子A

3.戻す
親A
子A
親B

###発生している問題・エラーメッセージ

特になし

###該当のソースコード
このコードは実際のコードではないですが、子Aに対する操作は同じです。

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour{ public Transform Atransform; //親A public Transform Btransform; //親B public Button Obj; //子A public Button Pre; void Start(){ Obj = Resources.Load<Button>("Path"); Prefab_create(); ParentMove(); } public void Prefab_create(){ Pre = Instantiate(Obj,Atransform.localPosition,Atransform.localRotation); Pre.transform.SetParent(Atransform); Pre[preCnt].transform.localScale = Vector3.one; } public void ParentMove(){ Obj.transform.SetParent(Btransform); Obj.transform.localPosition = new Vector3(40,40,0); Obj.transform.SetParent(Atransform); Obj.transform.localPosition = new Vector3(60,60,0); } }

###試したこと
追記:例3の「戻す」の場面で、オブジェクトを元の親に戻した後も親Transform内で移動させたいのですが、試したところZ方向だけ指定した値にきちんと動作し、X方向,Y方向についてはどんな値を入れても同じ場所に行きます。(最後のコード)
例えばObj.transform.localPosition = new Vector3(60,60,100);
とするとそのオブジェクトのInspectorでは x 280, y 344 z 100 となります。x、yは何を入れてもこの値になります。

###補足情報(言語/FW/ツール等のバージョンなど)
unity 2017.2.0f3
C#

この例にある親Aと親Bの上にもルートノードがあり、親Aと親Bはその子で、深さ的には同じです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SetParentには第2引数があります。初期値はtrueでtrueの場合、ワールド上の位置がTransformに代入されます。おそらくこれをfalseにすると解決するかもしれませんのでお試しください。

public void SetParent(Transform parent, bool worldPositionStays);

worldPositionStays
If true, the parent-relative position, scale and rotation are modified such that the object keeps the same world space position, rotation and scale as before.

https://docs.unity3d.com/jp/540/ScriptReference/Transform.SetParent.html

C#

1gameObject.transform.SetParent(newParent, false);

###[追記]親のRectTransformのpivotが原因かもしれません
親のpivotの位置が「x0.5 , y0.5」以外だとlocalPositionの値もそれをふまえた値が代入されます。一度親のpivotが「x0.5 , y0.5」以外でないか確認してみてください。検証したものをプラグインにしてみました。よければ見てみてください。
http://firestorage.jp/download/6880185a695f585900277b836b671cf8d26d006b

###[追記]pivotなどを考慮して場所を計算するのは大変なのでボタンが収まる親オブジェクトを用意する
ボタンが収まる親オブジェクトを用意すると比較的計算が楽になります。
ですが、何かのタイミングで親オブジェクトのpivotを触って計算しているのを忘れる可能性もあるのでスクリプトで制御するか、もしくは子を移動するのではなくオブジェクトの表示/非表示で対応するかした方がいいと思います。

計算方法は説明すると長くなってしまうのでボタンが収まる親オブジェクトのサンプルを用意しました。そのコードを見ながらご自分の環境にマッチするように計算してみてください。

http://firestorage.jp/download/9d74c0ae9529781ba2513cf62c6f44d952a5b086

投稿2017/12/06 08:41

編集2017/12/10 15:59
IShix

総合スコア1724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JectABC

2017/12/07 17:06

丁寧な回答ありがとうございます。今まで設定しなくても思うところに行ってくれたのでSetPearentの第二引数は知りませんでした。ですがやはり直りません。親はImage型、子はButton型です。SetPearentによる親子設定は間違っていませんが親ノードから外れたところに子が出現してしまいます。SetPearent出現か所すべてにfalseを設定してもダメでした
JectABC

2017/12/08 17:33

確認したところ、centerになっています。親Aの中心に三角?が4つあります。 画像を貼ったら伝わりやすいのですが、どうやって貼るのがわからず...
IShix

2017/12/09 18:13

追記しました。ご確認お願いします!
JectABC

2017/12/10 07:36

確認しました!プラグインのpivotNotCenterの現象と同じことが起こっていましたので、pivotを確認して0.5でない親を直しましたが変化は見られませんでした。未だ親の外に出てしまいます。 しかし、pivotCenterプラグインを元に実際のUIを再現したところ思っていた動作が確認できて一歩前進できた気がします! ちなみに実際UIというのは 親A(Image) 子A(Button) 親B(Image) scroll View View port Content⇦ここと親Aを行き来する このような感じなのですが、View portとContentのAnchorsがCenterではないのが気になります。関係ないでしょうか?
IShix

2017/12/10 16:00

そうですね。それが原因です。詳細は追記しましたので見てみてください。
JectABC

2017/12/11 19:40

分かりやすい解説、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問