w99hyun
프로필프로젝트포스트연락처
목록

ⓒ 2026. w99hyun(Woohyun Cho) All rights reserved.

본 사이트는 개인 포트폴리오 게시용으로 제작되었습니다.

프로젝트 D

Unity Engine

개발 기간
2026. 10. 02. ㅡ진행중
역할
1인 개발
사용 기술
Unity, C#
링크
GitHub

스크린샷

개요

프로젝트 D는 2D 도트 캐릭터와 3D 배경을 결합한 샌드박스 ARPG입니다.
채집 / 제작 / 건설 / 전투 / 퀘스트 등의 콘텐츠를 Steam을 통해 최대 4인이 협동하여 플레이할 수 있습니다.

오픈월드 스트리밍

월드를 한 번에 생성하지 않고 64유닛 청크로 나눕니다. OpenWorldStreamer는 플레이어 주변 viewRadius 범위의 청크만 유지하고, 프레임당 1개씩 생성합니다.
높이, 바이옴, 지면 색, 식생은 시드와 좌표를 통해 결정론적으로 만들어서 같은 위치면 다시 로드해도 같은 결과가 나옵니다. 멀티플레이에서는 호스트가 다른 플레이어 위치도 함께 포함해 청크를 유지합니다.

코드 보기코드 닫기C#
C#
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));
}

목차

개요오픈월드 스트리밍
다음 프로젝트

라스트 오브 펭귄

로그라이트 전략 게임