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

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

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

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

Unity

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

Q&A

0回答

2329閲覧

Unity2Dの当たり判定(OnTrigger)が上手く動かない

hangesho_32

総合スコア8

C#

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

Unity

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

1グッド

1クリップ

投稿2018/07/25 04:56

Unityで2D格闘ゲームを作っている者です。
当たり判定が上手くとれません。シーンビューで見ても、コリダー同士は確実に重なっています。
それが100%反応しないというわけではなく、ジャンプ動作直後の着地時や、左右移動した時にたまに認識はしてくれます…。
ジャンプキックという空中で足元に攻撃判定を出現させる動作があるのですが、これだけは動作率が高いです(100%ではない)。おそらく、落下で下に移動しているから?
移動していないとTriggerはとれないのですかね…?突然コリダーの当たり範囲の中にコリダーが現れると反応しないとか、そういうのがあるんですか…?

・OnTriggerStay2Dにて、接触判定をとり、当たっていればダメージを入れると言ったスクリプトを書いています。

(攻撃を受ける側のスクリプト)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class AtariCtrl : MonoBehaviour { 6 7 public P2Ctrl p2ctrl; 8 public P1Ctrl p1ctrl; 9 public HitController hctrl; 10 public float damage = 0; 11 public int Player; 12 private bool dochiraka = false; 13 // Use this for initialization 14 void Start () { 15 p1ctrl = transform.root.GetComponent<P1Ctrl>(); 16 p2ctrl = transform.root.GetComponent<P2Ctrl>(); 17 if (dochiraka == false) 18 { 19 if (p1ctrl == null) 20 { 21 Player = 2; 22 p1ctrl = GameObject.Find("Player1").GetComponent<P1Ctrl>(); 23 dochiraka = true; 24 25 } 26 if (p2ctrl == null) 27 { 28 Player = 1; 29 p2ctrl = GameObject.Find("Player2").GetComponent<P2Ctrl>(); 30 dochiraka = true; 31 32 } 33 } 34 35 36 } 37 38 // Update is called once per frame 39 void Update () { 40 41 42 } 43 44 public void OnTriggerEnter2D(Collider2D collision) 45 { 46 //Debug.Log("これがコリジョンやで!" + collision); 47 48 } 49 50 public void OnTriggerStay2D(Collider2D collision) 51 { 52 Debug.Log("名前名乗るわ"+collision.gameObject.name); 53 54 hctrl = collision.gameObject.GetComponent<HitController>(); 55 56 57 damage = hctrl.damage; 58 if (Player==1) 59 { 60 //Debug.Log("p1ctrlの体力削ってる"); 61 p1ctrl.HP -= damage; 62 } 63 if (Player==2) 64 { 65 //Debug.Log("p2ctrlの体力削ってる"); 66 p2ctrl.HP -= damage; 67 } 68 69 70 71 72 73 } 74 75 public void OnTriggerExit2D(Collider2D collision) 76 { 77 hctrl = null; 78 damage = 0; 79 } 80 81} 82

(攻撃用コリダーのgameobjectにつけているスクリプト)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class HitController : MonoBehaviour { 6 public P1Ctrl p1ctrl; 7 public P2Ctrl p2ctrl; 8 public Collider2D kore; 9 public float syokidamage; 10 public float damage; 11 public float damagegensan;//1回の処理ごとにいくつ減るか 12 public float renzoku=1f; 13 public float renzokusokudo=1;//連続攻撃の際の処理の速さ(よくわかっていない) 14 private bool dochiraka = false; 15 public int Player; 16 // Use this for initialization 17 void Start () { 18 kore = this.gameObject.GetComponent<Collider2D>(); 19 p1ctrl = transform.root.GetComponent<P1Ctrl>(); 20 p2ctrl=transform.root.GetComponent<P2Ctrl>(); 21 if (dochiraka == false) 22 { 23 if (p1ctrl == null) 24 { 25 Player = 2; 26 p1ctrl = GameObject.Find("Player1").GetComponent<P1Ctrl>(); 27 dochiraka = true; 28 29 } 30 if (p2ctrl == null) 31 { 32 Player = 1; 33 p2ctrl = GameObject.Find("Player2").GetComponent<P2Ctrl>(); 34 dochiraka = true; 35 36 } 37 } 38 damage = syokidamage; ; 39 if (Player == 1) 40 { 41 this.gameObject.tag = "Attackhantei"; 42 this.gameObject.layer = LayerMask.NameToLayer("Player1Attack"); 43 44 } 45 if (Player == 2) 46 { 47 this.gameObject.tag = "Attackhantei"; 48 this.gameObject.layer = LayerMask.NameToLayer("Player2Attack"); 49 50 } 51 52 53 } 54 55 // Update is called once per frame 56 void Update () { 57 58 } 59 60 61 62 public void OnTriggerStay2D(Collider2D collision) 63 { 64 65 66 if (collision.gameObject.tag == "Atarihantei") { 67 for (float i = 0f; i <= renzoku; i += Time.deltaTime * renzokusokudo) 68 { 69 //p1ctrl.HP -= damage; 70 71 if (damagegensan >= 0) 72 { 73 damage = damage - damagegensan; 74 } 75 76 77 78 if (i == renzoku) 79 { 80 kore.enabled = false; 81 } 82 83 } 84 } 85 else { damage = syokidamage; } 86 87 88 89 if (collision.gameObject.tag == "Atarihantei2") { 90 for (float i = 0f; i <= renzoku; i += Time.deltaTime * renzokusokudo) 91 { 92 //Debug.Log("P2に当たってます"); 93 //p2ctrl.HP-= damage; 94 95 if (damagegensan >= 0) 96 { 97 damage = damage - damagegensan; 98 } 99 100 if (i == renzoku) 101 { 102 kore.enabled = false; 103 } 104 105 106 } 107 108 109 110 } 111 else 112 { 113 damage = syokidamage; 114 } 115 116 117 118 119 } 120} 121

まだHPの減り具合などはまだ調整はしていないので連続でダメージが入ってしまう状態ですが…。
※p1ctrl・p2ctrlはそれぞれHPを管理するスクリプトで、当たり判定やキャラモデルの一番上のルートにアタッチしています。(後々キャラを増やした際に中身を変えるだけで済むため)→それが親にアタッチされているかを確認し、そこからプレイヤーナンバーを割り出しています。

・パンチを繰り出した際、自キャラの前に攻撃範囲のコリダーを出現させるようにしています。
そのコリダーはrigidbody2Dなし、isTriggerにチェック有。(別スクリプトで有効、無効化を制御)

・当たり判定のコリダーにはrigidbodyなし、isTriggerはチェック有。

<試したこと>
・rigidbodyを攻撃、当たり判定につけてみたりしましたが、変わらず。
・isTriggerのチェックを片方はずした状態で試しても変わらず。
・当たり判定が上手く言っていない原因がHitControllersの「kore」のせいかと思い、HitControllersのスクリプトのみを無効化し、AtariCtrlにてきちんとコリダー同士が接触しているか確認しようとしても、変わらず。

現状、八方塞がりで、困っています…お力添えをお願いします…

eyesica👍を押しています

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

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

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

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

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

sakura_hana

2018/07/26 02:18

片方のColliderがもう片方の「中」に完全に埋まっている形でしょうか? Colliderは外壁部分で判定を行うので埋まっている場合は当たっているとみなさないです。また、Rigidbodyのスリープモードが影響しているかもしれないので一度見てみてください→http://tsubakit1.hateblo.jp/entry/20140119/1390142113(ソース発見出来ないのですが生成直後のオブジェクトは一度物理演算で動くまでスリープモード、みたいな情報も以前見た気もします)
hangesho_32

2018/07/26 12:15

どちらにも心当たりはありません…中ではなくColliderの一部が重なった状態です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問