同じタグのついた複数のオブジェクトの中で、最もプレイヤーに近いオブジェクトだけをターゲットするというスクリプトを見つけたのですが、どういう仕組みで動いているのかいまいちわかりません。
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。