ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Unity 날씨 변화 구현하기
    Unity 2021. 1. 5. 02:37

    이번 포스팅에서는 간단하게 particle system을 이용해서 유니티 게임상의 날씨 구현 및 날씨를 변화시키는 방법을 작성하고자 합니다. 종종 unity로 게임을 만들며 배워가는 과정에서 날씨 변화를 구현하고 싶을 때가 있는데 그런 분들께 부족하지만 조금이라도 도움이 되었으면 좋겠습니다 :D

    Hierarchy 창에서 오른쪽 마우스 클릭 - Effects - Particle System선택

    처음에 particle system을 게임창에 생성하면 이런 모습일거에요! 

    기본 설정 상으로는 위로 향해 올라가지만 눈이나 비는 아래로 내리니까 축을 바꿔보도록 하겠습니다. 

    우측 inspector의 Trasnfrom칸의 Rotation값을 보면, x축 방향으로 -90도라고 설정이 되어있는것이 보입니다. 

    Rotation값을 90도로 변경해줍니다.  

    그럼 위 사진처럼 내리는 방향이 잘 바뀌어있는 것을 확인할 수 있습니다.

     


    시각적으로 잘 보이지 않을 것 같아서,  땅의 역할을 할 plane을 게임화면에 생성해 주었습니다.

    3D Object - Plane

    Plane의 위치는 0,0,0으로 맞춰주시고, particle system은 0,17.5,0으로 맞춰주었습니다. (임의로 적당히 띄워둠)

    아무래도 하늘에서 내리는 느낌을 주려면 particle system의 y축 위치를 어느정도 띄워두는 것이 좋습니다.

    particle system의 위치정보입니다 / plane은 y값에 0넣어주시면 됩니다

    plane 색깔도 갈색으로 변화시켰습니다. (material하나 생성해서 inspector - albedo에서 색을 바꿔주시고, plane에 드래그 & 드롭해서 적용시켜주시면 됩니다/ 별로 중요한 부분 X)

    plane 쪽에만 내리게 만들고 싶어서, 눈이 내리는 범위를 바꿔보겠습니다

    particle system의 inspector - shape에 가보시면 cone모양으로 설정이 되어있는것을 확인할 수 있습니다. 

    rectangle로 바꿔주겠습니다. 

     

    굉장히 좁은 범위로 내리는 눈...

    rectangle scale을 조정하여 내리는 범위를 늘려줍시다. (scale을 10*10*10로 키움)

     

    좀 더 넓은 범위로 만들었습니다. 

    이 다음으로, 땅에 닿으면 사라지게끔 만들어보겠습니다. 

    partcile system의 inspector의 collision으로 가서, Planes에다가 Plane을 드래그 앤 드롭해줍니다.

    그리고 Lifetime Loss값을 0.2정도로 설정해줍니다. 

    사진처럼 0.0005정도로 작은 값을 넣어주면 눈이 plane에 약간 쌓였다가 사라집니다. 

    반대로 최댓값인 1을 넣어주면

    거의 닿자마자 사라져서 쌓이지 않습니다. 저는 0.2정도로 했는데 자율적으로 취향껏 설정해주시면 될 것 같습니다. 

    마지막으로, 지금은 눈의 사이즈가 매우 일정하니까 좀 더 자연스러워 보일 수 있게끔 내리는 눈의 사이즈를 바꿔보도록 하겠습니다. 

    inspector창에서 이 사진처럼 선택해주세요

    start size에 저렇게 2가지 값을 입력하게끔 나옵니다. 저 2개의 상수 사이 랜덤값으로 입자의 사이즈를 지정해줍니다

    게임 맵 사이즈 따라 다르겠지만, 기본 1*1*1 스케일의 plane에서는 사진의 값 정도가 적당한 것 같습니다(개인취향)

     


    이제 이 particle system의 이름은 snow로 변경하고, 스크립트를 통해 날씨가 맑았다가(기본 상태) 흐려지는 걸 반복하는 것을 만들어보겠습니다. 

    create Emtpy를 통해 빈 오브젝트 만들고 이름을 WeatherManager로 설정, Snow를 이안에 넣어주었습니다. 

    빈 스크립트를 만들고 열고 다음과 같이 코딩해주세요

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class WeatherManager : MonoBehaviour {
        public enum Weather {SUNNY, SNOW };
        public Weather currentWeather;
        public ParticleSystem snow;
        public float weather_time = 10f; // 날씨 바뀌는 간격
        public int next_weather; //랜덤하게 다음 날씨 지정
    
        void Start()
        {
            currentWeather = Weather.SUNNY; //시작은 맑은 날씨
            next_weather = 1; // 다음 날씨는 무조건 눈
        }
    
        public void ChangeWeather(Weather weatherType)
        {
            if (weatherType != this.currentWeather) {
                switch (weatherType) {
                    case Weather.SUNNY: 
                        currentWeather = Weather.SUNNY;
                        this.snow.Stop();
                        break;
                    case Weather.SNOW:
                        currentWeather = Weather.SNOW;
                        this.snow.Play();
                        break;
                }
            }
            //매개변수로 받은 날씨가 현재 날씨와 같지 않다면 매개변수로 받은 날씨로 변경해준다. 
        }
    
        void Update()
        {
            this.weather_time -= Time.deltaTime; //10초동안은 그 날씨 유지
            if(next_weather == 1) //다음 날씨가 '눈'이고
            {
                if (this.weather_time <= 0) //현재 날씨의 제한시간이 끝나면
                {
                    next_weather = Random.Range(0, 2); //다음 날씨 계산(0 - 맑음, 1 - 눈)
                    ChangeWeather(Weather.SNOW); //눈으로 바꿔줌
                    weather_time = 10f; 
                }
            }
            if (next_weather == 0) //다음 날씨가 '맑음'이고
            {
                if (this.weather_time <= 0) //현재 날씨의 제한시간이 끝나면
                {
                    next_weather = Random.Range(0, 2); //다음 날씨 계산(0 - 맑음, 1 - 눈)
                    ChangeWeather(Weather.SUNNY); //맑음으로 바꿔줌
                    weather_time = 10f;
                }
            }
        }
    }
    

    save하고, 유니티로 돌아가셔서

    weather manager에 위 스크립트를 드래그앤 드롭 (혹은 add component)로 추가해주시고, Snow에다가 아까 만들어둔 particle system(snow)를 드래그앤 드롭 해주시면 됩니다.

    그리고 particle system설정중 play on awake라는 설정이 있습니다.

    밑에서 7번째, Play On Awake*

     

    이 부분을 해제해주셔야 제대로 작동합니다. 

    (play on awake를 설정하면 게임 시작과 동시에 눈이 내리게 됩니다)

     

    play 영상 캡처본입니다. current weather이 snow면 눈이 내리고, current weather이 sunny면 눈이 내리지 않는 것을 확인하실수 있습니다

    (+) 앞에 내린 눈이 땅에 닿아서 사라지는 시간이 있기에, sunny상태여도 화면상에 눈이 남아있을 수 있습니다. 

     

    도움이 되었으면 좋겠습니다 

    감사합니다 :D

    'Unity' 카테고리의 다른 글

    Unity 2D 애니메이션 공부  (0) 2021.03.20
    Unity2D Player 이동 구현  (0) 2021.03.15
Designed by Tistory.