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

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

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

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

Unity

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

Q&A

解決済

2回答

842閲覧

Prefabで生成した敵から銃弾が生成出来ない

Neet-Saikou

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2020/01/08 09:25

編集2020/01/17 18:39

前提・実現したいこと

敵をPrefabにて生成して、その敵(Enemy)から銃弾(EnemyBullet)が発生しない。

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

敵はPrefabにて生成できるが、その生成した敵から銃弾が発生しない。

追加問題

1つ目の画像が同時に生成されたEnemy(Prefab)の個数であり、2つ目の画像はそのうちの1つのPrefabの持つスクリプトであり、3つ目はそのうちの2つのPrefabが持つスクリプトである。何故同時に3つもPrefabが生成されるのか、1つ目のPrefabのスクリプトはなぜ効果を失ってしまったのかも不明である。これらの原因も知っている方がいましたら、教えていただけると幸いです。
イメージ説明
イメージ説明
イメージ説明

C#

ソースコード
敵の生成コード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyGenerator : MonoBehaviour { public GameObject EnemyPrefab; float span = 25.0f; float delta = 0; private const float V = 150f; private const float W = 50.0f; public GameObject Player; private Transform Playertrans; // Start is called before the first frame update void Start() { Playertrans = Player.GetComponent<Transform>(); } // Update is called once per frame void Update() { float Playerlong = Playertrans.position.x + V; float Playerheight = Playertrans.position.y + W; this.delta += Time.deltaTime; if (this.delta > this.span) { this.delta = 0; GameObject go = Instantiate(EnemyPrefab, new Vector3(Playerlong, Playerheight, 0.0f), Quaternion.identity); } } }

銃弾の生成コード(敵(Enemy)の目の前に生成されるように設定)

using System.Collections; using System.Collections.Generic; using UnityEngine; public class EnemyBulletGenerator: MonoBehaviour { public GameObject EnemyBulletPrefab; float span = 1.0f; float delta = 0; private const float V = -0.5f; public GameObject Enemy; private Transform Enemytrans; // Start is called before the first frame update void Start() { Enemytrans = Enemy.GetComponent<Transform>(); } // Update is called once per frame void Update() { float Enemylong = Enemytrans.position.x + V; float Enemyheight = Enemytrans.position.y; this.delta += Time.deltaTime; if(this.delta > this.span) { this.delta = 0; GameObject go = Instantiate(EnemyBulletPrefab, new Vector3(Enemylong, Enemyheight, 0.0f), Quaternion.identity); } } }

試したこと

特に特筆すべきことはできていません。考えましたがどうすればいいかわかりませんでした。Enemyを複製して設置しても変わらず生成されませんでした。

補足情報(FW/ツールのバージョンなど)

Unity 2020.2.14f1 Personal

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

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

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

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

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

fiveHundred

2020/01/08 09:29

ソースコードは以下のように「```」で囲んでください。 ```C# public class Foo : MonoBehaviour { } ```
nskydiving

2020/01/08 13:42

EnemyBulletGenerator.Update()が呼び出されていることは確認済みですか?
Neet-Saikou

2020/01/09 03:26

今後から囲みます。失礼しました。 Prefabではない、最初に設置した敵(Enemy)からはEnemyBulletGeneratorが呼び出され、銃弾が生成されるのですが、それ以降の敵(EnemyPrefab)からは何故かEnemyBulletGeneratorが呼び出されず、銃弾が生成されないという状態です。
nskydiving

2020/01/09 03:57

質問欄は「編集」ボタンから修正できますので、「```」で囲んでください。 コードが見づらいと回答が付きづらくなりますので。
Neet-Saikou

2020/01/09 07:56

丁寧に本当にありがとうございます! teratail初心者なもので………
Bongo

2020/01/11 15:57

EnemyBulletGeneratorはどのオブジェクトにアタッチしているでしょうか? EnemyGeneratorの方でしたらシーンのヒエラルキー上に置いた空のオブジェクトにアタッチする...といった手があるでしょうが、もしEnemyBulletGeneratorでも同じようにしているとすると現状のスクリプトでは複数の敵オブジェクトを扱うことができないのではないかと思うのですが...
Neet-Saikou

2020/01/12 13:38

EnemyBulletGeneratorは空のゲームオブジェクトにアタッチしています。 やはり無理なのでしょうか…… やり方を変えるしかないのでしょうか
guest

回答2

0

ベストアンサー

EnemyBulletGeneratorがシーン上に一つだけだとすると、現状のスクリプトでは複数の敵インスタンスを区別することができず意図通りにならなそうですね。
EnemyBulletGeneratorをシーン上の空オブジェクトではなく敵プレハブにアタッチ、EnemyBulletGeneratorEnemyには敵プレハブ自身をセットしておくのはどうでしょうか?
こうしておくと敵生成時にEnemyBulletGeneratorもそれぞれの敵に個別にインスタンスが作られますので、各EnemyBulletGeneratorは自分がアタッチされている敵インスタンスについて弾生成を担当することになり、敵が複数でもそれぞれの敵から弾が発射されるんじゃないかと思います。

図

投稿2020/01/12 20:53

Bongo

総合スコア10807

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

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

Neet-Saikou

2020/01/17 12:39

最初からその状態でした。しかし何故かEnemyのPrefabのみが起動し、Enemy(Prefab)にアタッチしているEnemyBulletのPrefabは起動しませんでした。そのため最初の一機を除いて、敵のみが生成され続けました。
Bongo

2020/01/17 13:47

ダメでしたか?もっと詳しい状況を知りたいのですが、まずプレイモードにして敵を生成させ始めてから一旦一時停止ボタンでプレイモードを止め、その状態でヒエラルキー上の「うまくいっている最初の敵」と「うまくいかない後の敵」についてインスペクターのスクリーンショットをご提示いただけますでしょうか。
Neet-Saikou

2020/01/17 18:12 編集

すいません!自分の確認ミスでした。 Bongoさんのおっしゃる通り、しっかりprefabからも銃弾は発射されました。 本当に失礼しました。
Neet-Saikou

2020/01/17 18:35 編集

しかしclone(Prefab)が毎回同時に3つ生成されてしまったり(上に画像も載せました)、1つ敵を破壊してしまうとそれ以降のPrefabは何故か全てEnemyを見失い、銃弾を生成しなくなってしまいました。もしよろしければこのことについてもアドバイスを頂きたいです。
Bongo

2020/01/17 22:49

なんだかインスペクターの様子が想定外ですね... Projectビュー上で敵プレハブを選択したときのインスペクターの様子はどうなっているでしょうか。私の想定したスクリプトアタッチ状況は「敵プレハブにはEnemyBulletGeneratorとEnemyControllerが各1つずつアタッチされている」というものなのですが、そうなってはいなかったりしますかね? たとえばもしEnemyGeneratorまで敵プレハブにアタッチしてしまうと、それも敵生成時に敵ごとに複製されてしまうので、それらが芋づる式にいくつも敵を生成してしまうかもしれません。また、敵プレハブ1つに対して同じ名前のスクリプトをいくつもアタッチしてしまうと、それらがそれぞれ重複して作動し異常動作を起こすでしょう。 アタッチ状況がそんな風になってしまっているようでしたら、不要なスクリプトはインスペクター上のスクリプト名を右クリック、またはその右端の歯車ボタンクリックで操作メニューを表示し「Remove Component」で削除してしまってください。 また、EnemyGeneratorはEnemyBulletGeneratorとは逆にシーン上に1つだけでないとまずいように思いますので、EnemyGeneratorは追記依頼欄で申し上げた「シーンのヒエラルキー上に置いた空のオブジェクトにアタッチする」という形にしてみてください。
Neet-Saikou

2020/01/20 04:43

すいません突如Unityのエラー?でデータが吹っ飛び、かなりの数のスクリプトが消滅しました…… 今復旧作業中ですので少々お待ちください。 折角教えていただいているのに本当にすいません。
Neet-Saikou

2020/02/06 18:07

お久しぶりです。 ようやくスクリプトの修正が終わりました…… Bongoさんのおっしゃる通りEnemyGeneratorを敵Prefabから外した結果、cloneの大量生成は防ぐことが出来ました。 しかし生成されたEnemyPrefabでは、セットしていたEnemyBulletとEnemyが共にmissing状態になり、何も発射されませんでした。 本当に時間が空いてしまいましたが、答えていただければ幸いです……
Bongo

2020/02/06 22:23 編集

うーん、まだうまくいかない状態ですか。データ破損から復旧したばかりとのことですので、まだどこかに異常が残っているんでしょうかね... とりあえず現時点で「Project」ビュー上で「Enemy」プレハブを選択した時のインスペクターの様子はどうなっているでしょうか? それともう一つ、なるべくご質問者さんの状況を詳しく再現したいので、プレイモードではない状態での「Hierarchy」ビューの様子もご提示いただけるとありがたいです。
Neet-Saikou

2020/02/12 05:22

すいません、自分が見ていたのは「Project」ビューではなく「Hierarchy」ビューでした…本当に失礼しました。 「Project」ビューにおいて「Enemy」プレハブのスクリプトが設定されていませんでした。ご指摘ありがとうございます。 それからBulletが無限に消えずに無限に生成されるという問題が発生していたのですが、Bongoさんの以前のアドバイスを基にGeneratorが重複していることに気づき、解決することが出来ました。 約1か月もの間、途中失踪したにも関わらず、初心者の頭の悪い質問に付き合っていただき本当にありがとうございました。
guest

0

Start メソッドや Update メソッドが呼び出されない場合、そもそもスクリプトが正しくアタッチされていない可能性があります。

Inspector ウィンドウでゲームオブジェクトに意図したスクリプトが設定されているか確認してみてください。

投稿2020/01/10 02:16

nskydiving

総合スコア6500

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

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

Neet-Saikou

2020/01/11 12:30

EnemyBulletの動きのスクリプトもEnemyBulletの生成スクリプトも共に他のゲームオブジェクト同様に正しくアタッチされていました。
nskydiving

2020/01/12 13:49

Start メソッドや Update メソッドが呼び出されていないのであれば、正しくアタッチできていないのではないかと思いますが、正しくアタッチされていることはどうやって確認したのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問