현재 씬에 오브젝트가 엄청 많다. 얼마나 많냐면 몬스터는 대략 150마리, 자원 오브젝트는 아직 중앙 섬만 배치했는데 800개다.
얘네들이 매 프레임 Update를 호출하면 그것만큼 낭비가 또 없을거라고 생각했다.
어제 부산물 생성기에서 생성 시도를 Update가 아니라 DayCycle
클래스의 OnTimeUpdated
이벤트에서 했던 것처럼 자원 오브젝트들과 밭의 리스폰/성장 시간 체크를 Update문에서 빼고, 이벤트로 옮겼다.
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;
...
}
...
}
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 동작방식과 유사하게 작성해봤다.