Örneğin, ünlü Flappy Bird oyunu ya da gerçekten sıralanan herhangi bir şey oyuncu (bu durumda kuş ya da kamera hangisini tercih ederseniz) ileri doğru ya da tüm dünya geriye doğru hareket ediyor (kuş sadece Y konumunu değiştirir ve sabit X konumu)?
Örneğin, ünlü Flappy Bird oyunu ya da gerçekten sıralanan herhangi bir şey oyuncu (bu durumda kuş ya da kamera hangisini tercih ederseniz) ileri doğru ya da tüm dünya geriye doğru hareket ediyor (kuş sadece Y konumunu değiştirir ve sabit X konumu)?
Yanıtlar:
Philipp'in cevabına biraz katılıyorum ; ya da en azından nasıl sunduğuyla. Dünyayı oyuncunun etrafında hareket ettirmenin daha iyi bir fikir olabileceği izlenimini veriyor; tam tersi olduğunda. Yani burada kendi cevabım ...
Her iki seçenek de işe yarayabilir, ancak genel olarak dünyayı dünyadaki oyuncu yerine oyuncu etrafında dolaştırarak “fiziği tersine çevirmek” kötü bir fikirdir.
Dünyada genellikle çok fazla nesne olacak; çoğu değilse, statik veya uyur. Müzikçalar bir veya nispeten az sayıda nesneye sahip olacak. Tüm dünyayı oyuncunun etrafında dolaştırmak, oyuncu dışındaki sahnede yer alan her şeyi taşımak anlamına gelir. Statik nesneler, uyku dinamik nesneleri, aktif dinamik nesneler, ışık kaynakları, ses kaynakları vb .; hepsinin taşınması gerekiyor.
Bu (tabii ki), yalnızca gerçekte hareket eden şeyi (oyuncu ve belki birkaç şey) hareket ettirmekten oldukça daha pahalı.
Dünyayı oyuncu etrafında hareket ettirmek dünyayı (ve içindeki her şeyi) olayların en aktif olarak gerçekleştiği nokta haline getirir. Sistemdeki herhangi bir hata veya değişiklik, potansiyel olarak her şeyin değiştiği anlamına gelir. Bu işleri yapmak için iyi bir yol değil; Hataların / değişikliklerin mümkün olduğunca izole olmasını istersiniz, böylece değişiklik yapmadığınız bir yerde beklenmeyen davranışlar elde edemezsiniz.
Bu yaklaşımla ilgili başka birçok problem var. Örneğin, işlerin motor içinde nasıl çalışması gerektiği ile ilgili birçok varsayımı kırıyor. RigidBody
Örneğin, oynatıcıdan başka hiçbir şey için dinamik kullanamazsınız ; RigidBody
kinematik ayarlanmamış bir nesnenin pozisyon / dönüş / ölçek (oyuncu hariç, sahnedeki her nesne için her kareyi yapıyor olacaksınız) ayarlarken beklenmedik şekilde davranacağından
Şey ... evet ve hayır . Philipp'in cevabında da belirtildiği gibi, sonsuz koşucu bir tür oyunda (ya da büyük ve kesintisiz bir keşfedilebilir alana sahip herhangi bir oyunda), başlangıç noktasından çok uzağa gitmek sonunda farkedilir FPPE'leri ( Kayan Nokta Hassas Hataları ) ve daha sonra hala sonuçta ortaya çıkar. Sayısal türün üzerine taşarsanız ya oyununuzun çökmesine neden olur ya da temel olarak oyun dünyasında duman kırılmasına neden olur ... Steroidlerle! 😵 (çünkü bu noktada FPPE'ler oyunu zaten “normal” çatlakta yapacaktır)
İkisini de yapmayın! Dünyayı sabit tutmalı ve oynatıcıyı onun etrafında hareket ettirmelisin. Ancak , oyuncu sahnenin kökünden (konumundan ) uzaklaşmaya başladığında, hem oyuncu hem de dünyayı “yeniden köklendirin” . [0, 0, 0]
Şeylerin göreceli pozisyonunu koruyorsanız (çevresindeki dünyaya oyuncu) ve bu işlemi tek bir kare güncellemesinde yaparsanız, (gerçek) oyuncu fark etmez!
Bunu yapmak için iki ana seçeneğiniz vardır:
Unity'nin kaynak koduna bakarsanız, 1e-5
( 0.00001
) nesnelerin konumlarından, [euler-] döndürmelerden ve ölçeklerden sorumlu veri türlerinin "eşit", içinde Vector2
ve içindeki iki eşit nokta değerini göz önüne almak için temel olarak kullanırlar Vector3
. Kayan nokta hassasiyet kaybı her iki şekilde de sıfırdan uzakta gerçekleştiğinden, sahne kökünün / kaynağının uzağındaki 1e+5
( 100000
) birimlerin altındaki her şeyin birlikte çalışmanın güvenli olduğunu varsaymak güvenlidir.
Fakat! Dan beri...
... o zaman muhtemelen 100000 ünite işaretinden çok daha erken / daha sık köklendirme yapmak iyi bir fikirdir. Sağladığım örnek video, örneğin her 1000 birimde bir yapıyor gibi görünüyor.
Her iki seçenek de çalışır.
Ancak, sonsuz koşucunun gerçekten sonsuz olmasını istiyorsanız, oyuncuyu sabit tutmanız ve dünyayı hareket ettirmeniz gerekecektir. Aksi halde, X konumunu saklamak için kullandığınız değişkenlerin sınırlarına varacaksınız. Bir tam sayı sonunda taşar ve kayan nokta değişkeni giderek daha az doğru olur ve bu da oyunun bir süre sonra aksaklığına neden olur. Ancak, bu problemi, hiç kimsenin bir seansta düşünülebileceği bir zaman diliminde bu problemlerle kimsenin karşılamayacağı kadar büyük bir tip kullanarak (bir oyuncu saniyede 1000 piksel hareket ettiğinde, bir 32 bit tamsayı 49 gün sonra taşacaktır) kullanarak önleyebilirsiniz.
Öyleyse, kavramsal olarak size daha sezgisel olarak hissettiren her şeyi yapın.
Off Bina XenoRo cevabı yerine onlar açıklamak yeniden köklenme yöntemin, bir aşağıdakileri yapabilirsiniz:
Sonsuz haritanızın oluşturduğu parçaların dairesel bir tamponunu oluşturun, karakteriniz modulo aritmetik ile güncellenmiş pozisyonda ilerler (böylece sadece dairesel tamponun etrafında koşarsınız). Karakteriniz parçadan çıkar çıkmaz tamponunuzun parçalarını değiştirmeye başlayın. Oyuncular güncelleme denklemi gibi bir şey olurdu:
player.position = (player.position + player.velocity) % worldBuffer.width;
İşte neden bahsettiğimin bir resimsel örneği:
İşte sonunda sarmalamada olanlara bir örnek.
Bu yöntemle, hiç bir zaman hassas hatalarla karşılaşmazsınız, ancak bunu çok uzak görüş mesafesiyle 3B olarak yapmayı düşünüyorsanız çok daha büyük bir arabellek yapmanız gerekebilir (çünkü yine de kendinizin önünde görmeniz gerekebilir) ). Flappy kuşu ise, yığın boyutunuz muhtemelen yalnızca tek bir ekran için tek bir sahne tutması gerektiği kadar büyük olacaktır ve tamponunuz çok küçük olabilir.
Birlikte sonuçlar tekrar elde etmek için başlangıç unutmayın BİR PRNG ve PRNG nesil olmayan tekrarlayan dizilerinin maksimum sayısı ile, (bitlerin sayısı dahili olarak kullanılan 2) POW uzunluğu tipik olarak daha az twister merzenne bu değil 2.5k dahili durum kullandığı için, bir problemin çoğunu kullanıyorsanız, ancak küçük varyantı kullanıyorsanız, tekrarlamadan önce en fazla 2 ^ 127-1 yineleme yaparsınız (veya daha kötüsü), bu yine de astronomik olarak büyük bir sayıdır . PRNG'niz tohum için iyi çığ karıştırma fonksiyonları ( kısa süreli eklediğiniz gibi) art arda çağı karıştırma fonksiyonları ile kısa bir süre olsa bile tekrar eden dönem sorunlarını çözebilirsiniz .
Daha önce sorulduğu ve kabul edildiği gibi, oyununuzun kapsamına ve tarzına bağlıdır, ancak bahsedilmediğinden beri: FlappyBird dünyadaki oyuncu yerine ekranın karşısındaki engeli hareket ettirir.
Bir yumurtacı, Vector2.left
yönünde sabit bir hızla nesnelerden ekranları başlatıyor .