[Unity 3D] ゲームオブジェクトの頂点の座標を取得する方法。

(2024/09/09)
[Unity 3D] ゲームオブジェクトの頂点の座標を取得する方法。

開発環境
  • Unityのバージョン:2022.3.32f1
  • ゲームオブジェクトの頂点の座標を取得することで、オブジェクトの配置などをより効率的に行うことが出来ます。

    ゲームオブジェクトのすべての頂点の座標を取得する方法。

    ゲームオブジェクトの頂点の座標を取得するには、MeshFilterコンポーネントからMeshデータを取得し、
    で頂点座標の配列を取得します。

    using UnityEngine;
    
    public class Sample : MonoBehaviour
    {
        void Start()
        {
            Mesh mesh = GetComponent<MeshFilter>().mesh;
            Vector3[] vertices = mesh.vertices;
    
            // 頂点座標を表示する
            foreach (Vector3 vertex in vertices)
            {
                // ローカル座標を表示
                Debug.Log("ローカル座標: " + vertex);
    
                // ワールド座標に変換して表示
                Vector3 worldPos = transform.TransformPoint(vertex);
                Debug.Log("ワールド座標: " + worldPos);
            }
        }
    } 
    

    重複している頂点の座標を除く方法

    重複している頂点の座標を除くには、Listを使います。

    using UnityEngine;
    using System.Collections.Generic; // Listを使うため名前空間を追加
    
    public class Sample : MonoBehaviour
    {
    
        void Start()
        {
            Mesh mesh = GetComponent<MeshFilter>().mesh;
            Vector3[] vertices = mesh.vertices;
    
            // 重複しない頂点を格納するリスト
            List<Vector3> uniqueVertices = new List<Vector3>();
    
            // 重複をチェックしながらリストに追加
            foreach (Vector3 vertex in vertices)
            {
                if (!uniqueVertices.Contains(vertex))
                {
                    uniqueVertices.Add(vertex);
                }
            }
    
            // 重複しない頂点座標を表示する
            foreach (Vector3 vertex in uniqueVertices)
            {
                // ローカル座標を表示
                Debug.Log("ローカル座標: " + vertex);
    
                // ワールド座標に変換して表示
                Vector3 worldPos = transform.TransformPoint(vertex);
                Debug.Log("ワールド座標: " + worldPos);
            }
        }
    }
    

    Y座標の値が最大・最小の頂点の座標を取得する方法

    下のコードを、頂点の座標を取得したいゲームオブジェクトにアタッチしてエディターを再生すると、コンソールにY座標が最大・最小の頂点の座標のローカル座標・ワールド座標の両方が表示されます。

    using UnityEngine;
    
    public class Sample : MonoBehaviour
    {
        void Start()
        {
            Mesh mesh = GetComponent<MeshFilter>().mesh;
            Vector3[] vertices = mesh.vertices;
    
            // 最大・最小のy座標を持つ頂点を初期化
            Vector3 maxYVertex = vertices[0];
            Vector3 minYVertex = vertices[0];
    
            // 全ての頂点を調べて最大・最小のy座標を更新
            foreach (Vector3 vertex in vertices)
            {
                if (vertex.y > maxYVertex.y)
                {
                    maxYVertex = vertex;
                }
    
                if (vertex.y < minYVertex.y)
                {
                    minYVertex = vertex;
                }
            }
    
            // 最大・最小のy座標を持つ頂点のローカル座標を表示
            Debug.Log("最大y座標を持つ頂点 (ローカル座標): " + maxYVertex);
            Debug.Log("最小y座標を持つ頂点 (ローカル座標): " + minYVertex);
    
            // 最大・最小のy座標を持つ頂点のワールド座標を表示
            Debug.Log("最大y座標を持つ頂点 (ワールド座標): " + transform.TransformPoint(maxYVertex));
            Debug.Log("最小y座標を持つ頂点 (ワールド座標): " + transform.TransformPoint(minYVertex));
        }
    }