작물 성장
Observable.Interval(TimeSpan.FromSeconds(timeBetweenStages))
.Take(growthStages.Length - 1)
.Subscribe(_ =>
{
Debug.Log("농작물이 성장 함");
currentStage++;
spriteRenderer.sprite = growthStages[currentStage];
if (currentStage == growthStages.Length - 1)
{
isHarvestable = true;
}
})
.AddTo(this);
지정된 시간 간격(timeBetweenStages )마다 농작물이 성장합니다
성장 단계(growthStages.Length - 1 )에 도달하면, 농작물의 외형이 변화합니다
농작물이 마지막 성장 단계에 도달하면 수확 가능 상태(isHarvestable )가 됩니다
게임 오브젝트가 파괴될 경우 자동으로 해제
Observable.Interval(TimeSpan.FromSeconds(timeBetweenStages))
일정한 시간 간격마다 이벤트를 발생시키는 Observable 을 생성합니다
TimeSpan.FromSeconds(timeBetweenStages) : timeBetweenStages 초마다 이벤트를 발생시키도록 설정합니다
ex) timeBetweenStages가 2초라면, 이 Observable은 2초마다 숫자를 증가시키며 이벤트를 발생시킵니다
.Take(growthStages.Length - 1)
Observable 이 리턴하는 이벤트의 횟수를 제한합니다
growthStages.Length - 1 이벤트가 리턴되는 횟수를 농작물의 성장 단계 수 (growthStages.Length)로 제한합니다. 이는 최종 단계에 도달했을때까지만 성장 로직을 실행하도록 하는 역할을 합니다
.Subscribe(_ => { ... })
Observable 이 이벤트를 리턴할 때마다 지정된 동작을 수행합니다.
Subscribe 블록 내부 동작: currentStage++; : 현재 농작물의 성장 단계를 증가시킵니다.spriteRenderer.sprite = growthStages[currentStage]; : currentStage에 해당하는 스프라이트로 농작물의 외형을 변경합니다.if (currentStage == growthStages.Length - 1) { isHarvestable = true; } : 농작물이 마지막 성장 단계에 도달했을 때, isHarvestable을 true로 설정하여 수확할 수 있음을 표시합니다.
작물 심기
void Start()
{
this.UpdateAsObservable()
.Where(_ => Input.GetMouseButtonDown(0))
.Select(_ => Camera.main.ScreenToWorldPoint(Input.mousePosition))
.Subscribe(position =>
{
PlantCrop(position);
})
.AddTo(this);
}
매 프레임마다 마우스 클릭을 감지합니다
마우스 왼쪽 버튼이 눌리면 클릭한 화면 좌표를 월드 좌표로 변환합니다
변환된 좌표를 이용해 PlantCrop 메서드를 호출하여 그 위치에 작물을 심습니다
PlantCrop 메서드 : Crop 프리팹을 넘겨받은 위치에 생성합니다
this.UpdateAsObservable()
Update 메서드처럼 매 프레임마다 실행되는 Observable을 생성합니다
.Where(_ => Input.GetMouseButtonDown(0))
특정 조건이 충족될 때만 이벤트를 처리하도록 필터링합니다
Input.GetMouseButtonDown(0) 마우스 왼쪽 버튼이 눌렸을 때만 이벤트를 처리합니다. 이 조건이 true일 때만 다음 단계로 진행합니다
.Select(_ => Camera.main.ScreenToWorldPoint(Input.mousePosition))
이벤트가 발생할 때마다 데이터를 변환합니다
Camera.main.ScreenToWorldPoint(Input.mousePosition) : 마우스 클릭 위치를 화면 좌표에서 월드 좌표로 변환합니다
화면 좌표 : 유니티 화면 상의 2D 좌표월드 좌표 : 3D 공간에서의 좌표, 게임 오브젝트가 존재하는 실제 공간상의 위치
.Subscribe(position => { PlantCrop(position); })
Observable에서 리턴된 데이터를 구독하여 특정 동작을 수행합니다
position : 변환된 월드 좌표를 Subscribe의 파라미터로 전달
PlantCrop(position) : 전달된 위치(position)에 작물을 심는 메서드 호출
작물 수확하기
void Start()
{
this.UpdateAsObservable()
.Where(_ => Input.GetMouseButtonDown(1))
.Select(_ => GetMouseWorldPosition())
.Subscribe(TryHarvestCrop)
.AddTo(this);
}
매 프레임마다 마우스 우클릭을 감지합니다.
마우스 우클릭 시 클릭 위치를 화면 좌표에서 월드 좌표로 변환합니다.
해당 위치에 작물 수확을 시도합니다.