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

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

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

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

Unity

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

Q&A

解決済

1回答

2368閲覧

GameObject型変数に入れたゲームオブジェクトを動的に変更する方法はありますか?

ko_yu

総合スコア18

C#

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

Unity

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

0グッド

0クリップ

投稿2020/04/17 23:09

前提・実現したいこと

GameObject型変数に入れたゲームオブジェクトを動的に変更する方法とインスタンスの関係を教えて下さい。
節操なく敵キャラを生成してはDestroyしていると敵キャラの管理ができなくなりそうという不安から
一度に出現できる敵を10枠までと定め、IDやパラメータ、名前、prefabなどを敵の出現時にstatic変数に代入して枠内で使いまわそうと思ったのですがprefabの交換が上手くいきません。

■過程
staticで宣言したGameObject型変数enemy1に、敵キャラAのプレハブprefab_Aを用いてインスタンスしました。

イメージ説明

prefab_Aのプレハブを元にインスタンスが生成されました。
この敵キャラを色違いの別キャラに切り替えようと、Iキーを押すと以下の処理を走るように記述しました。

enemy1 = prefab_B;

enemy1に別の敵キャラのプレハブprefab_Bを代入しました。
しかし、敵キャラがシーン上で差し替わる気配はありません。
なのでenemy1をprefab_Bでインスタンスし直しました。

enemy1 = Instantiate(prefab_B, new Vector3(3.0f, 0.0f, 0.0f), Quaternion.identity);

イメージ説明

敵キャラBはインスタンスされましたが、敵キャラAが残ったまま敵キャラBが別のオブジェクトとしてインスタンスされました。

enemy1の中身のゲームオブジェクトを動的に切り替えて運用しよう!
staticな変数で宣言すれば、中身は常に一つしかないし安心!…と目論んでいたのですが、ダメでした。

Kキーを押すとenemy1のゲームオブジェクトをDestoryする記述を追加しました。
すると最後にインスタンスしたprefab_Bの敵が消えました。
再度Iキーを押してインスタンスを試したところGameObjectはすでに削除されているとNullエラーが帰ってきました。

GameObject変数に入っているゲームオブジェクトそのものを動的に切り替えるにはどうしたらよいでしょうか?

C#

1 2public class Enemy1 : MonoBehaviour 3{ 4 public GameObject prefab_A; 5 public GameObject prefab_B; 6 7 public static GameObject enemy1; 8 9 void Start() 10 { 11 enemy1 = Instantiate(prefab_A, this.transform.position, Quaternion.identity); 12 } 13 14 void Update() 15 { 16 if (Input.GetKey(KeyCode.I)) 17 { 18 19 //enemy1 = prefab_B; 20 21 enemy1 = Instantiate(prefab_B, new Vector3(3.0f, 0.0f, 0.0f), Quaternion.identity); 22 23 } 24 25 if (Input.GetKey(KeyCode.L)) 26 { 27 Debug.Log("自身がアタッチされてるオブジェクトを削除"); 28 Destroy(this.gameObject); 29 } 30 31 if (Input.GetKey(KeyCode.K)) 32 { 33 Debug.Log("中身のenemy1インスタンスを削除"); 34 Destroy(enemy1.gameObject); 35 } 36 37 } 38 39}

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問している事自体もう既に達成されてるので回答しようが無いですね

変数は入れ物なのでその中身を入れ替えたからといって前のモノが自動で破棄されるような事は無いです
寧ろそうされると大多数のエンジニアは困ります

どういう実装したいのか判りませんが最初に配列などに読み込んでおいてSetActiveで切り替えるなどしてみてはどうでしょう

投稿2020/04/18 06:31

Tto777

総合スコア189

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

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

ko_yu

2020/04/18 11:33

質問の仕方が拙く申し訳ありません。 int hoge = 1 をした後、hoge = 2 とすると、hogeの中身は1が書き換えられて消え、2になる。 GameObjectもそのような運用をしたかったのですが、 GameObject変数を書き換えることはシーンにあるゲームオブジェクトの参照先を変えているだけで、 シーン上にあるゲームオブジェクトそのものの中身の値を書き換えることはできない。 ということでしょうか? 自分のしたい実装としてはDestroyをせずにゲームオブジェクトが持っているprefabを書き換えて運用する、ということで、enemy1 = prefab_Bとすることでそれができるのではと試してみましたができず、 Instantiateではゲームオブジェクトの複製が生成されるので、敵を変える際どちらにせよDestroyとInstantiateをする必要がありそうです。 その2つをしない縛りでいくのであればご指摘の通り最初に全て読込み、SetActiveでオンオフする方法が良さそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問