ogimg
割と表題通りの試行錯誤。
Unity上でRigidbodyはフレームごとに計算されて描画されているらしい。
座標をfloat型で計算しているRigidbodyは原点(座標0,0,0)から
離れて遠くなると、やがて誤差が出てくる。

具体的に言うとなんか画面がガタガタしてくる。
描画するものにもよるけど、大体10000を超えると顕著に見られる。

VRChatなんかでもこれは見られる。
これを逆手に取って、少しずつ世界が崩壊していくというワールドもあって興味深い。



それはそうと、これオープンワールド程でないにしろ
広域のフィールド、マップを実装する時にちょっと厄介である。

ので。
その場を凌いでみる。


ざっくりと、以下がその処理。


using UnityEngine;

public class Openpoint : MonoBehaviour {

    // プレイヤー以外のオブジェクトを指定する(背景とか地形)
    public GameObject Terrain;


    // 更新用の関数
    void Update() {
        // プレイヤーのtransformを取得
        Transform myTransform = this.transform;
        // Terrainオブジェクトのtransformを取得
        Transform teraTransform = Terrain.transform;
        // プレイヤーの座標を取得
        Vector3 pos = myTransform.position;


        // プレイヤーの座標が一定値以上なら
        if ((Mathf.Abs(pos.x) >= 5000) || (Mathf.Abs(pos.y) >= 5000) || (Mathf.Abs(pos.z) >= 5000)) {
            // Terrainの座標にプレイヤーの座標をマイナスする
            teraTransform.position -= pos;
            // プレイヤーの座標を原点オブジェクトの中心に再設定
            pos.x = 0;
            pos.y = 0;
            pos.z = 0;
            myTransform.position = pos;
        }
    }
}


一定距離にプレイヤーキャラが到達すると突然、座標0に飛ばされるが、
フィールドや背景といったプレイヤーキャラ以外のオブジェクトも一緒に
ワープしてくるので、見かけ上は何も起こっていない。
でもワールド座標は0になったから計算誤差は防げる、みたいな処理。

はっきり言って無理が過ぎるけど、
単純なフライトシムとかだと意外と使えたりする。

使えるなら使ってみてほしい。