ゲームオブジェクトの頂点の座標を取得することで、オブジェクトの配置などをより効率的に行うことが出来ます。
ゲームオブジェクトの頂点の座標を取得するには、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座標が最大・最小の頂点の座標のローカル座標・ワールド座標の両方が表示されます。
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));
}
}