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

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

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

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

Unity

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

Q&A

解決済

1回答

1264閲覧

C#でプレハブごとに独立させるスクリプトの書き方

tom_honmono

総合スコア22

C#

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

Unity

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

0グッド

1クリップ

投稿2021/04/21 09:23

編集2021/04/21 09:24

ゲーム制作しています。
ある戦車のオブジェクト(Enemy)に、スクリプトがついています。
そのEnemyスクリプトは、高速で見えない球を発射するもの。
そして高速で発射されるオブジェクト(testBall)に、衝突したらEnemyのスクリプトのpublic変数を変更して教えてあげるスクリプトがついています。
それを感知したEnemyのスクリプトが、本物の球を出します。(これによって、プレイヤーが見えた瞬間に球を発射できるわけです。)

この高速に発射される球に付いている感知するtestBallスクリプトで、GameObject.Find(‘Enemy’)として、一つ目のスクリプトの中のpublic変数を操作しています。
しかし、このEnemyオブジェクトを複数設置してしまうとうまく機能しません。(二つ目以降に設置したプレハブは名前がEnemyではないですし、感知してもプレハブ自身から球を発射してくれません。)

なので、例えばEnemyから発射されるtestBallと、プレハブEnemy2から発射されるtestBall2をしっかり分割して、それぞれのテストボールの反応がそれぞれのエネミーの変数を変更して欲しいのです。

目指しているのは、プレハブをポンポン設置してもそれぞれ独立してくれることです。

thisとかを使って自分が発射されたEnemyを判別したりするのでしょうか?
調べてもよくわからなかったので、わかる方どうかお願いします。

そして今PCが電波に繋がらないので、スクリプトが必要であれば後でpcで書こうと思います。抽象的ですみませんが、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

本文から察するに、Instantiate(testBall);で生成していると思いますが、これの返り値はプレハブから生成されたオブジェクトなので、それを取得してメンバー変数などに格納すればよろしいかと思います。

この場合、同じプレハブから生成しても区別できるので、プレハブEnemyとEnemy2の構造が同じなのであれば、わざわざEnemy2を用意する必要はありません。

なお、thisは今のインスタンス自身(例えばtestBallスクリプトであれば、そのtestBall自身)を指すもので、例えばthis.fooは(他にfooが無ければ)fooと同じものです。
従って、今回とは関係ないはずです。
↑追記にあるように自分自身を返したいときは使いますね。失礼しました。


追記:

testBallが、自身の生まれたEnemy本体をFindする(?)方法等わかりますでしょうか。。。

以下のように、生成したときにEnemyを格納すればよろしいかと思います。

testBallのスクリプト

C#

1 public Enemy Shooter; // 発射元のEnemyを格納するための変数(プロパティのほうがいいかも?)

Enemyのスクリプト

C#

1 void shootTestBall() 2 { 3 var newTestBall = Instantiate(testBall) as GameObject; // testBallはプレハブ 4 newTestBall.GetComponent<TestBall>().Shooter = this; // TestBallはtestBallのスクリプト 5 }

投稿2021/04/21 12:41

編集2021/04/22 00:08
fiveHundred

総合スコア9774

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

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

tom_honmono

2021/04/21 16:03

回答ありがとうございます。やってみましたが、やはりプレハブにしてコピーすると最初の一体しか球を発射してくれません。おそらく、二体目以降のEnemyがFindするEnemyがすべて一体目のEnemyになってしまっています。その一体目のEnemyを倒すと、つぎは二体目のEnemyからのみ発射されます。 testBallが、自身の生まれたEnemy本体をFindする(?)方法等わかりますでしょうか。。。
fiveHundred

2021/04/22 00:04

回答に追記しました。 また、個人的な意見ではありますが、「GameObject.Find("~")」は、「名前を変えると動作しなくなるため、その度に修正しないといけなくなる」「同じ名前のオブジェクトが複数存在するとどれを参照するのかが分からなくなる」ため、使うのはあまりおすすめしません。
tom_honmono

2021/04/22 06:34

できました、ありがとうございます!!!!!! newTestBall.GetComponent<TestBall>().Shooter = this; を使えば、Findしなくても同じような効果があるんですね!!! 制作が完全に止まっていたので助かりました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問