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

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

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

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

Unity

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

Q&A

解決済

2回答

7585閲覧

【Unity】オブジェクト同士の紐づけ

Kusa1024

総合スコア17

C#

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

Unity

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

0グッド

1クリップ

投稿2016/08/28 11:16

編集2016/08/29 07:16

Unityを使用してゲームを作成しているのですが、Instantiate()を使用して作成したgameObjectと呼び出し元のgameObjectの紐づけがうまくできず困っています。

具体例として、MainObjectと、NewObjectというprefabsを作成し、それぞれのスクリプトを

C#

1public class MainObject : MonoBehaviour{ 2 gameObject hoge; 3 4 public void CreateObject(){ 5 hoge = Instate(newObject); 6 } 7 8 public void Close(){ 9 Destroy(hoge); 10 } 11}

C#

1public class NewObject : MonoBehaviour{ 2 gameObject mainObj; 3 4 public void OnClick(){ 5 MainObject mainObj = GameObject.Find("MainObject").GetComponent<BattleMain>(); 6 hoge2.GetComponent<MainObject>().Close(); 7 } 8}

とした場合、mainObj中のhoge = nullとなってしまいNewObject側からOnClickを実行してもCreateObject()で新たに作成したhogeが削除できませんでした。mainObjを

C#

1 [SerializeField] 2 private gameObject mainObj;

とし、予めMainObjectのprefabsをアタッチした場合も、mainObj中のhoge = nullとなってしまいダメでした。

理想としては、NewObject側からCreateObject()を呼び出したgameObject(MainObject)中の、Close()関数を呼び出し、hogeを削除したいのですが、このようなことは可能なのでしょうか?

つたない説明で申し訳ないのですが、アドバイスよろしくお願いします。

///////////////////////////////////////////////////////////////////////
問題部分を抜き出したコードに不備があったため、サンプルコードを作成しました。こちらでは、正常に処理が行えるため、今一度自分なりにコードを見直してみようと思います。

上記コード同様,MainObjectと、そこから作成されるNewObjectのプレファブを作成し、それぞれのスクリプトを

C#

1using UnityEngine; 2using UnityEngine.UI; 3using System.Collections; 4 5public class MainObject : MonoBehaviour { 6 GameObject hoge; 7 8 [SerializeField] 9 private Canvas canvas; 10 [SerializeField] 11 private GameObject newObject; 12 13 public void CreateObject() 14 { 15 if (hoge == null || !hoge.activeInHierarchy) 16 { 17 hoge = Instantiate(newObject); 18 hoge.transform.SetParent(canvas.transform, false); 19 } 20 21 } 22 public void Close() 23 { 24 Destroy(hoge); 25 } 26}

C#

1using UnityEngine; 2using System.Collections; 3 4public class NewObject : MonoBehaviour { 5 6 GameObject mainObj; 7 8 public void OnClick() 9 { 10 MainObject mainObj = GameObject.Find("MainObject").GetComponent<MainObject>(); 11 mainObj.GetComponent<MainObject>().Close(); 12 } 13}

としており、MainObject中のcanvasには、MainOjectが配置してあるcanvasを、newObjectにはNewObjectをアタッチしてあります。

CreateObject()が呼び出されると、NewObjectであるhogeが作成され、作成されたhogeのOnclick()が呼び出されると、MainObject側のClose()を実行し、hogeを削除することができます。

自分のプログラムでは、NewObject側から、MainObjectのClose()を呼び出した際、hoge = null となってしまっており、hogeを削除することができません。特にエラーなどは出ていません。何か、心当たりがある方また、改善案等ありましたら、ぜひアドバイスお願いします。

長文失礼いたしました。よろしくお願いいたします。

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

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

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

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

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

sakura_hana

2016/08/29 01:23

エラーは何か表示されていますか? 変数の定義部分のgameObject、定義されていない変数newObjectやhoge2など、そのまま使うとエラーになる構文が存在しています。原因を正しく探す為にも、出来るだけ正確なコードを記載してください。
Kusa1024

2016/08/29 06:52

ご指摘ありがとうございます。問題のプログラムが、かなり煩雑なコードになっているため、問題部分だけ取り出してみたのですが、懈怠なものになってしまいました。 問題を再現しようとサンプルコードを作成してみたのですが、こちらでは正常に処理ができたため、今一度自分なりに模索してみます。 作成したサンプルコードを質問に追加しておきます。
sakura_hana

2016/08/29 09:29

オブジェクトの生成自体は出来ているなら、OnClick()内の MainObject mainObj = GameObject.Find("MainObject").GetComponent<BattleMain>(); hoge2.GetComponent<MainObject>().Close(); この部分が問題になっているかと思われます。
guest

回答2

0

自己解決

新しく作成したオブジェクトが、GameObject.Findでメインオブジェクトを探さずに、生成したタイミングでメインオブジェクトをアタッチしていたため、オブジェクト同士の紐づけができていなかったようです。

お騒がせしました。

投稿2016/09/03 07:26

Kusa1024

総合スコア17

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

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

0

おはようございます。
NewObjectクラスからMainObjectクラスのClose()を実行したいなら

C#

1public void OnClick() 2{ 3 MainObject mainObj = GameObject.Find("MainObject").GetComponent<MainObject>(); 4 mainObj.Close(); 5}

でいいのではないでしょうか?

投稿2016/08/29 23:11

nico29

総合スコア76

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問