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

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

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

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

Unity3D

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

Unity

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

Q&A

1回答

972閲覧

Unity(C#)で、コライダーの衝突判定を、OnTriggerEnter(Collider)ではなく、 自分で作ったメソッドの中で使いたい

MementoMORI1202

総合スコア10

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2018/10/27 12:02

編集2018/10/27 13:16

前提・実現したいこと

Unityで、コライダーの衝突判定を、OnTriggerEnter(Collider)ではなく、
自分で作ったメソッドの中で使いたいです。

具体的なやりたいこと。
Sceneの中に複数のゲームオブジェクトA、複数のゲームオブジェクトBがあります。
Aはこのスクリプトの中の別のメソッドを使って、シーンの中をランダムに移動しています。
Bは動きません。

別のスクリプトからこのメソッドを呼び出します。
Aのうち、いくつかを選んで、Bへ向かわせます
選ばれたAとBがぶつかった際、処理を行い、その後、このメソッドを完了したことを変数で保管します。

発生している問題・エラーメッセージ

どうすればいいのかわからない

該当のソースコード

C#

1//このスクリプトはゲームオブジェクトAのコンポーネントになります 2 3//Aが選ばれているか判別する変数 4private bool CHOSEN; 5private bool MethodFIN; 6//rbにはAのRigidBody2Dが入っています 7RigidBody2D rb; 8 9//選ばれたAはBを一つ選んでそこへ向かう 10//MyMethodは別のスクリプトから呼び出したいです 11public void MyMethod(){ 12     //選ばれていたら 13 if (CHOSEN == true) { 14 ///Bを一個選ぶ 15 GameObject target = ChosenRandomGameObject ("B"); 16 //選んだBの場所を取得して向かう 17 Rigidbody2D TargetBody = target.GetComponent<Rigidbody2D> (); 18 rb.velocity = TargetBody.position; 19       //ここからわかりません 20 21 //先ほど選んだBに衝突したらこのゲームオブジェクトを消したい。 22       //衝突先が選んだBでなければそのまま動かす。 23        24 25       //ここまでわかりません 26 //行為が完了したことを記録します 27 MethodFIN = True 28 } 29 else{ 30 //選ばれなかったAは何もしない 31 MethodFIN = True 32 } 33Gameobject ChosenRandomGameObject (strings S){ 34//省略 35//シーンに存在する"S"を含むゲームオブジェクトから、ランダムに一つ選んで返します。動作確認済み。 36} 37

試したこと

そういったことのできそうな関数を探したが見つからなかった。

補足情報(FW/ツールのバージョンなど)

Unity Ver.2017.2.0f3

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

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

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

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

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

fiveHundred

2018/10/27 12:40

OnTriggerEnter()内で「ぶつかったオブジェクトがBであれば…」と書いた方が楽で確実だと思いますが、そこまでしてOnTriggerEnter()を使いたくない理由はなんでしょうか?
MementoMORI1202

2018/10/27 13:14 編集

初心者のため、拙いスクリプトで恐縮ですが、大きな理由が3つありまして、 1つ目は、MyMethodは、別のスクリプトから呼び出される関数のため、そこで起きることはできるだけ処理をまとめたい。 2つ目は、コードを簡略化するために質問文では削ってしまったが、実際に実装する際は、処理を終えた後、処理を終えたことを保持したい。 3つ目はBも複数存在するので(選ぶのは一つですが)、その処理をOnTriggerEnter()内で書くと、煩雑になりそうだった。という理由です。 やはり、”MyMethod内である”というフラグを作ってOnTriggerEnter()を使ったほうが綺麗に行くのでしょうか?
guest

回答1

0

「処理」という言葉の意味がよくわかりませんが、「ぶつかるまでMyMethod()内で待機する」ということでしょうか?
もしそうであれば、関数が終了しない限り他の処理が行えないというUnityの仕様によって、フリーズします。
一応、コルーチンを使えば実装できなくはないですが、「ゲームオブジェクトを選択する」処理と「当たり判定を行う」処理を行うタイミングは別々(前者は1回だけだが、後者は毎フレーム行う)なので、分けて考えた方が良いかなと思います。
その上で私だったら、以下のように書きます。
(動作未確認なので、エラーなどがあったらすいません)

C#

1private bool CHOSEN; 2private bool MethodFIN; 3RigidBody2D rb; 4private GameObject target; // 選択されたオブジェクトBをメンバ変数で保持 5 6// MyMethod()は最初の1回だけ呼ぶ 7public void MyMethod(){ 8 if (CHOSEN == true) { 9 target = ChosenRandomGameObject ("B"); 10 Rigidbody2D TargetBody = target.GetComponent<Rigidbody2D> (); 11 rb.velocity = TargetBody.position; 12 // 当たり判定の処理はここでは行わない(OnTriggerEnter()で行う) 13 } 14} 15 16void OnTriggerEnter(Collider col) { 17 // ぶつかったオブジェクトがBかどうか 18 if (col.gameObject == target) { 19 // ぶつかったときの処理 20 21 // ぶつかったときの処理が完了したことを通知 22 MethodFIN = true; 23 } 24}

投稿2018/10/27 13:45

fiveHundred

総合スコア9803

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問