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

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

ただいまの
回答率

87.50%

unity接触判定について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,031

score 1095

経緯

とある理由により物理エンジンを使わずに移動させることにしたのですが、
移動させ、そこにオブジェクトがあればその移動を取り消す
という動作を作成しようと思いました。

コード

using UnityEngine;

public class test01 : MonoBehaviour{

    public Transform transform;
    int i = 0; //デバッグ用

    void Start () {
        transform = this.GetComponent<Transform>();
    }

    void Update () {
        i++;
        transform.position = new Vector3(transform.position.x,transform.position.y,transform.position.z + 0.1f);

        //ポイントA

        print("Update called (" + i + ")");
    }

    private void OnCollisionEnter ( Collision collision ) {
        print("OncollisionEnter called (" + i + ")");
    }
}

●移動するオブジェクト
test01.csのセット
box collider(is trigger=false)のセット
rigitbodyのセット
座標(0,0,0)に設置

●移動しないオブジェクト
box collider(is trigger=false)のセット
座標(0,0,10)に設置

実行した時のログ

Update called(1)
Update called(2)
・・・(略)・・・
Update called(89)
Update called(90)
OncollisionEnter called(90)
Update called(91)
・・・(略)・・・

実現したいこと

ログにもあるように、OnCollisionEnterを使えば接触判定はできます。
ただ、今回接触判定をしたいのは、update内の「ポイントA」の箇所になります。
OnCollisionEnterはupdateを最後まで実行した後に呼び出されてしまうので、
ポイントAで把握することが出来ません。
色々調べては見たものの、OnCollisionEnter以外で接触判定できそうなものが見当たらなかったのですが、
何か方法はないでしょうか?
(相手のオブジェクトに影響を与えたり、情報を得たりすることはないので、「ある」「ない」の判断が出来ればそれでいいです。)

環境・補足

unity2019.2.1f1

実際の環境でもcolliderはbox colliderを使う予定です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

物理エンジンがどの範囲までの事を指すのか分からないですが、Collision系以外で思いつくのはこれくらいでしょうか。

Rayを飛ばして当たったオブジェクトの情報を得る方法

Unity】2点間の距離を求めるいくつかの方法

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/09 14:18

    回答ありがとうございます。
    物理エンジンはvelocityやAddForceなど、rigidbodyに力を加えて移動させる形です。
    rayや距離も思いついてはいたのですが、collisionという一発で接触判定できるものがあるので、
    こちらで何かないのかな?という感じです。
    なので無さそうですあればrayを飛ばして判断しようと思います。。。

    キャンセル

  • 2019/09/09 14:41

    Collision系は当たった時点で呼ばれるので、Aポイントで当たり判定を取得したいというのは難しいかもしれませんね…。移動先に物体があるかどうか、の判定ならray飛ばした方が無難かもしれません。

    参考になるか分からないですが、イベント関数の実行順のURLを載せておきます。
    https://docs.unity3d.com/ja/2018.1/Manual/ExecutionOrder.html

    キャンセル

  • 2019/09/09 15:08

    ありがとうございます
    url先を見てみたのですが、OnCollisionEnterはupdateより先に呼ばれているんですね、、
    update内でログカウントを増やしていたので気づきませんでした。。

    もう少し他の人の回答を待ってみて、無さそうであればrayで試してみます!

    キャンセル

0

方法は様々ですが、一回移動させてから衝突判定を行い、当たっていればその命令を拒否するのが一般的な方法ですね。テレポートの時にも同じ方法で行けます。
下記のような感じで組めばいいと思いますす。

Vector3 oldPos = new Vector3(transform.position)
transform.position = new Vector3(200,300,200);//ここは値書いていなかった為適当です。
if (collision()){//関数名を失念致しました!!
    //当たっているので、元の位置に戻す。
    transform.position = oldPos
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/09 16:59

    rigitbodyの衝突判定ならあったはず...
    それを使えばいいんじゃない?

    キャンセル

  • 2019/09/09 19:44

    rigidbodyの衝突判定とはどれのことですか…?
    思い当たる範囲では、基本的にスクリプトで受け取るにはcolliderを通じてになりますし、スクリプトを使わないものなら物理エンジンで自動的に反射させるものになりますが、今回は諸事情で物理エンジンが使えないのでこのやり方はできないです。

    キャンセル

  • 2019/09/10 10:26

    良し、自作するか...
    形さえわかれば、後は簡単だ!!
    もはやunityの意味がない....

    キャンセル

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

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

関連した質問

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