範囲指定の方法が違うようで思った挙動にならない
現在、マウスのレイヤーで二回クリックした際に特定の二つのオブジェクトを検知して1つをもう一つのオブジェクトに攻撃させるというのを作ったのですが、範囲指定方法が間違えているようで、範囲外なのに攻撃してしまうという挙動になってしまいます。
プレイヤーを主軸として敵との距離を測っています。
使っているものはfloat attackRadius float shotRadiusこれはプレイヤーが相手を検知する円としての大きさです。
一方のdetectionX detectionYはPhysics2D.OverlapBoxAllの四角の範囲を指定しています。
距離計算で円内かどうかと、OverlapBoxAllでコライダーの中に特定の一人がいるかどうかで検知しています。
それと、OverlapBoxAllでコライダーではインスタンスIDで選択した敵がいるかどうかを検知しています。
for文でOverlapBoxAllでコライダー内のオブジェクトを検知していたらアタック開始、ラストまで回していなかったら攻撃範囲外とみなしアタックしないという感じです。
問題点
今は範囲自体があっているかがわからないので何とも言えないのですが、プレイヤーから見て直線上に敵がいる場合検知します。それ以外は検知しません(斜め)。画像の×が検知します☆はプレイヤーです。小さい円がattackRadiuse,大きい円がShotRadiusです。
C#
1コード 2 void ChangeTarget() 3 { 4 if(setPlayerUnit && setEnemyUnit) 5 { 6 //プレイヤーユニットのコンポーネント取得 7 CharactersController charaCon = playerUnit.GetComponent<CharactersController>(); 8 //攻撃範囲より大きく射撃範囲以下であるかを判定する 9 Debug.Log(Vector3.Distance(enemyUnit.transform.position, charaCon.transform.position)+"アタック範囲 = " + charaCon.attackRadius + "射撃範囲 = " + charaCon.shotRadius); 10 11 if(Vector3.Distance(enemyUnit.transform.position,charaCon.transform.position) > charaCon.attackRadius) 12 { 13 //コライダーの位置 14 Vector2 pos = new Vector2(charaCon.transform.position.x, charaCon.transform.position.y); 15 //キャラのボックス判定の中にあるコライダーを取得 丸で判定のほうがいいかな 16 Collider2D[] hitTargets = Physics2D.OverlapBoxAll(pos, new Vector2(charaCon.detectionX, charaCon.detectionY), enemyUnitLayer); 17 18 for (int i = 0; i < hitTargets.Length; i++) 19 { 20 Debug.Log(hitTargets[i].name); 21 if (enemyUnit.GetInstanceID() == hitTargets[i].gameObject.GetInstanceID()) 22 { 23 //条件が合えば敵ユニットを入れる 24 charaCon.target = enemyUnit; 25 26 //全部初期値に戻す 再度選択させる 27 playerUnit = null; 28 enemyUnit = null; 29 setPlayerUnit = false; 30 setEnemyUnit = false; 31 Debug.Log("プレイヤーのターゲットを変更しました"); 32 break; 33 } 34 else if (i == hitTargets.Length - 1) 35 { 36 Debug.Log("い"); 37 38 if (enemyUnit.GetInstanceID() == hitTargets[i].gameObject.GetInstanceID()) 39 { 40 //条件が合えば敵ユニットを入れる 41 charaCon.target = enemyUnit; 42 43 //全部初期値に戻す 再度選択させる 44 playerUnit = null; 45 enemyUnit = null; 46 setPlayerUnit = false; 47 setEnemyUnit = false; 48 Debug.Log("プレイヤーのターゲットを変更しました"); 49 break; 50 } 51 else 52 { 53 //全部初期値に戻す 再度選択させる 54 playerUnit = null; 55 enemyUnit = null; 56 setPlayerUnit = false; 57 setEnemyUnit = false; 58 Debug.Log("敵ユニットは範囲外です"); 59 break; 60 } 61 } 62 } 63 } 64 else 65 { 66 if(Vector3.Distance(enemyUnit.transform.position, charaCon.transform.position) <= charaCon.attackRadius) 67 { 68 Debug.Log("攻撃範囲内"); 69 //全部初期値に戻す 再度選択させる 70 playerUnit = null; 71 enemyUnit = null; 72 setPlayerUnit = false; 73 setEnemyUnit = false; 74 } 75 else if(Vector3.Distance(enemyUnit.transform.position, charaCon.transform.position) >= charaCon.shotRadius) 76 { 77 Debug.Log("射撃範囲外"); 78 //全部初期値に戻す 再度選択させる 79 playerUnit = null; 80 enemyUnit = null; 81 setPlayerUnit = false; 82 setEnemyUnit = false; 83 } 84 } 85 } 86 }
よろしくお願いいたします。
あと、範囲を視認できるようにしているのですが、
C#
1コード 2Gizmos.DrawWireCube(transform.position, new Vector2(detectionX, detectionY));
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。