🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

Q&A

解決済

1回答

1496閲覧

同じ性質の障害物への2回目の当たり判定が機能しない

Neet-Saikou

総合スコア11

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Unity

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

0グッド

0クリップ

投稿2019/12/08 15:24

編集2020/01/18 05:35

前提・実現したいこと

自動スクロールで戦車が進みながら障害物を破壊していくゲームを製作しているが、1回目のプレイヤーと障害物(Building)の当たり判定と同様に、2回目以降の障害物(1回目と同じ性質、コード所持)への当たり判定も機能させたい。

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

当たり判定をコードで設定し、プレイヤーにドロップした所、1回目の障害物(Building)との衝突は当たり判定が機能して障害物が破壊されるのに、2回目にプレイヤーが、複製した別の同じ障害物と衝突した際にはなぜか当たり判定が機能しなくなってしまった。ぶつかってプレイヤーがそこで止まるようになってしまった。

エラーメッセージ
表示されません

該当のソースコード

C#

1public class PlayerController : MonoBehaviour 2{ 3 GameObject Player; 4 float speed = 3.50f; 5 void Start() 6 { 7 this.Player = GameObject.Find("Building"); 8 this.Player = GameObject.Find("EnemyBullet"); 9 } 10 void Update() 11 { 12 transform.position += new Vector3(this.speed * Time.deltaTime, 0f, 0f); 13 } 14 private void OnCollisionEnter2D(Collision2D collision) 15 { 16 if(collision.gameObject.tag == "Building") 17 { 18 GameObject director = GameObject.Find("GameDirector"); 19 director.GetComponent<GameDirector>().DecreaseHp(); 20 Destroy(collision.gameObject); 21 } 22  }

試したこと

3つの同じ障害物(Building)それぞれにプレイヤーと衝突したら破壊される、というコードを持たせた所、同じ現象が発生し、1つ目にプレイヤーと衝突した障害物は破壊されたが2つ目に衝突した障害物には当たり判定が機能しなかった。Unity本体のRigidlybody2DとBoxCollider2Dに問題があるのかとも考えたがそれも違った。

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

Unity 2019.2.14f1 Personal

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

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

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

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

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

simapiko

2019/12/12 08:48 編集

ご提示されているPlayerControllerの"}"が足りないようですが、未提示のコードはありませんでしょうか。 また、最後の"}"が全角です。手打ちで入力しましたか?コードを記載するときは手打ちでは無くコピペで行うとミスが少なくなるかと思います。
guest

回答1

0

ベストアンサー

以下でHPを減らしているので、クローンする際にHPを元に戻さず
HP 0の状態だからと予想してみました。

C#

1director.GetComponent<GameDirector>().DecreaseHp();

投稿2019/12/09 07:19

madone99

総合スコア1857

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

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

Neet-Saikou

2019/12/10 03:21

ご回答ありがとうございます。 GameDirectorのコードとUIの体力バーによると、プレイヤーの体力はまだ残っていることになっているのですが……
madone99

2019/12/10 04:49 編集

そうしたら、ご提示のコードではわかりませんが、 複製したオブジェクトはtagがBuildingになっていないのでは?
Neet-Saikou

2019/12/12 07:17

tagはBuildingに設定してあります。 BuildingをPrefabにて生成した場合も同じ現象が発生しました。 GameDirectorのコードを一応載せておきます。何かおかしいポイントがございましたらご指摘お願いします。 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; public class GameDirector : MonoBehaviour { public GameObject hpGauge; private float fillAmount; void Start() { this.hpGauge = GameObject.Find("hpGauge"); } public void DecreaseHp() { this.hpGauge.GetComponent<Image>().fillAmount -= 0.1f; if (fillAmount <= 0) { Destroy(gameObject); Invoke("GoToGameOver", 1.0f); } } void GoToGameOver() { SceneManager.LoadScene("GameOver"); } }
madone99

2019/12/13 06:16 編集

他の回答がつきやすいように、質問の方へ```か<code>で囲んで追加をお願いします。 最初に思ったのが、fillAmountを減らしていって0以下の状態になり、 クローンした時に初期化していないので0以下の状態のままになっているかと思ったんですけど
Neet-Saikou

2019/12/13 06:12

失礼いたしました。今後は気をつけます。 void Start()にてfillAmountの設定を加えたところ、無事当たり判定にて体力を減少させることに成功しました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問