🎮

三次元空間にグリッドをつくる

2024/04/08に公開

迷子を回避する

三次元空間に時間軸と空間軸を取って歴史を表示するデータベースをつくっている。
データ数がまだ少ないせいもあるけれど、
空間内での迷子感が否めない。
各データを表示するマーカー自体にも上下と北方向がわかる形を採用しているし
遠近感はマーカーの見え方(近ければ大きいし遠ければ小さい)で表現しているとはいえ、
なんとも心許ない。
なので、図書館の書棚にあたるグリッドを表示することにした。

まずは垂直な柱を立てる

世界198カ国・地域の首都の位置に、過去から未来を貫く柱を立ててみた。
といってもつくった柱は一本だけで、
それをprefabにして、CSVで各国首都の座標を入れて、複製したのだ。
おおお、きれいに立ったよ、ちょっと感動。
ところが、一人称視点で移動しようとしたら、
ずっとピープ音が鳴りっぱなし。
うーん、私のMacのスペックをオーバーしているのか?
別にMaterialに凝ったりしているわけではない。
ハイスペックなゲームのobject数からみたら、大したことないだろうと思うんだけれど、
まあ、何か手を打たなければ。

首都に建てる、という案を捨てて、
緯度経度、60度間隔で建てることにした。
0-0度に一本建てて、CSVで複製。
Scriptはこんな感じ。

using UnityEngine;
using System.Collections.Generic;
using System.IO;

public class ColumnImporter : MonoBehaviour
{
    public GameObject columnPrefab; // プレハブを指定
    public string fileName = "Columns"; // CSVファイル名

    void Start()
    {
        // CSVファイルを読み込み、行ごとに分割する
        TextAsset csvData = Resources.Load<TextAsset>(fileName);
        string[] lines = csvData.text.Split('\n');
        for (int i = 1; i < lines.Length; i++)
        {
            string[] parts = lines[i].Split(',');
            if(parts.Length < 2) continue; //

            float lat = float.Parse(parts[0]) * 10;
            float lon = float.Parse(parts[1]) * 10;

            GameObject columnObject = Instantiate(columnPrefab, new Vector3(lon, 0, lat), Quaternion.identity);
 
        }
    }
}

東西ラインで発生した問題

Cylinderを横倒しにしてprefabをつくり、CSVで複製
さっきと同じことだし、簡単、と思ったら表示されない。
Hierarchyには複製されたCylinderがずらっと並んでいるのに、どこにもない。
で、はっと気づく。
複製されたCylinderが、水平じゃなく垂直に立っている。
おかしいだろう、種はちゃんと横倒しにしてあるのに。
まあ、仕方ない、Scriptでローテーションをかける。

using UnityEngine;
using System.Collections.Generic;
using System.IO;

public class EastWestImporter : MonoBehaviour
{
    public GameObject eastWestPrefab; // プレハブを指定
    public string fileName = "EastWest"; // CSVファイル名

    void Start()
    {
        // CSVファイルを読み込み、行ごとに分割する
        TextAsset csvData = Resources.Load<TextAsset>(fileName);
        string[] lines = csvData.text.Split('\n');
        for (int i = 1; i < lines.Length; i++)
        {
            string[] parts = lines[i].Split(',');
            if(parts.Length < 2) continue; 

            float hor = float.Parse(parts[0]) * 10;
            float ver = float.Parse(parts[1]);

            GameObject columnObject = Instantiate(eastWestPrefab, new Vector3(0, ver, hor), Quaternion.Euler(0, 0, 90));
 
        }
    }
}

南北ラインは無事

三方向合わせて80本ぐらい、198よりはだいぶ減ったので、ピーピー言わなくなった。
CylinderからColliderを外す。でないとぶつかるからね。
別になんということのないグリッドだけど
なんか、安心感出た、と思う。

deployの仕方忘れた(>_<)

復習してから上げよう。

四次元年表
https://app.laporte.academy

Discussion