Notice
Recent Posts
Recent Comments
Link
great minds think alike
[3] C# 스크립트 (2) 본문
[3].1 제어문 사용하기 [3].2 배열 사용하기 |
[3].1 제어문 사용하기
>> if 문으로 조건 분기하기
- 특정한 조건을 충족할 때만 스크립트를 실행하고 싶다면 if 문을 사용함
- if 문을 사용하는 방법에는 몇 가지 형식이 있는데, 이 중 가장 간단한 조건식은 다음과 같음
- 조건식에 표시한 조건을 만족하면(조건이 '참' 이면) 중괄호 ({}) 블록에 담긴 처리를 실행함
- 조건을 만족시키지 못하면(조건식이 '거짓'이면) 중괄호 블록 안에 담긴 처리를 실행하지 않고 다음 스크립트로 넘어감
- if 문의 조건식에는 관계 연산자를 사용할 수 있음
- == 연산자는 왼쪽과 오른쪽 값이 같으면 '참', 같지 않으면 '거짓'이 됨
- 대입할 때 쓰는 = 연산자와 헷갈리지 않도록 주의함
- !=은 ==과 반대로 왼쪽과 오른쪽 값이 같으면 '거짓'이 됨
- 이외에는 수학에서 자주 사용하는 부등호와 같은 개념으로 쓰임
✏️ 대입 연산자와 관계 연산자를 헷갈리지 않도록 주의해야 함!
- 코드: if 문 사용하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int herNum = 1;
if(herbNum == 1)
{
Debug.Log("체력을 50 회복");
}
}
}
\ 출력 결과 /
체력을 50 회복
✏️ 이 코드에서 만약 herbNum == 1 조건을 만족시키지 않으면, 스크립트를 실행하지 않고 빠져나옴
- 약초 수(herbNum)가 1일 때 체력을 50 회복하는 스크립트임
- 10번 줄의 조건식에서 herbNum의 변수 값이 1인지 확인함
- 9번 줄에서 herbNum에 1을 대입하므로 10번 줄의 조건식은 '참'임
- 참일 때는 중괄호 블록 안에 담긴 처리가 실행되므로 Console 창에 [체력을 50 회복]이 출력됨
- 이 스크립트는 조건식이 '거짓'이면 Console 창에 메시지를 출력하지 않고 종료함
✏️ 만약 int herbNum == 0; 으로 초기화했다면 if 조건문이 거짓이 되어 스크립트를 실행하지 않고 빠져나옴 (실제로 int herbNum == 0; 으로 초기화한 뒤 실행해보면 콘솔창에 아무것도 뜨지 않는다)
>> if~else 문으로 조건 분기하기
- if 문을 응용한 if~else문이 있음
- 이것은 '체력이 100이상이면 공격하고 아니면 방어한다'처럼 조건식을 만족할 때와 만족하지 않을 때를 각각 다르게 처리할 때 씀
- 코드: if~else 문 사용하기 ①
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int hp = 200;
if(hp >= 100)
{
Debug.Log("공격!");
}
else
{
Debug.Log("방어!");
}
}
}
\ 출력 결과 /
공격!
>> if 추가하기
- 조건이 두 개라고 해서 추가되는 요소는 없음
- if 문 뒤에 else if 문을 연결시키기만 하면 됨
- 조건문의 흐름은 위에서 아래로 차례대로 검사해 조건을 만족하면 중괄호 블록 안에 든 처리를 실행함
- else if 문이나 else 문은 실행하지 않고 조건 분기를 종료한 후 그다음 스크립트를 처리함
- 모든 조건식을 만족하지 않으면 마지막에 있는 else에 해당하는 중괄호 블록 안의 처리를 실행함
- 앞의 if 문과 마지막 else 문 사이에 있는 else if 문은 몇 개라도 상관없고 마지막 else 문은 생략할 수 있음
- if~else 문 사용하기 ②
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int hp = 180;
if(hp >= 50)
{
Debug.Log("도망");
}
else if(hp >= 2000
{
Debug.Log("공격!");
}
else
{
Debug.Log("방어!");
}
}
}
\ 출력 결과 /
방어!
✏️int hp = 180; 에서 hp가 180으로 초기화되었기 때문에 else에 해당하여 [방어!]가 출력됨
>> 변수 범위
- if 문의 블록에서 정의한 변수는 사용할 수 있는 범위가 정해져 있음
- 코드: 변수 범위의 예
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int x = 1;
if(x == 1)
{
int y = 2;
Debug.Log(x);
Debug.Log(y);
}
Debug.Log(y);
}
}
오류 발생!
✏️ if 문에서 x에 1을 대입하는 것이 아니라, x가 1과 같은지를 물어보는 것이므로 비교 연산자 =를 사용해야 함
✏️ y는 지역 변수로 선언이 된 상태
- 실행 도구를 클릭해 스크립트를 실행하려고 하면 유니티 에디터의 왼쪽 아래에 The name 'y' does not exist in thr current context 오류가 발생함
- 16번 줄에서 사용하는 y 변수가 선언되지 않아 위험하다는 오류임
- 분명 12번 줄에서 y 변수를 제대로 선언하고 초기화까지 했는데 오류가 뜨는 건 변수는 선언한 줄을 포함하는 중괄호 안에서만 사용할 수 있기 때문임
- 이것을 변수 범위(사용할 수 있는 범위)라고 함
- x 변수는 9번 줄에서 정의한 이후부터 17번 줄의 } 사이에서 사용할 수 있음
- y 변수는 12번 줄에서 정의한 이후부터 15번 줄의 } 사이에서만 사용할 수 있음
- 오류가 발생한 원인은 y변수의 범위는 if 문 블록 안이므로 16번 줄에서 'y변수가 선언되어 있지 않다'는 오류가 발생한 것임
- 16번 줄을 주석으로 처리하면 오류가 사라지면서 실행할 수 있음
- 예제처럼 if 문 안에서 선언한 변수는 if 문 바깥에서는 사용할 수 없으므로 주의함
>> for 문으로 반복하기
- 스크립트를 작성하다 보면 같은 처리를 여러 번 반복해야 할 때가 있는데 이때는 반복 횟수를 지정하면 자동으로 반복 횟수만큼 처리를 반복하는 for 문을 사용함
- 반복 횟수는 for(3)처럼 단순히 쓸 수는 없음
- 실제 스크립트에서는 다음과 같이 사용함

- for 문의 괄호 안에는 반복 조건을 작성함
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
for(int i = 0; i <5; i++)
{
Debug.Log(i);
}
}
}
\ 출력 결과 /
0
1
2
3
4
- for 문을 써서 처리를 다섯 번 반복하는 예제임
- 1이 한 번 2는 여섯 번, 3~5는 다섯 번 반복해서 실행됨
- i 변수를 0으로 초기화함
- 반복조건 (i<5)을 만족하면 3, 만족하지 않으면 반복문을 종료함
- Console창에 i 값을 출력함
- i를 증가시킴(i 값을 1 증가)
- 2로 돌아감
- 코드: 짝수만 출력하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
for(int i = 0; i <10; i += 2)
{
Debug.Log(i);
}
}
}
\ 출력 결과 /
0
2
4
6
8
- 다음은 3부터 5까지 출력하는 스크립트임
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
for(int i = 3; i <= 5; i++)
{
Debug.Log(i);
}
}
}
\ 출력 결과 /
3
4
5
- 다음은 3부터 0까지 카운트다운하는 스크립트임
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
for(int i = 3; i >= 0; i--)
{
Debug.Log(i);
}
}
}
\ 출력 결과 /
3
2
1
0
- 다음은 1부터 10까지 더한 값을 출력하는 스크립트임
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int sum = 0;
for(int i = 1; i <= 10; i++)
{
sum += i;
}
Debug.Log(sum);
}
}
\ 출력 결과 /
55
>> 스크립트에서 오류는 흔한 것!
- 스크립트를 작성하고 '자, 이제 게임이 움직인다!'라고 생각하자마자 오류 메시지가 나올 때가 있음
- 이때마다 '아아, 스크립트는 어렵다!'고 생각할 수 있음
- 컴파일이 한 번에 되는 경우는 생각만큼 많지 않음
- 마음을 편하게 먹고 오류 코드를 읽은 후 해당하는 부분을 살펴보자
[3].2 배열 사용하기
>> 배열 사용하기
- 스크립트를 사용하다보면 여러 가지 값(게임 순위와 점수 등)을 한꺼번에 다뤄야 할 때가 있음
- 이때 변수를 하나하나 만드는 것은 너무나 수고로움
- 예를 들어 학생 100명의 점수를 다룬다면 변수를 100번 선언해야 함
- 숫자가 늘어날수록 힘들고 실수도 늘어날 수 있음
>> 배열 선언과 규칙
이때는 배열을 쓰면 해결됨
배열은 변수 상자를 가로로 이어 붙인 길고 얕은 상자와 비슷함
>> 배열 준비
- 배열을 사용하면 변수 상자를 굳이 100개씩 준비하지 않아도 됨
- 길고 얕은 상자 한 개만 쓰면 되므로 다루기도 쉽고 만들기도 간단함
- int가 정수형을 나타내는 것처럼 int[ ]는 정수 배열형을 나타냄
- 다만 이것만으로는 변수 상자를 몇 개 연결하고 싶은지 알 수 없음
- 앞의 선언에 이어서 준비하려는 상자 수를 다음과 같이 씀
- 상자를 다섯 개 준비하려면 오른쪽에 new int[5]를 씀
- 오른쪽에 new 키워드가 나옴
- 영어로는 '새로운'이라는 뜻이지만 스크립트에서는 '만든다'라는 뜻에 가까움
- 여기서는 new int[5]를 써서 int형 상자를 다섯 개 만듦
- 즉, 배열을 만들려면 배열을 선언하고 바로 이어서 new를 이용해 배열에 필요한 상자 수를 지정해야 함
>> 배열 값 이용
- 이것으로 상자 다섯 개를 연결한 배열을 만듦
- 이 배열에 값을 대입하거나 꺼내려면 다음과 같이 상자 번호를 지정해야 함
- 앞에서 세 번째에 있는 상자에서 값을 꺼내고 싶다면 다음과 같이 씀
- 'points[3]을 잘못 쓴 것 아니야?'라고 생각했나요? 바르게 쓴 것임
- 배열은 0번부터 세기 때문임!
- 맨 앞 번호는 0, 앞에서 두 번째 번호는 1, 마지막 상자 번호는 4 임
- 배열에서는 상자에 넣는 값을 요소, 상자의 총수를 요소 수라고 함
- 코드: 배열 사용하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int[] array = new int[5];
array[0] = 2;
array[1] = 10;
array[2] = 5;
array[3] = 15;
array[4] = 3;
for(int i = 0; i < 5; i++)
{
Debug.Log(i);
}
}
}
\ 출력 결과 /
2
10
5
15
3
>> 배열을 사용하는 방법
- 9번 줄에서는 요소 수가 5인 int형 배열 array를 선언함
- 11~15번 줄에서는 대괄호([])를 써서 각 배열 요소에 숫자를 대입함
- 배열의 첫 번째 요소가 0번인 것을 주의함
- 17~20번 줄에서 배열 내용을 출력함
- Debug.Log를 다섯 번 쓰지 않고 for 문을 써서 배열의 모든 요소를 출력함
- 배열과 반복문은 자주 함께 쓰이므로 묶음으로 생각하면 편함
- 배열의 요소에 값을 대입할 때 11~15번 줄처럼 하나하나 쓰면 꽤 번거로움
- 이때는 다음과 같이 간단히 쓸 수 있음
- 이 방법에서는 배열에 넣는 개수가 분명하므로 new를 써서 배열의 요소 수를 지정하지 않아도 됨
- 다음은 배열에 포함된 숫자 중 90 이상인 숫자만 출력하는 스크립트임
- 코드: 조건을 만족하는 요소만 출력하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int[] points = [83, 99, 52, 93, 15];
for(int i = 0; i < points.Length; i++)
{
if(points[1] >= 90)
{
Debug.Log(points[1]);
}
}
}
}
\ 출력 결과 /
99
93
- 11~17번 줄에서는 for 문을 사용해 배열의 요소를 첫 번째부터 차례로 확인함
- 13~16번 줄에서는 if 문을 써서 값이 90 이상인 요소만 출력함
- for 문의 반복 조건은 0부터 points.Length까지임
- points.Length란 글자 그대로 points 배열의 길이(요소 수) 임
- 배열형의 변수명.Length를 써서 배열의 길이(이 예제에서는 5)를 얻을 수 있음
- 다음은 배열에 포함되는 값의 평균을 구하는 스크립트임
- 코드: 평균값 구하기
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void Start()
{
int[] points = [83, 99, 52, 93, 15];
int sum = 0;
for(int i = 0; i < points.Length; i++)
{
sum += potints[i]; ...①
}
int average = sum / points.Length; ...②
Debug.Log(average);
}
}
\ 출력 결과 /
68
- 평균값을 구하려면 ①배열에 있는 모든 요소의 합계를 구하고 ②구한 합계를 배열의 요소 수로 나눔
- 먼저 배열 요소의 합계를 구해야 하므로 11번 줄에서 sum 변수를 준비함
- 12~15번 줄에서는 배열에 있는 요소를 sum에 더함
- 17번 줄에서는 합계를 배열의 요소 수인 5로 나눠 평균값을 구하고 average 변수에 대입함
>> 정수와 정수의 나눗셈
- 평균값을 구하는 스크립트에서는 평균값을 정수로 계산했지만(int형의 average 변수를 선언함) 소수점까지 계산해야 할 때도 있음
- 소수점까지 출력되도록 '코드: 평균값 구하기'의 17번 줄을 다음과 같이 바꿔서 실행해 보자
- 평균값은 68.4가 정답이지만 68로 줄력됨
- 이것은 C#에서는 정수끼리 나눗셈을 하면 소수점 이하가 버려져 결과는 정수가 되기 때문임
- 즉, 10 % 4는 2가 되고, 17 % 3은 5가 됨
- 소수점까지 출력하고 싶다면 정수끼리 나눗셈을 하는 것이므로 처음에 1.0f를 넣어줌
- 꼼수처럼 보이지만 이 내용을 모르면 계산 결과를 소수점으로 구할 때 오류가 발생할 수 있으므로 꼭 기억해 두자
>> 오류 코드를 영어로 읽기 싫어!
- 오류 로그는 'Assets/xxxxx.cs(5:12)...'처럼 복잡한 영문 구조로 되어 있음
- 복잡해 보이지만 괄호 안에 보이는 숫자를 보면 쉬움
- '5번 줄의 12번째 글자가 잘못되어 있어요'라고 알려주기 때문임
- 숫자가 가리키는 줄과 그 부분을 살펴보면 오류를 쉽게 발견할 수 있음
- 오류를 몇 번 고치다 보면 오류 메시지만 봐도 대략 어떤 오류인지 짐작할 수 있음
'서울여자대학교 SWU > 2023 여름방학 SW사관학교 Programing GURU' 카테고리의 다른 글
[5] 슈팅 게임 제작 (1) (6) | 2023.07.04 |
---|---|
[4] C# 스크립트 (3) (6) | 2023.06.30 |
[2] C# 스크립트 (1) (6) | 2023.06.28 |
[1] 유니티 설치 & 조작법 - (3) 오브젝트 다루기 (6) | 2023.06.27 |
[1] 유니티 설치 & 조작법 - (2) 유니티 화면 구성 (2) | 2023.06.27 |