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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

520閲覧

unity接触判定について

yuuyu

総合スコア1135

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2019/09/09 04:57

##経緯

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

##コード

C#

1using UnityEngine; 2 3public class test01 : MonoBehaviour{ 4 5 public Transform transform; 6 int i = 0; //デバッグ用 7 8 void Start () { 9 transform = this.GetComponent<Transform>(); 10 } 11 12 void Update () { 13 i++; 14 transform.position = new Vector3(transform.position.x,transform.position.y,transform.position.z + 0.1f); 15 16 //ポイントA 17 18 print("Update called (" + i + ")"); 19 } 20 21 private void OnCollisionEnter ( Collision collision ) { 22 print("OncollisionEnter called (" + i + ")"); 23 } 24}

●移動するオブジェクト
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を使う予定です。

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

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

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

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

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

guest

回答2

0

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

C#

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

投稿2019/09/09 05:09

編集2019/09/09 05:12
stdio

総合スコア3307

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

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

yuuyu

2019/09/09 05:11

回答ありがとうございます。 >if (collision()){//関数名を失念致しました!! このcollision()に該当する関数が見当たらないので今回の質問をしています、、、
yuuyu

2019/09/09 06:13

Collisionはstatic関数ではないので、変数で自身を入れないといけないですが、 objectにcollisionのcomponentが無いので、 Collision collision = this.GetComponent<Collision>(); ができないです。 なので、どの変数もcollision()に該当させることができないんです。。
stdio

2019/09/09 07:59

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

2019/09/09 10:44

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

2019/09/10 01:26

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

0

ベストアンサー

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

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

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

投稿2019/09/09 05:08

編集2019/09/09 05:08
simapiko

総合スコア332

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

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

yuuyu

2019/09/09 05:18

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

2019/09/09 05:41

Collision系は当たった時点で呼ばれるので、Aポイントで当たり判定を取得したいというのは難しいかもしれませんね…。移動先に物体があるかどうか、の判定ならray飛ばした方が無難かもしれません。 参考になるか分からないですが、イベント関数の実行順のURLを載せておきます。 https://docs.unity3d.com/ja/2018.1/Manual/ExecutionOrder.html
yuuyu

2019/09/09 06:08

ありがとうございます url先を見てみたのですが、OnCollisionEnterはupdateより先に呼ばれているんですね、、 update内でログカウントを増やしていたので気づきませんでした。。 もう少し他の人の回答を待ってみて、無さそうであればrayで試してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問