UniRx 실습 - 간단한 식물 재배 로직 만들어보기

2024. 8. 16. 00:12·개발툴/Unity


작물 성장

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);
    }

 

 

  • 매 프레임마다 마우스 우클릭을 감지합니다.
  • 마우스 우클릭 시 클릭 위치를 화면 좌표에서 월드 좌표로 변환합니다.
  • 해당 위치에 작물 수확을 시도합니다.

 

 

 

 

 

 

 

 

'개발툴 > Unity' 카테고리의 다른 글

Unity 투명 윈도우 구현하기 (UniWindowController)  (0) 2026.01.25
UniRX 실습 - 간단한 MessageBox 만들기  (0) 2023.12.25
UniRxWorkBook - Operator  (1) 2023.12.24
의존성 주입(Dependency Injection)  (1) 2023.12.18
Reflex 실습 - UniRx와 Reflex를 활용한 간단한 카운터 만들기  (0) 2023.12.18
'개발툴/Unity' 카테고리의 다른 글
  • Unity 투명 윈도우 구현하기 (UniWindowController)
  • UniRX 실습 - 간단한 MessageBox 만들기
  • UniRxWorkBook - Operator
  • 의존성 주입(Dependency Injection)
가든_
가든_
  • 가든_
    Code Garden
    가든_
  • 전체
    오늘
    어제
    • 글 목록 (60)
      • 프로그래밍 언어 (11)
        • JAVA (0)
        • C++ (2)
        • C# (9)
      • 개발툴 (24)
        • Visual Studio (0)
        • Visual Studio Code (1)
        • Eclipse (1)
        • Unity (19)
        • Unreal (0)
        • Spring (1)
        • SpringBoot (0)
        • Vue (2)
      • 디자인 패턴 (6)
      • 백엔드 (4)
        • MySQL (1)
        • Servlet (3)
      • 프론트엔드 (4)
        • HTML (3)
        • CSS (0)
        • Javascript (1)
      • 알고리즘 (10)
        • 공식 (3)
        • 백준 (6)
        • SW Expert Academy (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    구조패턴
    런타임 상수
    행동 UML 다이어그램
    Factory 패턴
    Reflex
    스택
    Proxy 패턴
    다이어그램 그리기
    상태공간트리
    RDBM
    FixedUpdate
    Unity
    HTML
    12738
    오브젝터 어댑터
    Java
    Abstract Factory 패턴
    DI
    구조적 UML 다이어그램
    SetTile
    Adapter 패턴
    Adaptee
    ()=>
    chatGPT
    MVC
    UniRX
    컴파일 상수
    c#
    클래스 어댑터
    swea2112
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
가든_
UniRx 실습 - 간단한 식물 재배 로직 만들어보기
상단으로

티스토리툴바