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

  • 최근 글

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

티스토리툴바