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

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

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

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

Unity

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

Q&A

解決済

2回答

4105閲覧

一番近いオブジェクトを取得する方法について

shushudayo

総合スコア3

C#

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

Unity

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

1グッド

0クリップ

投稿2020/10/02 06:50

編集2020/10/02 06:58

同じタグのついた複数のオブジェクトの中で、最もプレイヤーに近いオブジェクトだけをターゲットするというスクリプトを見つけたのですが、どういう仕組みで動いているのかいまいちわかりません。

using UnityEngine; using System.Collections; public class nearTest : MonoBehaviour{ private GameObject nearObj; //最も近いオブジェクト private float searchTime = 0; //経過時間 // Use this for initialization void Start(){ //最も近かったオブジェクトを取得 nearObj = serchTag(gameObject, "Enemy"); } // Update is called once per frame void Update () { //経過時間を取得 searchTime += Time.deltaTime; if (searchTime >= 1.0f) { //最も近かったオブジェクトを取得 nearObj = serchTag(gameObject, "Enemy"); //経過時間を初期化 searchTime = 0; } //対象の位置の方向を向く transform.LookAt(nearObj.transform); //自分自身の位置から相対的に移動する transform.Translate(Vector3.forward * 0.01f); } //指定されたタグの中で最も近いものを取得 GameObject serchTag(GameObject nowObj,string tagName){ float tmpDis = 0; //距離用一時変数 float nearDis = 0; //最も近いオブジェクトの距離 //string nearObjName = ""; //オブジェクト名称 GameObject targetObj = null; //オブジェクト //タグ指定されたオブジェクトを配列で取得する foreach (GameObject obs in GameObject.FindGameObjectsWithTag(tagName)){ //自身と取得したオブジェクトの距離を取得 tmpDis = Vector3.Distance(obs.transform.position, nowObj.transform.position); //オブジェクトの距離が近いか、距離0であればオブジェクト名を取得 //一時変数に距離を格納 if (nearDis == 0 || nearDis > tmpDis){ nearDis = tmpDis; //nearObjName = obs.name; targetObj = obs; } } //最も近かったオブジェクトを返す //return GameObject.Find(nearObjName); return targetObj; } }

わからないのは

//オブジェクトの距離が近いか、距離0であればオブジェクト名を取得 //一時変数に距離を格納 if (nearDis == 0 || nearDis > tmpDis){ nearDis = tmpDis; //nearObjName = obs.name; targetObj = obs; }

という部分です。

nearDisにはずっと0が入っていて、tmpDisはVector3型の正の数の値をとっているはずなのに、条件式にnearDis>tmpDisというのが入っているのは何故なんでしょうか?この場合、nearDisには0が入っているので条件のnearDis>tmpDisを満たす場合は一つもない気がするのですが、反例はあるのでしょうか?また反対に、左側のnearDis==0という条件も、これはどの場合においてもnearDisには0しか入っていないと思うのでtrue判定が出ると思うのですが、こちらも反例があるのかいまいち理解できてません…つまり、私の頭の中では左側の条件のみずっとtrue判定が出ていて、右側の条件はずっとfalseが出ている気がしてしまっています。条件式も「||」が使われているので、なおさら左側の条件のみがtrue判定が出て入れ子の処理に移っていっているような感覚がします。そして、この条件の意味がわかっていないため入れ子の中の処理もわからないままでいます。何故この条件式で一番近いオブジェクトが取得できるのか、補足的に説明できる方がいればご教示お願いします。

参考したサイトのURL
https://blog.beatdjam.com/entry/2014/10/22/032751

ozwk👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

※この補足が不要である,すなわち,既存の回答で十分である場合には,既存回答の側をBAとして選択されたい.)


複数個のオブジェクトがあるとき,どれが一番近いか?を判断する処理:

  1. まずオブジェクトを1つ適当に選んで,これをとりあえず「一番近い物候補」(targetObj)とする.
  2. 残りのオブジェクトから1つ選んで,現在の「一番近い物候補」と比較する.

もしも選んできたオブジェクトが現在の「一番近い物候補」よりも近いならば,
この選んできたオブジェクトを,現状における「一番近い物候補」とする.
3. 上記の手続き2.を,全てのオブジェクトについて調べ終わるまで繰り返した結果の,「一番近い物候補」が,本当に一番近いオブジェクト.


if (nearDis == 0 || nearDis > tmpDis){ ... }

これは,上記の1.と2.を「まとめて」書いている,と言えばよいか.

  • 左側のnearDis == 0が,上記1.を行うための仕組み.

nearDisの初期値は0だから,初回は必ずこのifの条件を満たす.
その結果,targetObjは問答無用で最初のオブジェクトに,nearDisの値もこの最初のオブジェクトまでの距離になる.

  • 右側のnearDis > tmpDisが,上記2.における比較判断に相当.

(現在の「一番近い物候補」までの距離nearDisと,オブジェクトまでの距離tmpDisを比較している)

※オブジェクト群の中に「距離が0な」オブジェクトが存在する場合には,この実装では問題が生じ得る.

投稿2020/10/02 09:50

編集2020/10/02 10:01
fana

総合スコア11632

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

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

0

nearDisにはずっと0が入っていて

ここから間違いです。

if文内で
nearDis = tmpDis;があります。

投稿2020/10/02 07:02

ozwk

総合スコア13512

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

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

shushudayo

2020/10/03 08:11

そうですね!ちょっと自分の中で勘違いしてました。ご回答ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問