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にてきちんとコリダー同士が接触しているか確認しようとしても、変わらず。
現状、八方塞がりで、困っています…お力添えをお願いします…
あなたの回答
tips
プレビュー