[Unity2D] 새콤달콤 딸기농장 메인 오브젝트 개발(6) - 소나기 구현

SHG·2022년 4월 30일
0

소나기 구현

딸기 성장에 방해되는 요소는 모두 구현했고, 이젠 딸기 성장을 돕는 요소인 소나기를 구현할 것이다!

소나기를 내리는 시각적 효과를 구현할 때 유니티에서 제공하는 파티클 시스템을 사용해볼 것이다.

Particle System

Rain

  • Duration: 파티클이 지속되는 시간을 나타낸다.
  • Looping: 파티클 애니메이션을 계속 반복할 것인지 정한다.
  • Start Delay: 파티클 애니메이션이 설정 시간 이후 실행된다.
  • Start Lifetime: 파티클이 존재하는 시간을 정한다.
  • Start Speed: 파티클의 초기 속도를 설정한다.
  • Start Size: 파티클의 크기를 min~max중 임의의 크기로 나타낸다.
  • Start Color: 파티클의 초기 색상을 정한다.
  • Gravity Modifier: 파티클이 중력에 영향을 받는 정도를 나타낸다.

Emission

  • Rate over Time: 단위 시간당 파티클이 생성되는 개수를 나타낸다.
  • Rate over Distance: 단위 거리당 파티클이 생성되는 개수를 나타낸다.

Shape

  • Shape: 파티클이 방출되는 모양을 정한다. 소나기를 시각적으로 표현하기 위해 Edge를 선택한다.
  • Radius: 파티클이 방출되는 반경을 정한다.

Velocity over LifeTime

Linear: 파티클의 기울여짐 정도를 나타낸다. X축으로 0.5만큼 기울여 비가 사선으로 내리는 효과를 줬다.

Rederer

  • Renderer Mode: 파티클의 모양을 길게 늘려 소나기처럼 표현하기 위해 Stertched Billboard를 선택했다.
  • Length Scale: 파티클의 길이를 조절하는 변수이다.

RainPanel

소나기가 올 때 화면을 어둡게 만들어 소나기가 자연스럽게 내리게 보여지도록 도와주는 패널이다. 다른 UI와 겹치지 않도록 Hierarchy 가장 상단에 두어 우선 순위를 낮추었다.

RainCtrl

마지막으로 Rain 파티클에 적용돼 있는 RainCtrl 스크립트이다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;

public class RainCtrl : MonoBehaviour
{
    public GameObject rainPanel;

    private ParticleSystem rainParticle;
   
    public float rainPeriod;
    public int mult; // 몇 배 가속되는지?
    public float rainTime;
    private bool isRaining;
    void Awake()
    {
        rainParticle = GetComponent<ParticleSystem>();       
    }
    void Update()
    {
        if (isRaining) return; // 비가 오고 있다면 리턴
        rainTime += Time.deltaTime; // 주기를 위한 타이머
        if(rainTime >= rainPeriod) // 타이머가 주기를 넘었다면
        {
            isRaining = true;
            Raining();
            StartCoroutine(RainingRoutine());
        }
    }
    void Raining()
    {
        rainPanel.gameObject.SetActive(true);
        rainPanel.GetComponent<Image>().DOFade(0.3f, 0.3f); // Dotween으로 rainPanel 명암 조절       
        mult = 3;
        rainTime = 0;
        rainParticle.Play(); // 파티클 실행
               
    }
    IEnumerator RainingRoutine()
    {        
        yield return new WaitForSeconds(rainParticle.main.duration);
        rainPanel.GetComponent<PanelAnimation>().FadeOut(); // Dotween으로 rainPanel 명암 조절
        mult = 1;
        isRaining = false;
    }
}

결과물 확인

profile
기록에 익숙해지자...!

0개의 댓글