프로젝트 D
Unity Engine
Unity Engine
프로젝트 D는 2D 도트 캐릭터와 3D 배경을 결합한 샌드박스 ARPG입니다.
채집 / 제작 / 건설 / 전투 / 퀘스트 등의 콘텐츠를 Steam을 통해 최대 4인이 협동하여 플레이할 수 있습니다.
월드를 한 번에 생성하지 않고 64유닛 청크로 나눕니다. OpenWorldStreamer는 플레이어 주변 viewRadius 범위의 청크만 유지하고, 프레임당 1개씩 생성합니다.
높이, 바이옴, 지면 색, 식생은 시드와 좌표를 통해 결정론적으로 만들어서 같은 위치면 다시 로드해도 같은 결과가 나옵니다. 멀티플레이에서는 호스트가 다른 플레이어 위치도 함께 포함해 청크를 유지합니다.
private void Update()
{
if (Time.unscaledTime >= nextRefresh) { nextRefresh = Time.unscaledTime + .3f; RefreshWanted(); }
int budget = 1;
while (budget-- > 0 && pending.Count > 0)
{
var cell = pending[0];
pending.RemoveAt(0);
if (wanted.Contains(cell) && !chunks.ContainsKey(cell)) Build(cell);
}
}
private void RefreshWanted()
{
wanted.Clear();
void Include(Vector3 position)
{
var center = Cell(position);
for (int z = -definition.viewRadius; z <= definition.viewRadius; z++)
for (int x = -definition.viewRadius; x <= definition.viewRadius; x++)
{
var p = center + new Vector2Int(x, z);
if (definition.Biome((p.x + .5f) * definition.chunkSize, (p.y + .5f) * definition.chunkSize, activeSeed) == regionIndex)
wanted.Add(p);
}
}
if (world.LocalPlayer.mapScene != "Moonshadow") Include(hero.transform.position);
if (world.IsAuthority)
foreach (var player in world.State.players)
if (world.ActivePlayers.Contains(player.id) && player.mapScene != "Moonshadow")
Include(player.position);
var remove = new List<Vector2Int>();
foreach (var pair in chunks)
if (!wanted.Contains(pair.Key)) remove.Add(pair.Key);
foreach (var cell in remove) Unload(cell);
pending.Clear();
foreach (var cell in wanted)
if (!chunks.ContainsKey(cell)) pending.Add(cell);
var focus = Cell(hero.transform.position);
pending.Sort((a, b) => (a - focus).sqrMagnitude.CompareTo((b - focus).sqrMagnitude));
}