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

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

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

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

Unity

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

Q&A

解決済

1回答

1639閲覧

範囲指定しているのにオブジェクトを検知してしまう。明確な範囲指定方法を知りたい

BRAK

総合スコア98

C#

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

Unity

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

0グッド

0クリップ

投稿2020/09/12 09:30

範囲指定の方法が違うようで思った挙動にならない
現在、マウスのレイヤーで二回クリックした際に特定の二つのオブジェクトを検知して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));

これで合っていますか?
イメージ説明

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

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

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

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

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

guest

回答1

0

自己解決

Collider2D[] hitTargets = Physics2D.OverlapBoxAll(pos, new Vector2(charaCon.detectionX, charaCon.detectionY), enemyUnitLayer);が違いました

投稿2020/09/21 04:11

BRAK

総合スコア98

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問