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

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

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

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

Q&A

解決済

3回答

3050閲覧

【unity】 prefab化して設置した複数の敵のHPが一気に減ってしまうのを解決したい

yumaru

総合スコア5

Unity

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

0グッド

0クリップ

投稿2019/08/29 02:29

編集2019/08/29 02:37

前提・実現したいこと・発生した問題

unityでFPSゲームを作っている中で、銃で敵を撃ってrayが当たったらその攻撃を受けた敵のHPを1減らし、その敵のHPが0になったらその敵オブジェクトを破壊するというシステムを作っています。
現在敵をステージに3体設置してテストをしているのですが、そのうちの1体に一度rayを当てると全ての敵のHPが1減ってしまいます。これをそのrayが当たった敵1体だけにダメージが入るようにしたいです。(例 現在の状態では、ある敵一体だけに弾をあてると、3体の敵のHPは、2→1 2→1 2→1 これを、 2→1 2のまま 2のまま になるようにしたい。)
敵は、capsuleにソースコード"EnemyController"が貼ってあり、tagを"Enemy"にしたオブジェクトで、prefab化した状態でステージに3体設置しています。
unity初心者です。よろしくお願いします。

該当のソースコード

EnemyControllerとPlayer(←一応)を貼っておきます。

c#

1 /* EnemyController */ 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7public class EnemyController : MonoBehaviour 8{ 9 10 [SerializeField] private int hp = 2; 11 GameObject playerr; 12 void Start() 13 { 14 playerr = GameObject.Find("FPSController"); 15 } 16 17 void Update() 18 { 19 20 if (Input.GetMouseButtonDown(0)) 21 { 22 if(playerr.GetComponent<Player>().hit.collider.tag == "Enemy") 23 { 24 this.hp--; 25 if(this.hp == 0) 26 { 27 Destroy(playerr.GetComponent<Player>().hit.collider.gameObject); 28 } 29 } 30 31 } 32 33 } 34}

c#

1 /*Player*/ 2 3using System.Collections; 4using System.Collections.Generic; 5using UnityEngine; 6 7// FPSController 8 9public class Player : MonoBehaviour 10{ 11 Vector3 point; 12 public Camera cam; 13 //光線を飛ばすためにはカメラが必要 14 15 public bool rayHit; 16 GameObject gun_snd; 17 GameObject score_UI; 18 public RaycastHit hit; 19 20 void Start() 21 { 22 gun_snd = GameObject.Find("Ak-47"); 23 score_UI = GameObject.Find("score_text"); 24 } 25 26 27 void Update() 28 { 29 Ray ray = cam.ViewportPointToRay(new Vector3(0.5f, 0.5f, 0)); 30 //ray..光線を生成 ViewportPointToRay..ビユーポート座標をrayに変換 31 Debug.DrawRay(ray.origin, ray.direction); 32 33 34 if(Physics.Raycast(ray, out hit)) 35 //out hit.. ぶつかったオブジェクトの情報 36 { 37 rayHit = true; 38 39 40 } 41 else 42 { 43 rayHit = false; 44 } 45 46 47 48 //残弾処理 49 if (Input.GetMouseButtonDown(0) && gun_snd.GetComponent<gun_Sound>().canShoot ) 50 { 51 score_UI.GetComponent<ScoreController>().nokori_tama_cnt--; 52 Debug.Log(hit.point); 53 54 55 56 } 57 if(score_UI.GetComponent<ScoreController>().nokori_tama_cnt == 0) 58 { 59 gun_snd.GetComponent<gun_Sound>().canShoot = false; 60 } 61 if (Input.GetKeyDown(KeyCode.R)) 62 { 63 score_UI.GetComponent<ScoreController>().nokori_tama_cnt = 30; 64 gun_snd.GetComponent<gun_Sound>().canShoot = true; 65 } 66 } 67} 68

試したこと

EnemyControllerのthis.hpをhpにしましたがだめでした。
EnemyControllerの[SerializeField] privateの部分をpublicにしましたがダメでした。

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

unityのバージョン: Unity 2018.4.0f1

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

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

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

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

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

Y0241-N

2019/08/29 02:33

質問とは関係ありませんが、スクリプトを二個載せるときは ``` ``` ``` ``` としないと上側の部分しか形式が適応されないので、一行```を追加してあげてください。
yumaru

2019/08/29 02:38

修正しました。ご指摘ありがとうございました。
guest

回答3

0

EnemyControllerクラスのUpdate関数の中の

C#

1 if(playerr.GetComponent<Player>().hit.collider.tag == "Enemy")

で、どの敵と衝突したかの判定を行っていないのでEnemy全部がhpを減らす処理を行ってしまっています。

投稿2019/08/29 03:08

tatamyiwathy

総合スコア1039

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

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

yumaru

2019/08/29 04:53

「どの敵と衝突したか」の判定はどのようにして実装すればいいのでしょうか
guest

0

スクリプトを見ていて思ったのですが、ダメージ処理は敵側のスクリプトにしかないですよね?
プレイヤー側に攻撃の処理が見受けられないので、

恐らくですが、
if (Input.GetMouseButtonDown(0))if(playerr.GetComponent<Player>().hit.collider.tag == "Enemy")
の条件を満たしたとき、このスクリプトがアタッチされている全員がダメージを受けるという処理になっているため、どの敵に当てても全員HPが減る、という風になっていると思います。

なので、個別にダメージを与えたい場合はインターフェースを実装し、管理するとよいと思います。
詳しくはこちらを参考にしてください。【Unity】C# インターフェースを使う実例 (備忘録)

投稿2019/08/29 03:03

Y0241-N

総合スコア1066

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

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

0

ベストアンサー

提示されたソースだけでは手元でうまく動作しなかったので怪しい点だけ。

EnemyControllerif (Input.GetMouseButtonDown(0))を使ってしまっているので、マウスクリックされたときに全部のPrefabで処理が走っているのだと思います。

さらに、if(playerr.GetComponent<Player>().hit.collider.tag == "Enemy")でプレイヤー側の条件を参照しに行っているので、一度プレイヤーが条件を満たせばEnemyControllerがアタッチされているものすべてが処理を実行してしまいます。

つまり、マウスクリックされてplayerr.GetComponent<Player>().hit.collider.tag == "Enemy"がtrueな状態であれば全部のエネミーのHPが同時に減ります。

基本的に処理は独立させて管理するべきなので、EnemyControllerにはダメージを受ける処理だけを作り
Player側?でRayを打ってEnemyにヒットしたら、そのオブジェクトのEnemyControllerのダメージを受ける処理を呼び出す形にしてあげれば良いかと思います。

投稿2019/08/29 03:03

hogefugapiyo

総合スコア3302

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問