追記修正欄に記入しました条件を前提に、目的の4頂点の座標を調べる実験をしてみました。おそらく下記のような感じで頂点のワールド座標を得られるかと思いますが、いかがでしょうか?
Cubeの各頂点は法線の異なる3つの頂点が重複しているので、それを除外し8頂点に減らして、8頂点のうちモデル座標のYが正の4頂点だけを抜き出し(負の4頂点でも構わないと思います)、ワールド座標に変換して、X成分・Z成分だけを取り出すことにしました。
あいにくJavascriptは不慣れでして、変なコードになってしまったかもしれませんがご容赦ください。
Javascript
1#pragma strict
2
3import System.Linq;
4
5class CubeVertices extends MonoBehaviour {
6
7 var cube : GameObject;
8
9 function Start() {
10 var mesh : Mesh = cube.GetComponent.<MeshFilter>().mesh;
11
12 var vertices : Vector2[] = mesh.vertices // 全24頂点のうち...
13 .Distinct.<Vector3>() // 位置が重複するものを除外(24→8頂点に)
14 .Where.<Vector3>(function(p : Vector3) : boolean
15 {
16 return p.y > 0.0f; // Y座標が+のものだけを抽出(8→4頂点に)
17 })
18 .Select.<Vector3, Vector2>(function(p : Vector3) : Vector2
19 {
20 var worldPosition : Vector3 = cube.transform.TransformPoint(p); // モデル座標をワールド座標に変換
21 return new Vector2(worldPosition.x, worldPosition.z); // 変換したワールド座標のうちX、ZだけをVector2として返す
22 })
23 .ToArray.<Vector2>(); // 以上の条件で得られた結果(Vector2型のデータ群)を配列に変換する
24
25 var vertexCount : int = vertices.Length;
26
27 for (var i : int = 0; i < vertexCount; i++)
28 {
29 Debug.Log(vertices[i]);
30 }
31 }
32}
###[追記]
もうすでにご自身で複数キューブの場合に書き換え済みかもしれませんが、ご参考までに例を追記します。
コメントで申し上げた、「最初に1回だけ頂点モデル座標を求めて、以後はワールド座標変換だけ行う」方式にしてみました。
Javascript
1#pragma strict
2
3import System.Linq;
4
5class CubeVertices extends MonoBehaviour {
6
7 var Units : GameObject[];
8
9 private static var CubeTopVertices : Vector3[];
10 private static var CubeTopVerticesLength : int;
11
12 private var Coordinatex : float[];
13 private var Coordinatez : float[];
14 private var UnitsLength : int;
15
16 function Start() {
17 UnitsLength = Units.length;
18
19 if (UnitsLength == 0) {
20 return;
21 }
22
23 InitCubeTopVertices(Units[0]); // オブジェクトを代表して、Units[0]からメッシュを取得しCubeTopVertices・CubeTopVerticesLengthを求める
24 Coordinatex = new float[UnitsLength * CubeTopVerticesLength];
25 Coordinatez = new float[UnitsLength * CubeTopVerticesLength];
26
27 // 実験のため、各オブジェクトをランダムに移動・回転させる
28 for (var i : int = 0; i < UnitsLength; i++) {
29 var unitRigidbody = Units[i].GetComponent.<Rigidbody>();
30
31 unitRigidbody.AddForce(Random.value * 2 - 1, 0, Random.value * 2 - 1, ForceMode.VelocityChange);
32 unitRigidbody.AddTorque(0, Random.value * 2 - 1, 0, ForceMode.VelocityChange);
33 }
34 }
35
36 function Update() {
37 // スペースキー押下で一時停止、頂点ワールド座標を調べる
38 if (Input.GetKeyDown(KeyCode.Space)) {
39 if (Time.timeScale > 0) {
40 Time.timeScale = 0;
41 UpdateCoordinates();
42 PrintCoordinates();
43 } else {
44 Time.timeScale = 1;
45 }
46 }
47 }
48
49 private function UpdateCoordinates() {
50 // 各オブジェクトのtransformでキューブの頂点モデル座標をワールド座標に変換し、Coordinatex・Coordinatezを更新する
51 for (var i : int = 0; i < UnitsLength; i++) {
52 var unitTransform : Transform = Units[i].transform;
53 var offset : int = i * CubeTopVerticesLength;
54
55 for (var j : int = 0; j < CubeTopVerticesLength; j++) {
56 var worldPosition : Vector3 = unitTransform.TransformPoint(CubeTopVertices[j]);
57
58 Coordinatex[offset + j] = worldPosition.x;
59 Coordinatez[offset + j] = worldPosition.z;
60 }
61 }
62 }
63
64 private function PrintCoordinates() {
65 // Coordinatex・Coordinatezの内容をコンソールに表示してみる
66 Debug.Log("Coordinates:");
67 for (var i : int = 0; i < UnitsLength; i++) {
68 var offset : int = i * CubeTopVerticesLength;
69
70 Debug.LogFormat(Units[i],
71 "Unit {0} ({1}) ... ({2:F4}, {3:F4}), ({4:F4}, {5:F4}), ({6:F4}, {7:F4}), ({8:F4}, {9:F4})",
72 i, Units[i].name,
73 Coordinatex[offset + 0], Coordinatez[offset + 0],
74 Coordinatex[offset + 1], Coordinatez[offset + 1],
75 Coordinatex[offset + 2], Coordinatez[offset + 2],
76 Coordinatex[offset + 3], Coordinatez[offset + 3]);
77 }
78 }
79
80 private static function InitCubeTopVertices(meshSource : GameObject) {
81 // 上面の頂点抽出までをあらかじめやっておく
82 if (CubeTopVertices == null) {
83 CubeTopVertices = meshSource.GetComponent.<MeshFilter>().sharedMesh.vertices
84 .Distinct.<Vector3>()
85 .Where.<Vector3>(function(p : Vector3) : boolean {
86 return p.y > 0.0f;
87 })
88 .ToArray.<Vector3>();
89 CubeTopVerticesLength = CubeTopVertices.length;
90 }
91 }
92}