Unityに関連する記事です

ゲーム内の特定の種類のゲームオブジェクトをすべて取得して、その中の最も近いゲームオブジェクトの情報を取得する


 上記の処理を実行するためのSearchGameObjectスクリプトを作成します。
 作成したSearchGameObjectスクリプトを任意のゲームオブジェクトにアタッチすることによって、
アタッチされたゲームオブジェクトから見て最も近い距離にいる別のゲームオブジェクトの情報を取得する、という内容になっています。

 今回のケースではSearchGameObjectスクリプトをプレイヤー役のゲームオブジェクトにアタッチします。
タグには「Enemy」を指定しておいて、ゲーム内に存在するすべての「Enemy」タグを持つゲームオブジェクトをUpdateで常に取得します。
取得したゲームオブジェクトとプレイヤーとの距離をそれぞれ算出し、その差分が最も小さいゲームオブジェクトの情報を取得するようにしています。
 この結果を用いることで、「最も近くにいる敵を対象にとる」というロジックに利用できます。


検証動画(Consoleに取得したゲームオブジェクトの名前が表示されます)
https://gyazo.com/0be28b486ef177e6243898c2d97910b3


SearchGameObjectスクリプトを作成する


SearchGameObject.cs

 <= クリックすると開きます。




 無事に取得できましたら、あとは取得したゲームオブジェクトの情報を他のクラスと紐づけするか、あるいは別のクラスの変数に直接代入するようにすれば利用できるようになります。

インスペクター画像



検証動画(SearchGameObjectのsearchNearObjの値が変化していることを確認します)
https://gyazo.com/6abaff18db8d19357caa742de6a594f8


<リファクタリング>


 Seach メソッド内の処理は LINQ の機能を利用することにより、処理の簡略記述出来ます。


private GameObject Search()
{
    GameObject[] objs = GameObject.FindGameObjectsWithTag(tagName);

    GameObject searchTargetObj = objs
        .OrderBy(obj => Vector3.Distance(obj.transform.position, transform.position))
        .FirstOrDefault();

    return searchTargetObj;
}


 このリファクタリングでは、LINQのOrderByメソッドを使用して、オブジェクトを距離の昇順でソートし、
FirstOrDefaultメソッドで最初のオブジェクトを取得しています。

 これにより、コードが簡潔になり、最も近いオブジェクトを検索する処理がより明示的になりました。


 
 処理が正しく読み解けるようになってきたら、さらなる簡略化が可能です。


private GameObject Search()
{
    return GameObject.FindGameObjectsWithTag(tagName)
        .OrderBy(obj => Vector3.Distance(obj.transform.position, transform.position))
        .FirstOrDefault();
}

 いずれも戻り値の値を利用した、メソッドチェーンによる記法です。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます