학습 매체 : 책
책이름 : 레트로의 유니티 게임 프로그래밍 에센스
저자 : 이제민
본 내용은 해당 강의 내용을 공부하면서 정리한 글입니다.
연애 게임에 호감도 시스템이 있다. 호감도가 높고 특정 조건을 만족하면 굿 엔딩이나 숨겨진 엔딩을 보게 된다. 그렇지 않으면 배드 엔딩을 보게 된다.
많은 게임이 이런 식으로 특정 조건과 선택에 따라 게임의 분기가 나누어진다.
이때 if 문을 사용한다. if 문은 주어진 조건을 평가한다. 조건(조건식)은 결과가 true나 false 중 하나가 되는 변수나 표현식이다.
평가한 조건이 참(true)이면 if 문 아래에 중괄호로 묶인 영역(if 문 블록)을 실행한다. 반대로 조건이 거짓(false)이면 if 문 블록을 무시하고 넘어간다.
if (조건)
{
// if 문 블록
// 조건이 참이면 이곳에 있는 코드를 실행
}
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("배드엔딩 : 히로인에게 차였다.");
}
}
}
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("배드엔딩 : 히로인에게 차였다.");
}
}
}
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("배드엔딩 : 히로인에게 차였다.");
}
}
}
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("일을 할 수 없는 나이입니다.");
}
}
첫 번째 if 문의 조건문 (age > 7 && age < 18)은 'age > 7' 조건과 'age < 18' 조건을 모두 만족해야 결과가 참이다.
두 번째 if 문의 조건문 (age < 13 || age > 70)은 'age < 13' 조건과 'age > 70' 조건 중 하나만 만족해도 동작한다.
이외에 !(NOT) 연산자에 대해서는 게임 제작 실습을 하면서 알아보겠다.
for (초기화; 조건; 갱신)
{
// for 문 블록
// 조건이 참인 동안 이곳에 있는 코드를 반복 실행
}
초기화 : 주로 순번(Index)이 될 변수를 선언하고 초깃값을 정한다.
조건 : 어떤 조건에서 처리를 계속 반복할지 정한다.
갱신 : 한 회의 처리가 끝나면 순번을 어떻게 갱신할지 정한다.
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 ' 처럼 꼭 뒤가 아닌 해당하는 위치에 변수를 쓰고 앞 또는 뒤에 + 연산자를 사용할 수 있다.
i++
i++;는 i = i + 1;과 같다. i++는 변숫값을 1 증가시키는 단축 표현(shorthand)이다.
while (조건)
{
// while 문 블록
// 조건이 참인 동안 이곳에 있는 코드를 반복 실행
}
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++;
}
}
}
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 문이 더 적합하다.
다음 강의에서 계속~