Saya sedikit tidak setuju dengan jawaban Philipp ; atau setidaknya dengan bagaimana dia mempresentasikannya. Ini memberi kesan bahwa menggerakkan dunia di sekitar pemain mungkin ide yang lebih baik; padahal justru sebaliknya. Jadi, inilah jawaban saya sendiri ...
Kedua opsi dapat bekerja, tetapi umumnya merupakan ide yang buruk untuk "membalikkan fisika" dengan menggerakkan dunia di sekitar pemain daripada pemain di seluruh dunia.
Kehilangan / pemborosan kinerja:
Dunia biasanya akan memiliki banyak objek; banyak jika tidak sebagian besar, statis atau tidur. Pemain akan memiliki satu, atau relatif sedikit, objek. Memindahkan seluruh dunia di sekitar pemain, berarti memindahkan semua yang ada di adegan kecuali pemain. Objek statis, objek dinamis tidur, objek dinamis aktif, sumber cahaya, sumber suara, dll; semua harus dipindahkan.
Itu (jelas) jauh lebih mahal daripada hanya memindahkan apa yang sebenarnya bergerak (pemain, dan mungkin beberapa hal lagi).
Maintabilitas & Ekstensibilitas:
Menggerakkan dunia di sekitar pemain membuat dunia (dan semua yang ada di dalamnya) menjadi titik di mana hal-hal yang paling aktif terjadi. Setiap bug atau perubahan dalam sistem berarti bahwa, berpotensi, semuanya berubah. Ini bukan cara yang baik untuk melakukan sesuatu; Anda ingin bug / perubahan terisolasi sebanyak mungkin, sehingga Anda tidak mendapatkan perilaku tak terduga di suatu tempat yang belum Anda lakukan perubahan.
Ada juga banyak masalah lain dengan pendekatan ini. Sebagai contoh, itu mematahkan banyak asumsi tentang bagaimana segala sesuatu seharusnya bekerja di dalam mesin. Anda tidak akan dapat menggunakan dinamis RigidBody
untuk apa pun selain pemain, misalnya; sebagai objek dengan lampiran yang RigidBody
tidak disetel ke kinematik akan berperilaku tak terduga ketika mengatur posisi / rotasi / skala (yang akan Anda lakukan setiap frame, untuk setiap objek dalam adegan, kecuali pemain 😨)
Jadi jawabannya adalah memindahkan pemain saja!
Ya ... ya dan tidak . Seperti yang disebutkan dalam jawaban Philipp, dalam jenis game pelari tak terbatas (atau game apa pun dengan area eksplorer besar yang mulus), terlalu jauh dari asalnya pada akhirnya akan memperkenalkan FPPE yang terlihat ( Floating-Point Precision Errors ), dan lebih jauh lagi, akhirnya, melimpahi tipe numerik, baik menyebabkan game Anda crash, atau, pada dasarnya, membuat asap-dunia permainan retak ... Pada steroid! 😵 (karena pada titik ini, FPPEs akan membuat gim tersebut sudah berada pada celah "normal")
The aktual solusi:
Jangan melakukan keduanya dan lakukan keduanya! Anda harus menjaga dunia tetap statis, dan menggerakkan pemain di sekitarnya. Tapi "re-root" baik , pemain dan dunia, ketika pemain mulai terlalu jauh dari akar (posisi [0, 0, 0]
) adegan.
Jika Anda mempertahankan posisi relatif barang (pemain dengan dunia di sekitarnya), dan melakukan proses ini dalam satu pembaruan bingkai, pemain (sebenarnya) bahkan tidak akan menyadarinya!
Untuk melakukannya, Anda memiliki dua opsi utama:
- Pindahkan pemain ke akar adegan, dan pindahkan potongan dunia ke posisi baru itu relatif terhadap pemain.
- Pikirkan dunia seperti kotak; pindahkan bagian grid yang pemain mainkan ke root, dan pindahkan pemain ke posisi baru itu relatif terhadap bagian grid itu.
Berikut adalah contoh dari proses ini dalam tindakan
Tapi, seberapa jauh terlalu jauh?
Jika Anda melihat kode sumber Unity, mereka menggunakan 1e-5
( 0.00001
) sebagai dasar untuk mempertimbangkan dua nilai titik-mengambang "sama", di dalam Vector2
dan Vector3
(tipe-data yang bertanggung jawab atas posisi objek, rotasi dan skala [euler-]). Karena kehilangan presisi floating-point terjadi jauh dari nol, aman untuk mengasumsikan bahwa apa pun di bawah 1e+5
( 100000
) unit yang jauh dari tempat asal / asal aman untuk digunakan.
Tapi! Sejak...
- Lebih tepat membuat sistem untuk menangani proses rooting ulang ini secara otomatis.
- Apa pun gim Anda, tidak perlu ada "bagian" dunia yang berdekatan untuk menjadi 100000 unit (meter [?]).
... maka mungkin ide yang bagus untuk melakukan root ulang lebih cepat / lebih sering daripada tanda 100000 unit. Contoh video yang saya berikan tampaknya melakukannya setiap 1000 unit atau lebih, misalnya.