private void Update()
{
normalizedPlayerPosition = NormalizeToLoopMap(playerTrans.position.x);
if (playerTrans.position.x < frontMapBlock.position.x)
{
backMapBlock.position = new Vector3(frontMapBlock.position.x - mapSize.x, mapOffsetY, 0);
}
else
{
backMapBlock.position = new Vector3(frontMapBlock.position.x + mapSize.x, mapOffsetY, 0);
}
DoMapLoop();
if (IsRepositionNeeded)
{
Reposition();
}
}
private void DoMapLoop()
{
if ((playerTrans.position.x > (frontMapBlock.position.x + mapSize.x)) || (playerTrans.position.x < (frontMapBlock.position.x - mapSize.x)))
{
SwapBlocks();
}
}
void SwapBlocks()
{
Transform _ = frontMapBlock;
frontMapBlock = backMapBlock;
backMapBlock = _;
}
private void Reposition()
{
Vector3 plResetPos = playerTrans.position;
plResetPos.x = 0;
Vector3 camResetPos = Camera.main.transform.position;
camResetPos.x -= playerTrans.position.x;
foreach (Transform repositionFollower in playerRepositionFollowers)
{
Vector3 destination = repositionFollower.position;
destination.x -= playerTrans.position.x;
repositionFollower.position = destination;
}
playerTrans.position = plResetPos;
Camera.main.transform.position = camResetPos;
}
실제 업데이트문과 메서드는 위와 같습니다
기본 컨셉트는 전체 맵을 절반으로 분리하여, 플레이어가 현재 올라와 있는 맵 블럭을 frontMapBlock
으로, 그렇지 않은 맵을 backMapBlock
으로 지정합니다
보스를 중앙에 두고 원형의 공간을 캐릭터가 질주하는 콘셉트이므로 실제 좌우로 배치된 맵의 양 끝을 이어야 합니다
그래서 위 코드에서 플레이어가 절반으로 자른 frontMapBlock
의 왼편에 있다면 backMapBlock
을 왼쪽에, 그 반대라면 오른편에 배치하여 플레이어가 어느 방향으로 이동하더라도 맵이 반복되는 것처럼 보이도록 처리하였습니다.
DoMapLoop()
에서 플레이어가 현재 올라와있는 맵 블럭인 frontMapBlock
에서 벗어난 좌표인지 검사하여 만약 그렇다면, SwapBlocks()
을 호출합니다.
SwapBlocks()
은 frontMapBlock
과 backMapBlock
을 바꾸어, 플레이어가 특정 방향으로 계속 이동하더라도 맵이 지속적으로 반복될 수 있도록 두 블럭을 서로 맞바꿉니다.