자세히보기

내가 만든 게임 (Portfolio)/머리를 지켜라 (모바일)

[2018] [머리를 지켜라] 주요 기능(코드) 설명

윤스톤 2020. 3. 11. 19:21

0. 전체 스크립트 구성

1 UIManager    화면 해상도 고정, 플레이어의 HP에 따라 UI 변경
2 GameManager    누적시간에 따라 난이도/배경화면 변경, 일시정지, 엔딩화면 문구 변경, 버튼관리
3 Level 1~4    비 내리는 속도와 빈도, 비/아이템 비율 관리하여 난이도 조절
4 Main    메인 화면의 버튼 관리
5 Help    게임 설명 화면의 버튼 관리
6 TimeLimit    아이템 사용 시 사용 가능 시간 UI로 표시
7 Part_Rotate    파티클 생성 시 각도 랜덤 설정
8 PlayerCollider    캐릭터 충돌 체크, 충돌한 오브젝트의 정보를 Player 스크립트로 전달
9 Player    캐릭터 이동 (이미지 변경), 충돌한 오브젝트에 대한 반응
10 Down    비 내리는 방향 설정, 땅에 닿으면 사라지는 기능

 

1. 비(아이템) 랜덤 스폰

비 & 아이템 랜덤 스폰

    //비 생성
    void MakeRain()
    {
        int rand = Random.Range(0, 15); //일반비:산성비:황사비 = 12:2:1

        if (rand == 1)
            Instantiate(Resources.Load("Prefabs/2D/YellowRain"), rainSpawns[Random.Range(0, 6)]);
        else if (rand == 2 || rand == 3)
            Instantiate(Resources.Load("Prefabs/2D/BlackRain"), rainSpawns[Random.Range(0, 6)]);
        else
            Instantiate(Resources.Load("Prefabs/2D/BlueRain"), rainSpawns[Random.Range(0, 6)]);

        StartCoroutine("DelayRain");
    }
    
   //비 딜레이시간
    IEnumerator DelayRain()
    {
    // 딜레이 시간 랜덤화
        float delay = Random.Range(minDelay_R, maxDelay_R);
        
        yield return new WaitForSeconds(delay);
        MakeRain();
    }

 

 Random.Range(float min, float max);

  • 일반비 : 산성비 : 황사비의 비율을 미리 정해두고, 랜덤으로 생기도록 하였다.
  • 비가 생길 위치를 랜덤으로 지정하였다.
  • 다음 비가 내리기 전까지 랜덤한 딜레이 시간을 두었다

② Instantiate(Resources.Load("폴더명/오브젝트명"), Transform);

  • Resources 폴더에 있는 비 오브젝트를 복제하여 원하는 위치에 생성하였다.

③ StartCorutine("함수명"); / IEnumerator() / yield return new WaitForSeconds(float);

  • 비가 내린 후, 다음 비가 내리기 전까지의 딜레이를 두었다.

2. 플레이 시간

	
    public Text count;
    private float second, curTime, minute;
    
    void Start()
    {
       // 처음 시간 저장
        curTime = Time.time;
    }
    
    void Update()
    {
       // 초 저장
        second = (int)(Time.time - curTime);

	   // 만약 초가 59보다 크다면 
        if (second > 59)
        {
           // 처음 시간에 지금 시간을 저장해서 second가 0이 되도록
            curTime = Time.time;
            second = 0;
           
           // 분 증가시키기
            minute++;
            
		  // 만약 분이 59보다 크다면 
            if (minute > 59)
            {
               // 다시 0으로 
                minute = 0;
            }
        }
        
	   // 초, 분 00 : 00 형태로 출력
        count.text = string.Format(minute.ToString("00") + ":" + second.ToString("00"));
     }

Time.time;

  • Time.deletaTime과 다르게 선언된 시점부터 시작되기 때문에 자유롭게 플레이 시간을 나타냈다.
  • 초가 59초가 넘으면 1분으로 바꾸고 초는 다시 0부터 시작되도록 했다 (분도 동일)

string.Format(float.ToString("00"));

  • 초와 분이 출력 될 때, 가독성을 위해 '1:5'형식이 아닌 '01:05'형식으로 출력하였다.

3. 일시정지 + 카운트 후 게임 재개

 //일시정지
    public void OnClickPasue()
    {
        isPause = true;
        
       // 일시정지 화면
        pauseCanvas.SetActive(true);
    }
    
    public void Update()
    {
    	if (isPause){
        	Time.timeScale = 0;
        } else
        	Tiime. timeScale = 1;
        }
    }

Time.timeScale;

  • 시간이 흘러가는 속도를 나타내는 Time.timeScale 값을 0으로 바꿔 일시정지를 했다
//이어 하기
    public void OnClickCountinue()
    {
       // 일시정지 화면 끄기
        pause.SetActive(false);
        
       // 카운트 다운
        StartCoroutine(Countdown(1, 1, 1));
        
       // 숫자 3
        Instantiate(Resources.Load("Prefabs/2D/3"));
    }
    
//3초 카운트
    IEnumerator Countdown(int dur1, int dur2, int dur3)
    {
        while (dur1 > 0)
        {
            dur1--;
            yield return WaitForUnscaledSeconds(1f);
        }
       // 숫자 2
        Instantiate(Resources.Load("Prefabs/2D/2"));

        while (dur2 > 0)
        {
            dur2--;
            yield return WaitForUnscaledSeconds(1f);
        }
       // 숫자 1
        Instantiate(Resources.Load("Prefabs/2D/1"));

        while (dur3 > 0)
        {
            dur3--;
            yield return WaitForUnscaledSeconds(1f);
            
           // 시간 흐르도록
            isPause = false;
        }
    }

    IEnumerator WaitForUnscaledSeconds(float dur)
    {
        var cur = 0f;
        while (cur < dur)
        {
            yield return null;
            cur += Time.unscaledDeltaTime;
        }
    }

Time.unscaledDeltaTime;

  • 일시정지 상태이므로 일반적인 deltaTime 대신 영향을 받지 않는 unscaledDeltaTime을 사용하였다.
  • 1초씩 지날 때마다 숫자 이미지를 띄워 게임 재개까지 몇 초 남았는지 알려주었다.

 

➕ 출시에 관한 내용은 다음 게시물로 이어집니다 :)

반응형