예를 들어 유명한 Flappy Bird 게임 또는 실제로 정렬되는 것은 플레이어 (이 경우 새 또는 원하는 카메라)가 앞으로 이동하거나 전 세계가 뒤로 이동하는 것입니다 (조류는 Y 위치 만 변경하고 일정한 X 위치)?
예를 들어 유명한 Flappy Bird 게임 또는 실제로 정렬되는 것은 플레이어 (이 경우 새 또는 원하는 카메라)가 앞으로 이동하거나 전 세계가 뒤로 이동하는 것입니다 (조류는 Y 위치 만 변경하고 일정한 X 위치)?
답변:
필립의 대답에 약간 동의하지 않습니다 . 또는 적어도 그가 그것을 제시 한 방법으로. 플레이어 주변으로 세상을 움직이는 것이 더 좋은 아이디어라는 인상을줍니다. 정확히 반대 일 때. 그래서 여기 내 자신의 대답이 있습니다 ...
두 옵션 모두 작동 할 수 있지만 일반적으로 전 세계 플레이어가 아닌 플레이어 주위로 세계를 이동하여 "물리를 뒤집는"것은 나쁜 생각입니다.
세상에는 보통 많은 물건이있을 것입니다. 대부분은 아니지만 정적 또는 수면. 플레이어는 하나 또는 비교적 적은 수의 객체를 갖습니다. 플레이어 주변에서 전 세계를 움직이는 것은 플레이어를 제외한 모든 장면을 움직이는 것을 의미합니다. 정적 객체, 수면 동적 객체, 활성 동적 객체, 광원, 사운드 소스 등 모두 움직여야합니다.
그것은 실제로 움직이는 것 (플레이어, 그리고 몇 가지 더 많은 것)만을 움직이는 것보다 (비슷하게) 상당히 비쌉니다.
플레이어 주위로 세상을 움직이면 세상 (그리고 그 안의 모든 것)이 일이 가장 활발하게 일어나는 지점이됩니다. 시스템의 모든 버그 또는 변경은 잠재적으로 모든 것이 변경됨을 의미합니다. 이것은 일을하는 좋은 방법이 아닙니다. 버그 / 변경 사항을 가능한 한 격리하여 변경하지 않은 곳에서 예기치 않은 동작이 발생하지 않도록합니다.
이 접근법에는 다른 많은 문제들도 있습니다. 예를 들어 엔진 내에서 작동하는 방식에 대한 많은 가정을 어 기고 있습니다. RigidBody
예를 들어 플레이어 이외의 다른 용도로는 동적을 사용할 수 없습니다 . RigidBody
키네마 틱으로 설정 되어 있지 않은 객체는 위치 / 회전 / 스케일 (플레이어를 제외한 씬의 모든 객체에 대해 모든 프레임을 수행 할 때)을 설정할 때 예기치 않게 동작합니다.
... 음 예 와 아니오 . Philipp의 답변에서 언급했듯이 무한 러너 유형의 게임 (또는 큰 매끄러운 탐색 가능 영역이있는 게임)에서 원점에서 너무 멀리 떨어지면 결국 눈에 띄는 FPPE ( 부동 소수점 정밀도 오류 )가 발생합니다. 숫자 유형을 오버플로하여 게임이 중단되거나 기본적으로 게임 세계의 연기 균열이 발생합니다 ... 스테로이드에서! 😵 (이 시점에서 FPPE는 게임을 이미 "정상"균열로 만들 것입니다)
둘 다하지 마십시오. 월드를 정적으로 유지하고 플레이어를 그 주위로 움직여야합니다. 그러나 플레이어가 장면 의 루트 (position ) 에서 너무 멀어지기 시작 하면 플레이어 와 세계 모두 "루트" 합니다 . [0, 0, 0]
사물의 상대 위치 (전 세계 플레이어)를 단일 프레임 업데이트로 유지하면 (실제) 플레이어는 눈치 채지 못할 것입니다!
이를 위해 두 가지 기본 옵션이 있습니다.
Unity의 소스 코드를 살펴보면 1e-5
( 0.00001
)를 내부 Vector2
와 내부 Vector3
(객체의 위치, [자유로운 회전 및 스케일을 담당하는 데이터 유형] 두 개의 부동 소수점 값을 고려하는 기준으로 사용합니다 . 부동 소수점 정밀도 손실은 두 가지 방법으로 0에서 멀어지기 때문에 장면 루트 / 원점에서 1e+5
( 100000
) 단위 아래의 모든 항목이 작업하기에 안전하다고 가정하는 것이 안전합니다.
그러나! 이후...
... 그러면 100000 단위보다 훨씬 더 빨리 / 더 자주 다시 뿌리는 것이 좋습니다. 예를 들어 내가 제공 한 예제 비디오는 1000 단위마다 그렇게하는 것 같습니다.
두 옵션 모두 작동합니다.
그러나 끝없는 주자가 진정한 끝이 아니길 원한다면, 플레이어를 움직이지 않고 세상을 움직여야합니다. 그렇지 않으면 결국 X 위치를 저장하는 데 사용하는 변수의 한계에 도달하게됩니다. 정수는 결국 오버플로되고 부동 소수점 변수는 점점 정확도가 떨어 지므로 잠시 후 게임 플레이가 고장납니다. 그러나 한 세션에서 재생할 수있는 시간 범위 내에 아무도 이러한 문제가 발생하지 않을 정도로 충분히 큰 유형을 사용하면이 문제를 피할 수 있습니다 (플레이어가 초당 1000 픽셀을 이동하면 49 일 후에 32 비트 정수가 오버플로 됨).
개념적으로 당신에게 더 직관적 인 느낌을 가지십시오.
XenoRo의 답변 을 바탕으로 설명하는 재 루트 방법 대신 다음을 수행 할 수 있습니다.
무한 맵 생성 부분의 원형 버퍼를 생성합니다.이 맵은 모듈러스 산술로 업데이트 된 위치로 캐릭터가 이동합니다 (따라서 원형 버퍼를 돌면됩니다). 캐릭터가 덩어리를 떠나 자마자 버퍼의 일부를 교체하십시오. 플레이어 업데이트 방정식은 다음과 같습니다.
player.position = (player.position + player.velocity) % worldBuffer.width;
여기 내가 말하는 것에 대한 그림의 예가 있습니다.
다음은 마지막에 줄 바꿈이 수행되는 예입니다.
이 방법을 사용하면 정밀한 오류가 발생하지는 않지만 3D에서 매우 멀리 떨어진 시야 거리 에서이 작업을 수행하려는 경우 매우 큰 버퍼를 만들어야 할 수도 있습니다 (여전히 자신을 미리 볼 수 있어야 함) ). 플래 피 버드의 경우 청크 크기는 단일 화면에서 단일 장면을 유지하는 데 필요한만큼만 크며 버퍼는 매우 작을 수 있습니다.
모든 prng 를 사용하여 반복 결과를 얻을 수 있으며 PRNG 생성의 최대 비 반복 시퀀스 수는 일반적으로 pow (2, 내부적으로 사용되는 비트 수)의 길이보다 짧 으며 메르겐 트위스터 는 그렇지 않습니다. 2.5k의 내부 상태를 사용하기 때문에 많은 문제가 발생하지만 작은 변형을 사용하는 경우 반복 (또는 악화) 전에 2 ^ 127-1 최대 반복이 있지만 천문학적으로 많은 수 입니다. PRNG가 시드에 대해 우수한 애벌랜치 믹싱 기능 을 통해 (암시 적으로 더 많은 상태를 추가 할 때) 반복적으로 주기가 짧아도 반복주기 문제를 해결할 수 있습니다 .
이미 요청하고 받아 들인 것처럼, 그것은 실제로 게임의 범위와 스타일에 달려 있지만 언급되지 않았으므로 FlappyBird는 전 세계의 플레이어가 아니라 화면을 가로 질러 장애물을 움직입니다.
스폰 너는 Vector2.left
방향 에서 고정 된 속도로 화면 밖으로 오브젝트를 인스턴스화합니다 .