내일배움캠프 Unity 72일차 TIL - 팀 9와 4분의 3 - 개발일지

Wooooo·2024년 2월 6일
0

내일배움캠프Unity

목록 보기
74/94

[오늘의 키워드]

  1. Update 호출 줄이기
  2. 자원 오브젝트 절차적 생성

[Update 호출 줄이기]

현재 씬에 오브젝트가 엄청 많다. 얼마나 많냐면 몬스터는 대략 150마리, 자원 오브젝트는 아직 중앙 섬만 배치했는데 800개다.

얘네들이 매 프레임 Update를 호출하면 그것만큼 낭비가 또 없을거라고 생각했다.

어제 부산물 생성기에서 생성 시도를 Update가 아니라 DayCycle 클래스의 OnTimeUpdated 이벤트에서 했던 것처럼 자원 오브젝트들과 밭의 리스폰/성장 시간 체크를 Update문에서 빼고, 이벤트로 옮겼다.

ResourceObjectParent

public class ResourceObjectParent : MonoBehaviour
{
	...
    
    private DayCycle _manager;

    private void Awake()
    {
        Initialize();        
    }

    private void OnDestroy()
    {
        if (_manager != null)
            _manager.OnTimeUpdated -= TimeLapse;
    }

    private void TimeLapse()
    {
        if (_debris.TryGetValue(CurrentState, out var debris))
        {
            RemainingTime--;
            if (RemainingTime <= 0)
                debris.Respawn();
        }
    }

    private void Initialize()
    {
        _manager = Managers.Game.DayCycle;
        _manager.OnTimeUpdated += TimeLapse;
        
        ...
    }
    
    ...

}

Farm

public class FarmGrowState : FarmBaseState
{
    protected DayCycle _manager;
    
    public FarmGrowState(FarmStateMachine stateMachine) : base(stateMachine)
    {
        _manager = Managers.Game.DayCycle;
    }

    public override void Enter()
    {
        _manager.OnTimeUpdated += TimeLapse;
        ...
    }

    public override void Exit()
    {
        if (_manager != null)
            _manager.OnTimeUpdated -= TimeLapse;
    }

    public override void TimeLapse()
    {
        _stateMachine.Farm.RemainingTime--;
        if (_stateMachine.Farm.RemainingTime <= 0)
        {
            _stateMachine.ChangeState(_stateMachine.HarvestState);
        }
    }
}

[자원 오브젝트 절차적 생성]

처음엔 자원 오브젝트의 절차적 생성 방식으로 ..
섬의 지형을 BFS와 같은 탐색 알고리즘으로 닫힌 언덕, 열려있는 넓은 광장 등을 판별해서 그 안에 의사난수를 통해 생성할까 싶었는데,

너무 머리가 아파서 그냥 이 녀석도 펄린노이즈를 이용해서 생성했다.

뭉쳐서 생성돼야하는 Fruit Tree와 같은 녀석은 persistence값을 줄여가며 중첩하니까 잘 뭉쳐서 생성된다.

섬의 생성에는 Animation Curve를 이용해서 섬의 모양을 잡아줬다면, 자원 오브젝트의 생성에는 Threshold값을 이용했다.
임계점을 낮게 잡아주면 많이 생성될 것이고, 높게 잡아주면 적게 생성될 것이다.

Material의 alpha cutout의 threshold 동작방식과 유사하게 작성해봤다.

생성 모습

profile
game developer

0개의 댓글