레트로의 유니티 게임 프로그래밍 에센스 - 4.7

Cosmos·2023년 3월 30일
0

학습 매체 : 책

책이름 : 레트로의 유니티 게임 프로그래밍 에센스

저자 : 이제민


본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.


4.7 제어문


  • 제어문에는 분기를 결정하는 조건문( if 문 )과 수행을 여러 번 반복하는 반복문( for 문, while 문 )이 있다.

4.7.1 if 문

  • 연애 게임에 호감도 시스템이 있다. 호감도가 높고 특정 조건을 만족하면 굿 엔딩이나 숨겨진 엔딩을 보게 된다. 그렇지 않으면 배드 엔딩을 보게 된다.

  • 많은 게임이 이런 식으로 특정 조건과 선택에 따라 게임의 분기가 나누어진다.

  • 이때 if 문을 사용한다. if 문은 주어진 조건을 평가한다. 조건(조건식)은 결과가 true나 false 중 하나가 되는 변수나 표현식이다.

  • 평가한 조건이 참(true)이면 if 문 아래에 중괄호로 묶인 영역(if 문 블록)을 실행한다. 반대로 조건이 거짓(false)이면 if 문 블록을 무시하고 넘어간다.

if (조건) 
{
	// if 문 블록
    // 조건이 참이면 이곳에 있는 코드를 실행
}
  • if 문을 사용하여 호감도에 따라 서로 다른 엔딩에 도달하는 예제를 만들어보자.

HelloCode 스크립트를 열고 다음과 같이 수정

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int love = 100;

        if (love > 70)
        {
            Debug.Log("굿엔딩 : 히로인과 사귀게 되었다!");
        }

        if (love <= 70)
        {
            Debug.Log("배드엔딩 : 히로인에게 차였다.");
        }
    }
}
  • HelloCode 스크립트를 실행하여 결과를 확인해보자


4.7.2 비교 연산자

  • 예제의 > 와 <= 는 조건식에서 사용하는 비교 연산자이다. 비교 연산자는 두 값을 비교하여 참과 거짓을 결정한다.


4.7.3 if .. else 문

  • if 문 블록 끝에 else 문을 덧붙여 조건이 거짓일 때 실행할 처리를 구성할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int love = 100;

        if (love > 70)
        {
            Debug.Log("굿엔딩 : 히로인과 사귀게 되었다!");
        }
        else
        {
            Debug.Log("배드엔딩 : 히로인에게 차였다.");
        }
    }
}

4.7.4 else if 문

  • else if 문을 사용하면 else 문에 조건을 덧붙일 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int love = 80;

        if (love > 90)
        {
            Debug.Log("트루엔딩 : 히로인과 결혼했다!");
        }
        else if(love > 70)
        {
            Debug.Log("굿엔딩 : 히로인과 사귀게 되었다!");
        }
        else
        {
            Debug.Log("배드엔딩 : 히로인에게 차였다.");
        }
    }
}
  • love가 80으로 변경되었기 때문에 다음과 같은 결과가 뜬다.

  • 100으로 love를 재설정하면 다음과 같은 결과가 뜬다.


4.7.5 논리 연산자

  • if 문에서 조건을 비교할 때 둘 이상의 조건을 함께 사용할 수 있었다. 예를 들어, 'a는 30보다 크면서 동시에 b는 50보다 커야 한다'는 조건이 필요할 수 있다.

  • 이외에도 'a가 30보다 크지 않을 때'처럼 어떤 조건을 만족하지 못하는 상태를 표현하는 조건이 필요할 수 있다.

  • 이때 사용하는 것이 논리 연산자이다.

    void Start()
    {
        int age = 11;

        if (age > 7 && age < 18)
        {
            Debug.Log("의무 교육을 받고 있습니다.");
        }

        if (age < 13 || age > 70)
        {
            Debug.Log("일을 할 수 없는 나이입니다.");
        }
    }
  • HelloCode 스크립트의 Start( ) 메서드를 위와 같이 수정하고 실행하면 두 메시지 모두 콘솔에 출력된다.

  • 첫 번째 if 문의 조건문 (age > 7 && age < 18)은 'age > 7' 조건과 'age < 18' 조건을 모두 만족해야 결과가 참이다.

  • 두 번째 if 문의 조건문 (age < 13 || age > 70)은 'age < 13' 조건과 'age > 70' 조건 중 하나만 만족해도 동작한다.

  • 이외에 !(NOT) 연산자에 대해서는 게임 제작 실습을 하면서 알아보겠다.


4.7.6 for 문

  • for 문은 조건이 참인 동안 처리를 반복한다.
for (초기화; 조건; 갱신)
{
	// for 문 블록
    // 조건이 참인 동안 이곳에 있는 코드를 반복 실행
}
  • for 문을 사용하려면 다음 세 가지 요소가 필요하다.
  1. 초기화 : 주로 순번(Index)이 될 변수를 선언하고 초깃값을 정한다.

  2. 조건 : 어떤 조건에서 처리를 계속 반복할지 정한다.

  3. 갱신 : 한 회의 처리가 끝나면 순번을 어떻게 갱신할지 정한다.

  • for문 사용하기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        for (int i = 0; i < 10; i++) 
        {
            Debug.Log(i + " 번째 순번입니다.");
        }
    }
}
  • + 연산자는 '+ i ' 처럼 꼭 뒤가 아닌 해당하는 위치에 변수를 쓰고 앞 또는 뒤에 + 연산자를 사용할 수 있다.
  • HelloCode 스크립트를 실행하고 플레이 모드 해제

i++

i++;는 i = i + 1;과 같다. i++는 변숫값을 1 증가시키는 단축 표현(shorthand)이다.


4.7.7 for 문 실행 과정

  • 최초 실행

1. 순번으로 사용할 변수 i를 선언하고 시작값을 0으로 만든다.

2. i가 조건 i < 10을 만족하는지 체크한다.

3. i = 0이므로 조건을 만족한다. 그러므로 for 문 블록을 1회 실행한다.

4. for 문 블록의 실행이 끝나면 갱신( i++ ) 부분으로 처리가 이동하여 i 값이 0에서 1로 증가한다.


  • 반복실행

1. i 가 조건을 만족하는지 체크한다.

2. i 가 조건을 만족하므로 for 문 블록을 1회 실행한다.

3. 갱신( i++ ) 부분으로 처리가 이동하여 i 값이 1 증가한다.

  • i 값이 10보다 작은 동안 1 ~ 3 과정을 계속 반복한다.

  • 마지막 순번( i = 9 ) 이후

1. i = 9 처리가 끝나고 i 가 9에서 10으로 증가한다.

2. i = 10일 때는 조건을 만족하지 않는다. 그러므로 for 문이 종료된다.

  • 이런식으로 for 문 블록을 i = 0에서 i = 9까지 총 10회 반복 실행한다.

4.7.8 while 문

  • while 문은 어떤 조건을 만족하는 동안 while 문 블록을 반복 실행한다.
while (조건) 
{
	// while 문 블록
    // 조건이 참인 동안 이곳에 있는 코드를 반복 실행
}
  • HelloCode 스크립트를 다음과 같이 수정

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HelloCode : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int i = 0;

        while (i < 10)
        {
            Debug.Log(i + " 번째 루프입니다.");
            i++;
        }
    }
}
  • HelloCode 스크립트 실행하고 플레이 모드 해제하기

while 문을 사용해야 하는 경우

  • while 문은 for 문과 비슷하며, for 문으로 만든 처리는 while 문으로 똑같이 재현할 수 있다. 물론, 그 반대도 가능하다. 하지만 for 문이 적절한 상황과 while 문이 적절한 상황은 다르다.
  • for : 순번을 넘겨가며 반복할 때
  • while : 어떤 조건을 만족하는 동안 반복할 때
  • 플레이어가 살아 있는 동안 계속해서 체력을 깎는 예제를 while 문으로 작성해보자.
 void Start()
    {
        bool isDead = false;
        int hp = 100;

        while (!isDead) 
        {
            Debug.Log("현재 체력 : " + hp);

            hp = hp - 33;

            if (hp <= 0)
            {
                isDead = true;
                Debug.Log("플레이어는 죽었습니다.");
            }
        }
    }

  • 여기서 while(!isDead)는 !isDead가 true인 동안 처리를 반복한다. 즉, isDead가 false인 경우 !isDead가 true가 되어 처리를 반복한다.
  • isDead가 false인 동안 계속해서 hp를 감소하는 처리가 실행되어 hp가 감소한다. 마지막에는 hp가 -32가 되어 0보다 작아지면 if 문에 의해 isDead가 true가 된다.
  • isDead가 true면 !isDead는 false가 되어 while 문이 종료된다. 위 while 문 예제 코드를 for 문으로도 작성 가능하다. 하지만 코드가 쓸데없이 복잡해진다. 따라서 '~하는 동안'의 처리를 반복하는 경우에는 for 문보다는 while 문이 더 적합하다.

다음 강의에서 계속~

profile
게임 개발을 목적으로 공부하고 있는 대학생입니다.

0개의 댓글