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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

12171閲覧

OnCollisionEnterの判定が何回も起こる

toricotori

総合スコア14

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2017/12/18 09:28

編集2017/12/18 13:56

unityで、プレイヤーが複数個所にある鍵に触れるたびカウントが1ずつ減っていき、0になると条件を満たして一定の挙動をする、といった流れを作っています。
現状、一個でも鍵に触れると一気にカウントが0になってしまいます。

鍵は最初は消えていて、あるトリガー内に入ると現れるようになっていますが、そのためのスクリプトに何か問題があるようです。

鍵の出現スクリプト

C#

1public class appearWork : MonoBehaviour 2{ 3 private Collider col; 4 5 void Start () 6 { 7    //はじめは自身と自身のコライダーは消えている 8 col = gameObject.GetComponent<Collider>(); 9 10 this.gameObject.GetComponent<MeshRenderer>().enabled = false; 11 if (col != null) 12 col.enabled = false; 13 } 14 15 16 void Update () 17 { 18    //トリガー内に入ると自身と自身のコライダーを出現させる 19 if (trapTrigger.trapFlag == true) 20 { 21 this.gameObject.GetComponent<MeshRenderer>().enabled = true; 22 if(col != null) 23 col.enabled = true; 24 } 25 } 26}

トリガーのスクリプト(12/18追記)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class trapTrigger : MonoBehaviour { 6 7 public static bool trapFlag; 8 9 void Start () 10 { 11 trapFlag = false; 12 } 13 14 void OnTriggerEnter(Collider col) 15 { 16 if (col.gameObject.tag == "chara") 17 { 18 trapFlag = true; 19 } 20 } 21} 22

colがかかわる部分

if (col != null) col.enabled = false;
if (col != null) col.enabled = true;

をコメントアウトすると正常にカウントが減っていくので、colの部分の書き方に問題があると思われますが、
解決方法が思い当たらず困っています。ご教授いただけますと幸いです。
(if (col != null)があるのは、コライダーがないオブジェクトにもスクリプトを適用する予定だからです。この条件をなくしても、カウントのおかしな減り方に変わりはありません)

ちなみに鍵はプレイヤーが触れると再び消えるようになっています。
トリガー内に入ることで出現した鍵に触れると、一度コライダーにつっかえる様子があるので(本来なら触れたそばから消えるのようになっているのでコライダーにつっかえることはない)、
コライダーの表示非表示の切り替えタイミングにも問題がある可能性もあります。

以下の通りです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class keyWork : MonoBehaviour 6{ 7 bool flag = false ; 8 float alpha = 1.0f ; 9 float R; 10 float G; 11 float B; 12 13 void Start () 14 { 15 R = this.GetComponent<Renderer> ().material.color.r; 16 G = this.GetComponent<Renderer> ().material.color.g; 17 B = this.GetComponent<Renderer> ().material.color.b; 18 } 19 20 void Update () 21 { 22    //キャラが触れるとフェードアウトして消える 23 if (flag == true) 24 { 25 this.gameObject.GetComponent<Renderer> ().material.color = new Color (R, G, B, alpha); 26 alpha -= 0.2f; 27 if (alpha < 0) 28 { 29 alpha = 0; 30 Destroy(this.gameObject, 1.0f); 31 } 32 } 33 } 34 35 void OnCollisionEnter(Collision col) 36 { 37    //プレイヤーが触れるとフェードアウトするためのフラグをtrueにする、コライダーを消す 38 if (col.gameObject.tag == "chara") 39 { 40           gameObject.GetComponent<CapsuleCollider> ().enabled = false; 41           flag = true; 42 } 43 } 44} 45

OnCollisionEnter内にDebug.Logでカウント数を表示するようにしたところ、最初のカウントが3の場合、210000000000...と表示されました。

<<12/18追記>>
カウント数に関するスクリプトです。

C#

1public class charaColWork : MonoBehaviour 2{ 3 public int count = 3; 4  public GameObject trigger; //鍵を集めきったら現れるトリガー 5 6 void Start() 7 { 8 trigger.SetActive(false); 9 } 10 11 12 void OnCollisionEnter(Collision col) 13 { 14 //鍵に接触したとき 15 if (col.gameObject.tag == "key") 16 { 17 if (count > 0) 18 { 19 count--; 20 } 21      if(count == 0) 22      { 23       trigger.SetActive(true); 24      } 25 } 26}

<<12/18追記>>
下二つのスクリプト、keyWorkとCharaColWorkは他シーンでも使用しており、そのシーンでは
特に問題はありません。
上二つのappeearWorkとtrapTriggerを適用させているシーンのみ問題が発生しています。

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

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

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

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

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

guest

回答2

0

自己解決

判定が何回も起こるのは、プレイヤーがふれた後消えるはずのコライダーが消えていないことが原因でした。
トリガー内に入った後コライダーが現るというスクリプトに上書きされていたようです。
このスクリプトの条件を、プレイヤーにまだ触れていないときはコライダーを表示する、というふうに変えたところ解決いたしました。

投稿2017/12/20 13:24

toricotori

総合スコア14

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

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

0

プレイヤーと鍵の接触判定(カウントをマイナスしている部分)のスクリプトが無いのでよく分かりませんが、
if (col.gameObject.tag == "chara"){}の外にカウントマイナスのプログラムを置いていませんか?
もしDebug.Logもこのif文の外に書いていて、このスクリプトを付けたオブジェクトが多数あるなら、膨大なカウントになることはあり得ます。
(OnCollisionEnterは全ての衝突で呼ばれる為、例えば「鍵と背景用オブジェクト」のような接触でも呼ばれます)

trapTrigger.trapFlagもどうなったらtrueになるのか分からない(ので正しく書けているのか分からない)ですし、
「colがかかわる部分をコメントアウトすると正常にカウントが減っていく」とありますがcolがかかわる部分ってどこだか分かりません。

質問文、またはプログラム自体を整理するとよいのではないでしょうか。

投稿2017/12/18 10:42

sakura_hana

総合スコア11427

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

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

toricotori

2017/12/19 15:28 編集

質問を編集いたしました。 ご回答いただけますと幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問