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

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

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

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

Unity

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

Q&A

解決済

1回答

228閲覧

2点の空オブジェクト接触について細かい条件指定を行いたい

ITATI

総合スコア14

C#

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

Unity

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

0グッド

1クリップ

投稿2019/02/11 15:34

編集2019/02/23 11:52

前提・実現したいこと

上記画像の2点の空のオブジェクト"groundCheck_C"、“HeadCheck_C”の座標に接触したオブジェクトのタグを
チェックすることで、キャラクタ―の状態を設定したいと考えています。

"groundCheck_C"=Ladderタグ、“HeadCheck_C”=Ladderタグ ⇒ はしご使用状態
"groundCheck_C"=groundタグ、“HeadCheck_C”=Ladderタグ ⇒ はしご上昇準備
"groundCheck_C"=Ladderタグ、“HeadCheck_C”=empty ⇒ 上昇不可能

試したこと

参考書の地面を認識させるコードを参考に以下の様に記述しました。

c#

1 protected Transform groundCheck_L; 2 protected Transform groundCheck_C; 3 protected Transform groundCheck_R; 4 protected Transform HeadCheck_L; 5 protected Transform HeadCheck_C; 6 protected Transform HeadCheck_R; 7 //各判定用オブジェクトのポイントをスクリプトで使う為に変数に代える 8 groundCheck_L = transform.Find("Check_Point/GroundCheck_L"); 9 groundCheck_C = transform.Find("Check_Point/GroundCheck_C"); 10 groundCheck_R = transform.Find("Check_Point/GroundCheck_R"); 11 HeadCheck_L = transform.Find("Check_Point/HeadCheck_L"); 12 HeadCheck_C = transform.Find("Check_Point/HeadCheck_C"); 13 HeadCheck_R = transform.Find("Check_Point/HeadCheck_R"); 14 15 protected virtual void FixedUpdate() { 16 groundCheck_OnRoadObject = null; 17 groundCheck_OnMoveObject = null; 18 groundCheck_OnEnemyObject = null; 19 Check_OnLadderObject = null; 20 21 Collider2D[][] groundCheckCollider = new Collider2D[3][]; 22 groundCheckCollider[0] = Physics2D.OverlapPointAll(groundCheck_L.position); 23 groundCheckCollider[1] = Physics2D.OverlapPointAll(groundCheck_C.position); 24 groundCheckCollider[2] = Physics2D.OverlapPointAll(groundCheck_R.position); 25 foreach (Collider2D[] groundCheckList in groundCheckCollider) { 26 foreach (Collider2D groundCheck in groundCheckList) { 27 if (groundCheck != null) {//LCRのどれかが、道、物体、敵に接触している場合にgroundedと判断。 28 if (!groundCheck.isTrigger) 29 { 30 grounded = true;//grounded = 地面に立った状態にここで設定 31 air = false; 32 if (groundCheck.tag == "Road") {groundCheck_OnRoadObject = groundCheck.gameObject;} 33 else if (groundCheck.tag == "MoveObject") {groundCheck_OnMoveObject = groundCheck.gameObject;} 34 else if (groundCheck.tag == "Enemy") {groundCheck_OnEnemyObject = groundCheck.gameObject;} 35 } 36 } //if (groundCheckCollider[1] != null){ } 37 } 38 } 39 Collider2D[][] ladderCheckCollider = new Collider2D[2][]; 40 ladderCheckCollider[0] = Physics2D.OverlapPointAll(HeadCheck_C.position); 41 ladderCheckCollider[1] = Physics2D.OverlapPointAll(groundCheck_C.position); 42 foreach (Collider2D[] ladderCheckList in ladderCheckCollider) { 43 foreach (Collider2D ladderCheck in ladderCheckList) { 44 if (ladderCheck != null) 45 { 46 if (!ladderCheck.isTrigger) 47 { 48if (ladderCheck.tag == "Ladder") {Check_OnLadderObject = ladderCheck.gameObject; } 49 } 50 } 51 } 52 } 53 if (Check_OnLadderObject != null) 54 { 55 ladder = true; 56 }

発生している問題

Collider2D[][] ladderCheckCollider = new Collider2D[2][]; ladderCheckCollider[0] = Physics2D.OverlapPointAll(HeadCheck_C.position); ladderCheckCollider[1] = Physics2D.OverlapPointAll(groundCheck_C.position); foreach (Collider2D[] ladderCheckList in ladderCheckCollider) { foreach (Collider2D ladderCheck in ladderCheckList) { if (ladderCheck != null) { if (!ladderCheck.isTrigger) { if (ladderCheck.tag == "Ladder") {Check_OnLadderObject = ladderCheck.gameObject; } } } } } if (Check_OnLadderObject != null) { ladder = true; }

この部分のコードの内容は"groundCheck_C"、“HeadCheck_C”の座標に何らかのオブジェクトが接触すればladder = true;にするという大雑把な条件式の様です。
細かい条件の指定方法が分かりませんでした。

例えばこれを
・"groundCheck_C"のみオブジェクトに接触
・“HeadCheck_C”のみオブジェクトに接触
で指定する場合、条件式をどのように記述すればよいのでしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

2点のオブジェクトを判定するより、起点、終点になるオブジェクト(梯子で言えば上端、下端)の接触を判定させた方が早いようです。

投稿2019/02/23 12:09

ITATI

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問