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

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

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

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

Unity

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

Q&A

解決済

2回答

11484閲覧

【unity】親を取得してその座標を取得したい

sales

総合スコア4

C#

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

Unity

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

0グッド

1クリップ

投稿2019/08/12 04:46

unity始めたばかりで的外れな聞き方になってしまうかもしれませんがご了承ください。
まず、HierarcheyにはA,Bという二つの画像(スプライト?)がある。
そしてBにスクリプトを貼り(アタッチして?)そのスクリプトにより親の取得諸々をしたい。
しかし、そのスクリプトの書き方がわからない。
流れはなんとなくイメージ出来ているが書き方がわからない。

あるサイトの解説では
「GameObject parent = gameobject.transform.parent.gameObject;」
で、親が取得できると書いてあったが、

自分は
GameObject型の変数parentにgemeobject.transform.parentという領域にあるgameObjectを代入
という構造になっているのかなぁと思った。(この解釈は間違っていると思うので正しい解説をして欲しい。)
そもそも親の取得とは「オブジェクト用の変数に親オブジェクトを代入する」という認識で正しいのか。
ならオブジェクト用の変数はどう宣言すればよいのか、上のサイトの人はたまたまparentという変数名に
したのか、それとも決まった書き方があってスペース含めた謎の文のようになっているのか。
また、上のスクリプトでは自分の手札(HierarcheyにあるAとB)のうちの親にしたいAという画像(スプライト?)
についての情報が関わっていないと思われる。スクリプト中のどこかに「A」という名前を使わないと
親にする対象が分からないんじゃないかと思い、これも疑問に思った。

これより、「親を取得するソースコードの解説」と出来れば「取得した親オブジェクトの座標の取得の仕方」
を解説して欲しいです。publicとかprivateとかvector3とかまだまだ理解してないです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Unityにおけるオブジェクトの位置、親子構造を司るクラスがTransformであり、全てのGameObjectは特有のTransformを持っています。
このGameObjectが持っているTransformはtransformという名前のプロパティで取得することができます。
また、Transformは自身の親を持っており、これはparentという名前のプロパティで取得することができます。(親がない場合、parentはnullになっています)
よって対象とするGameObjectをgoとして、goの親が欲しかったらgo.transform.parentという風に取得できます。
ですが、親子構造を司るのはあくまでもTransformであるため、go.transform.parentもTransform型です。
ですので、このTransformが属しているGameObjectを取得する必要があります。
Transformが属しているGameObjectはgameObjectという名前のプロパティで取得することができます。
よって、GameObject go の親GameObjectはgo.transform.parent.gameObjectで取得することができます。

また、最初に書いたとおりTransformは座標も司っており、これはpositionという名前のプロパティで取得することができます。

よってGameObject goの座標であればgo.transform.positionで取得することができ、
goの親オブジェクトの座標であればgo.transform.parent.positionで取得することができます。(Transform.parentはTransform型なので位置はこれから直接取得することができます)

投稿2019/08/12 05:33

Ram.Type-0

総合スコア424

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

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

sales

2019/08/12 06:48

回答ありがとうございます。 Transform型に機能の詰まった袋を代入して、GameObject型に袋付きの実体を代入するイメージですね。しかし、「Transfomは自身の親を持っている」の所がよくわかりませんでした。始めは親がいない状態だと思うので何かしら親を据える設定をしないといけないのでしょうか。
sales

2019/08/12 07:12

上の親を据える設定、というのは自分でもよくわからなくなりました。 void Start(){ transform.parent = GameObject.Find("y").transform; } とするとこのスクリプトを貼ったBという画像がyの子になったので いまいち消化しきれていない感じがしますが時間をかけて理解していこうと 思います。
guest

0

GameObject parent = 〜;
は「parentというGameObject型の変数を作り、〜を代入します」という意味です。つまり変数の宣言と代入を同時にやっています。
parentは単なる変数の名前なので(既存でなければ)何でもいいです。GameObject oya = 〜;とかでもOK。
イコールの前後のスペースは無くてもいいですが、他のスペースは取るとエラーになります(試してみてください)。


gameObject.transform.parent.gameObject
は「このスクリプトが付いているGameObjectに付いているTransformの親のGameObject」を指します。

gameObject=(先頭の場合)このスクリプトが付いているGameObject
transform=(.以降の場合)そのオブジェクトのTransformクラス
parent=そのTransformの親(Transform型)
gameObject=(.以降の場合)そのオブジェクトのGameObjectクラス
が繋がっています。(「日本の中にある東京都の中にある新宿区」みたいなイメージ)
これもpublic変数を利用しているだけなので、詳しくは「[超初心者向け]UnityでのC#の基礎(2)class - Qiita」などを参照してください。

ちなみに親の取得とは厳密に言うとこっちの方だけです。
(取得した親オブジェクトを変数に入れずに使うことも出来る為)
取得したオブジェクトを後で使うので変数に入れた、というのがGameObject parent = gameObject.transform.parent.gameObject;です。


なお、「親の取得」と「特定のオブジェクトを親にする」は別の話です。
AとBが親子関係にまだなっていないのであれば、「Aを取得」して「親にする」という2つの処理が必要です。
これについては「unity 他オブジェクトを取得」「unity 親にする」あたりでググってみてください。

あと座標についても「unity 座標取得」とでも調べれば出ますが、
変数の使い方とオブジェクトの取得の理解が無いとそこから先に進むのが難しいので、
チュートリアルをやるなり理解出来るまで調べつつ手を動かすなりした方がいいかと思います。

投稿2019/08/12 05:29

編集2019/08/12 05:31
sakura_hana

総合スコア11427

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

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

sales

2019/08/12 15:49 編集

回答ありがとうございます。 では自分が見たサイトの方はgameObject.transform.parent.gameObjectというゲームオブジェクトを 「parent」という名前のGameObject型変数に代入していたのですね。このことから、この文の前に gameObject.transform.parent = 親にする予定のtransform;などの親を決める文があったのでしょうね。
sakura_hana

2019/08/12 08:25

回答にも書きましたが「親の取得」と「特定のオブジェクトを親にする」は別物と思ってください。 確かに「gameObject.transform.parent = 親にするtransform;」が前に記述されているかもしれませんが、無いかもしれません。というか普通は両者を並べて書くことはしません。 //親にしたいオブジェクト取得 Transform myParent = 親にしたいTransform; //親にする transform.parent = myParent; //親の位置を取得 Vector3 pos = myParent.position; 書くとしたらこんな感じです。わざわざ親にした後にtransform.parentを取得し直す意味が無いからです。 いきなり「GameObject parent = gameObject.transform.parent.gameObject;」をしているなら、このコードが実行されるより前(多くの場合はシーンを作った段階)に親子関係を設定してあってそれを取得している、という使い方をしていると考えた方がいいでしょう。 (もちろんそうでない場合もあるので、「参考サイトでは何をやっているのか」はきちんと見た方がいいです。質問する際にリンクを張るのも有用です)
sales

2019/08/12 16:00

親にしたいオブジェクトを取得する=親のtransformを自分の変数に入れる 親にする=子になる予定のtransform.parentに↑の変数を代入 ということだったのですね。いまいちよくわからない所がハッキリしました。 また、Vector3型変数の使い方や、GameObject型の中身とTransform型の中身 の使い分けなどがまだよくわかっていないのでぼちぼち作りながら 理解していきます。返信ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問