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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 971

score 14

前提・実現したいこと

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

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

試したこと

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

    protected Transform groundCheck_L;
    protected Transform groundCheck_C;
    protected Transform groundCheck_R;
    protected Transform HeadCheck_L;
    protected Transform HeadCheck_C;
    protected Transform HeadCheck_R;
        //各判定用オブジェクトのポイントをスクリプトで使う為に変数に代える
        groundCheck_L = transform.Find("Check_Point/GroundCheck_L");
        groundCheck_C = transform.Find("Check_Point/GroundCheck_C");
        groundCheck_R = transform.Find("Check_Point/GroundCheck_R");
        HeadCheck_L = transform.Find("Check_Point/HeadCheck_L");
        HeadCheck_C = transform.Find("Check_Point/HeadCheck_C");
        HeadCheck_R = transform.Find("Check_Point/HeadCheck_R");

    protected virtual void FixedUpdate() {
        groundCheck_OnRoadObject = null;
        groundCheck_OnMoveObject = null;
        groundCheck_OnEnemyObject = null;
        Check_OnLadderObject = null;

        Collider2D[][] groundCheckCollider = new Collider2D[3][];
        groundCheckCollider[0] = Physics2D.OverlapPointAll(groundCheck_L.position);
        groundCheckCollider[1] = Physics2D.OverlapPointAll(groundCheck_C.position);
        groundCheckCollider[2] = Physics2D.OverlapPointAll(groundCheck_R.position);   
        foreach (Collider2D[] groundCheckList in groundCheckCollider) {
            foreach (Collider2D groundCheck in groundCheckList) {
                if (groundCheck != null) {//LCRのどれかが、道、物体、敵に接触している場合にgroundedと判断。
                    if (!groundCheck.isTrigger)
                    {
                        grounded = true;//grounded = 地面に立った状態にここで設定
                        air = false;
                        if (groundCheck.tag == "Road") {groundCheck_OnRoadObject = groundCheck.gameObject;}
                        else if (groundCheck.tag == "MoveObject") {groundCheck_OnMoveObject = groundCheck.gameObject;}
                        else if (groundCheck.tag == "Enemy") {groundCheck_OnEnemyObject = groundCheck.gameObject;}
                    }
                } //if (groundCheckCollider[1] != null){ }
            }
        }
        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;
        }

発生している問題

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”のみオブジェクトに接触
で指定する場合、条件式をどのように記述すればよいのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る