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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

5619閲覧

一つのスクリプトに複数のオブジェクトの制御をさせたい

Ro_bo_t

総合スコア4

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

1グッド

0クリップ

投稿2020/09/08 13:57

前提・実現したいこと

まだUnity初心者で、今軽いアクション系のFPSを作っています。
シューティング要素を入れておりRayで操作しています。敵として、ロボットを作成し、ヘッドショット、ボディショットとして分けています。ヘッドとボディでColliderを分け、それぞれにスクリプトを入れて、ヘッドボディを分割させています。

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

一つのロボットが倒れると他のも同じプログラムで動かしているので同時に倒れてしまいます。

該当のソースコード

ロボットのダメージ管理のスクリプト

C#

1public class RobotDamage : MonoBehaviour 2{ 3 public static float currentHealth = 3f; 4 public GameObject thisBot; 5 private void Update() 6 { 7 if (currentHealth <= 0) 8 { 9 thisBot.SetActive(false); 10 } 11 } 12}

ロボットヘッドコライダのスクリプト

C#

1public class RobotHead : MonoBehaviour 2{ 3 public void Damage(float damageAmount) 4 { 5 RobotDamage.currentHealth -= damageAmount; 6 7 } 8}

ロボットボディコライダのスクリプト

public class RobotBody : MonoBehaviour { public void Damage(float damageAmount) { RobotDamage.currentHealth -= damageAmount; } }

Rayのスクリプト

if(Physics.Raycast(rayOrigin,fpsCam.transform.forward,out hit, weaponRange)) { laserLine.SetPosition(1, hit.point); RobotHead head = hit.collider.GetComponent<RobotHead>(); RobotBody body = hit.collider.GetComponent<RobotBody>(); if(head != null) { head.Damage (headDamage); } if(head != null && hit.rigidbody != null) { hit.rigidbody.AddForce(-hit.normal * hitForce); } if (body != null) { body.Damage(bodyDamage); } if (body != null && hit.rigidbody != null) { hit.rigidbody.AddForce(-hit.normal * hitForce); } }

試したこと

一つ一つのロボットにつきスクリプトを与えましたが、数が多くなってきて、これだと重くなってしまうと思って質問しました。

cushionA👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。
コードについてですが、staticが悪さしてるのだと思います。
これをつけた変数はかんたんに言うならすべてのオブジェクトで共有されてしまい、一体が攻撃されると全員のHPが減ります。

なのでstaticを外したあとRobotDamageクラスをそれぞれのオブジェクトのDamageクラス他スクリプトたちにGetComponentでインスタンスを作らせて、そこから被弾ごとに引いていくようにすればいいと思います。

下のコードみたいな感じで…

C#

1public class RobotBody : MonoBehaviour 2{ 3     RobotDamage rd; 4     //インスタンスを入れる箱の変数 5void Start() 6 { 7 rd = GetComponent<RobotDamage>(); 8 //RobotDamageのインスタンス作成 9 } 10 public void Damage(float damageAmount) 11 { 12 rb.currentHealth -= damageAmount; 13 //インスタンスから情報取得して処理 14    //rb.currentHealthはRobotDamageクラスのrbに含まれるcurrentHealthの意味 15 } 16}

しかしこれはおそらく最善ではありません。
もう少し学習が進んだらScriptableObjectというものを調べてみてください。
敵パラメータはこちらで管理するのがいいです。
しかし少し込み入ったモノなのでもう少し学習が進んでからでいいでしょう。

これで解決すればよいのですが……。
なんにせよ応援しております!

追記:質問文にある一つ一つのスクリプトを与えるという場合が今自分が書いたようなコードだとお思いならすみません。
しかしこの程度の数ならおそらく大丈夫です。
ですがやはり気になるということでしたら、そのような懸念を払拭するためのものがScriptableObjectです。
データの量をかなり節約しつつ個別に管理できます。
こちらの記事など参考になりますゆえ調べてみてください。
意図を取り違えていたらすみませんでした。
エクスポラボ様の 【Unity】ScriptableObjectってなんなん? って時に読む記事【解説】

投稿2020/09/08 14:38

編集2020/09/08 15:04
cushionA

総合スコア90

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

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

Ro_bo_t

2020/09/08 21:55

丁寧にありがとうございました。また学習が進んだらScriptableObjectも使ってみようと思います。問題が出たらまた質問させてもらうかもしれません。ありがとうございました。
Ro_bo_t

2020/09/09 12:10

無事解決しました!ありがとうございます。
cushionA

2020/09/09 13:46

よかったです! おめでとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問