B-Teck!

お仕事からゲームまで幅広く

【Unity】指定されたタグの中で最も近いオブジェクトを取得する

複数のオブジェクトから一番近いオブジェクトを判別して移動させるスクリプトが欲しくて、とりあえずざっと書いてみた。
C#数時間触った程度な上に、Unity上でスクリプト書くの初めてみたいなものだから
だいぶ非効率な方法だと思うけど勘弁してくださいな。

2014/10/23
ゲームオブジェクトFindで取得しないで直接戻り値にすればいいじゃんって指摘を貰ったので修正
変数初期化忘れててコンパイルエラー出て戸惑ってた

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, "Player");
    }
    
    // Update is called once per frame
    void Update () {

        //経過時間を取得
        searchTime += Time.deltaTime;

        if (searchTime >= 1.0f) {
            //最も近かったオブジェクトを取得
            nearObj = serchTag(gameObject, "Player");

            //経過時間を初期化
            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;
    }
}