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

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

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

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

Unity

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

Q&A

2回答

3127閲覧

Unity:デストロイしたオブジェクトを初期位置に再生成したい

bobnarita

総合スコア9

C#

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

Unity

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

0グッド

0クリップ

投稿2020/01/16 20:09

編集2020/01/17 07:25

###問題点
弓から矢のゲームオブジェクトを放ち、別のオブジェクトに当たったら矢をDestory();で消して、初期位置に再生成させたいのですが、エラーをはいて再生成できません。

下の画像が Destroyすると出て来るエラーです。
エラー
矢をarrowPrefabという名前にしてPrefab化しています。空のスクリプトを作りそこにArrowGeneratorというジュネレータスクリプトをアタッチして矢の再生成をお願いしています。
###コード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ArrowGenerator : MonoBehaviour 6{ 7 public GameObject projectilePrefab; 8 9 void Update () { 10 if (projectilePrefab == null) { 11 projectilePrefab = Instantiate (projectilePrefab) as GameObject; 12 } 13 } 14} 15

###実現したい事
上記スクリプトがうまく働くようにしたい。(消したオブジェクトをもと通りに再生成したい)
素人質問ですみません、、、。よろしくお願いします。

#####補足
Destroy()でなく、SetActive();を使う方法も考えたのですが、(他オブジェクトと衝突したあと、矢をSetActive(false);にして、3秒たったらfalseをtrueにして再表示といった感じ)これも私にはうまく働かせることができませんでした...。

>>hogehugapiyoさんの方法で試してみたところ、
Destroy();処理後にまたエラーが出てしまいました。
Destroy前
Destrou後

またこれだと初期は矢が配置されているので矢が2本表示されてしまいました。
イメージ説明
Hierarchy内の様子

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

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

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

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

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

Hawn

2020/01/17 09:49 編集

>Destroy();処理後にまたエラーが出てしまいました。 そのprojectilePrefabには「Hierarchy」では無く「Project」のPrefabをドラッグ&ドロップして下さい。 >初期は矢が配置されているので矢が2本表示されてしまいました。 初期配置の矢は削除してしまえば良いかと思います。 それとDestroyの処理部分はどのようになっているでしょうか? 「Inspector」から格納して参照している作りであればそこも修正が必要かもしれません。
bobnarita

2020/01/17 17:59

「Project」のPrefabを入れると、arrowPrefabに取り付けたスクリプト内の、変数をpublicにして「Inspector」から参照したオブジェクトとの接続が切られた状態になってしまいます.... 他にも弓と矢を繋ぐSpringJoint2DのConnected Rigid Body の欄がNoneになります。 Destroy部分はarrowController.csというスクリプトをarrowPrefabにアタッチしていて、そのスクリプト内で、 ``` void OnTriggerEnter2D(Collider2D other){ if(other.gameObject.tag == "Respawn"){ Destroy(this.gameObject); } } ``` という処理をしています。
guest

回答2

0

質問への追記・修正、ベストアンサー選択の依頼の内容を踏まえて

変数をpublicにして「Inspector」から参照したオブジェクトとの接続が切られた状態になってしまいます....

他にも弓と矢を繋ぐSpringJoint2DのConnected Rigid Body の欄がNoneになります。

生成時に参照出来るように作り変えて下さい。
Awake()Start()の関数内で変数に代入すれば良いです。
出来ない場合はまた質問に追記して下さい。

Destroy部分は自身を消すのであれば問題無いかと思います。

投稿2020/01/18 02:57

編集2020/01/18 05:33
Hawn

総合スコア1222

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

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

0

問題はprojectilePrefabです。

if (projectilePrefab == null)で、nullだったら生成しようとしていますが
そもそも、これがnullならInstantiate (projectilePrefab) as GameObject;は望んだ処理の実現ができなくなります。nullを生成しようとしているからです。

今回の場合、Prefabはコピー元の原本になるのでこれに新しい参照を代入するのではなく
生成したオブジェクトは別ものとして扱うと良いかと思います。

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class ArrowGenerator : MonoBehaviour 6{ 7 public GameObject projectilePrefab; // Prefab 8 private GameObject _arrow; // 生成したオブジェクト 9 10 void Update () { 11 if (_arrow== null) { 12 _arrow= Instantiate (projectilePrefab) as GameObject; 13 } 14 } 15}

投稿2020/01/17 00:42

hogefugapiyo

総合スコア3302

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

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

bobnarita

2020/01/17 07:15

回答ありがとうございます! ですが、矢を放ってデストロイさせたときにArroeGeneratorに接続したprefabのデータが消去されて同じエラーが出てしまいました...。補足の欄にその状況の画像を載せるのでもし良ければ見てください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問