-
게임개발 1일차 (C# 변수, 배열, 조건문, 반복문)게임 개발 2025. 5. 23. 16:44

게임개발을 위해 유튜브 무료 강의를 보고 공부를 시작했다. 조연2 게임 작업실님의 영상을 보며 했다.
유니티 설치. 비쥬얼스튜디오 2022 설치 후 external script editor를 vs2022로 변경.double연산자는 크고 느리기 때문에 float연산자 사용. 각 숫자에 f를 붙여야 함. (소수 기본형은 double이라)
str = str2 ?? str3
str2가 null이면 대신 str3를 넣으라는 뜻
str ??= str2
str = str ?? str2 즉 본인이 null이면 대신 str2를 넣으라는 뜻
유니티는 C#을 사용하는데 C#에서는 파이썬과 달리 'i' * 3 같은건 안된다.
Debug.Log(new string('i', 3)) 이런식으로 해야한다고 한다. 아니면 이중반복을 사용하던가.
c#에서는 대소문자를 구별하고 문자열 string은 " " 문자 str은 ' '을 사용한다.
c#에서 배열을 초기화하지 않으면 기본값이 정해져있다.
int는 0, boolean은 false, 그 이외에는 null.
배열에는 고정배열과 가변배열이 있다.
int[,] a = new int[3,4]; 이러면 3x4의 고정 int 배열이 만들어진 것이다.
int[][] a= new int[3][];
이렇게 하고
a[0] = new int[2];
a[1] = new int[3];
a[2] = new int[4]
이렇게 하면 가변배열이 만들어진 것이다. 그림으로 보면

이런 차이가 된다. 참고로 int [2,3][] 처럼 고정배열뒤에 가변배열을 혼합하는 것은 불가능하지만
int [3][,] 처럼 가변배열뒤에 고정배열이 붙는건 가능하다.
고정배열이란 것이 선언될 때 아예 딱 자리를 고정해버리는거라 그렇다고 한다.

int[][] a; #a는 2차원 int 배열 변수
a = new int[3][]; #행이 3인 2차원 int 배열 생성후 a에 집어넣음
a[0] = new int[] { 1, 2, 3 }; #a의 첫 번째 행에 1,2,3 1차원 int배열을 만들어서 넣음
a[1] = new int[] { 4, 5 };
a[2] = new int[] { 6, 7, 8, 9 };
이미 a는 2차원 int 배열 변수로 선언되었기 때문에 int[] a[0]; 이렇게 다시 선언할 필요는 없다.위 2줄을 합치면 int[][] a = new int[3][0]; 이 된다.
위 코드를 빠르게 만들면
int[][] a =
{
new int[] { 1, 2, 3 },
new int[] { 4, 5 },
new int[] { 6, 7, 8, 9 }
};이렇게 해버릴 수 있다. ( 마치 int[] a = {1,2,3}; 과 비슷한 원리 )
즉 int[3][]이렇게 초기화를 하거나 아니면 선언과 동시에 요소를 넣어서 간접적으로 [3]임을 알려주거나의 차이
그러면 왜 int[][] a = {{1,2,3},{4,5},{6,7,8}}은 안되느냐.... 그냥 c#이 그렇다더라 입니다.
참고로 배열은 .Count가 아니라 .Length를 사용해야 한다.
Debug.Log(string.Join(" ", a)); 이런식으로 1 2 3 처럼 출력되게 할 수 있다.
배열변수가 아닌 컬렉션변수에는 여러가지가 있지만 대표적으로 리스트와 딕셔너리가 있다.
리스트는 배열과 비슷하지만 유동적이라는게 특징이다. 특정부분에 insert를 하면 알아서 뒤로 쭉 밀린다거나 중간을 빼면 알아서 앞으로 밀린다거나 하는 것.
List<string> a = new List<string>(); #선언
a.Add("Hi"); #맨 뒤에 추가:
a.Insert(1, "Hello"); #원하는 곳에 삽입:
a.RemoveAt(0); #원하는 인덱스의 값 제거
for (int i = 0; i < a.Count; i++)
{
Debug.Log(a[i]);
}또는 Debug.Log(string.Join(" ", a));
이렇게 하면 결과는 Hello my name is SJ가 된다. 참고로 반복문의 범위를 정할 때 a.Count 처럼 동적으로 편하게 정할 수 있다.a.Contains("SJ") : a리스트가 SJ를 포함하는지 알려준다.
a.IndexOf("SJ") : SJ의 인덱스를 알려준다.
a.Clear() : a 리스트를 밀어버린다.
a.Count : a 요소 개수를 알려준다 (주의 : 괄호 없음)
Dictionary는 key 기반 자료구조이다. "한국", "서울" 이런식으로 대응된다. key와 value라고 한다.
그래서 Insert나 RemoveAt이 없다. 순서가 없기 때문이다.
추가 삭제 등등 모두 key기준으로만 가능하다.
Dictionary<string,string> a = new Dictionary<string,string>(); #선언
cities.Add("한국","서울"); #추가 또는 수정
cities["일본"] = "도쿄"; #추가 또는 수정
Debug.Log(cities["한국"]); #서울 출력
cities.ContainsKey("한국"); #한국 키를 가지고 있는지 확인
cities.ContainsValue("서울"); #서울 값을 가지고 있는지 확인
cities.Remove("한국"); #키 값 기준으로 제거
만약 딕셔너리 전체를 보고 싶다면
foreach (var item in cities)
{
Debug.Log($"{item.Key} : {item.Value}");
}이렇게 적으면 된다.
foreach는 배열,리스트,딕셔너리 등에서 요소를 하나하나 꺼내주는 함수다.
var은 KeyValuePair<string, string="">대신 들어감. 자동으로 추론해줘서 넣어줌.</string,>
$" " 이렇게 하고 변수들을 {}로 감싸면 문자열 하나하나를 " " 로 감싸서 더하는 것보다 훨씬 간단해짐.
예시 : (a + ":" + b + ":" + c + ":" + d) vs ($"{a} : {b} : {c} : {d}")

void Start()
{
List<int> a = new List<int>();
for (int i = 5; i <= 1000; i+=5) # 5에서 1000까지 5만큼 증가 (모든 수를 검사할 필요가 없음)
{
int j = i; # j는 i를 복사
bool valid=true; # 검사용 변수
while (j != 0) # j가 0이 될 때까지
{
if (j % 10 != 0 || j % 10 != 5) # 일의 자리수가 0 또는 5가 아니면
{
valid = false; # 이 숫자에는 0이나 5가 아닌 숫자가 있음을 알림
break; # 더 이상의 계산의 무의미 하므로 break
}
j /= 10; # 다음 숫자를 검증하기 위함
}
if (valid) a.Add(i); # valid가 true면 이 숫자에는 불순물이 없으므로 리스트에 넣는다.
}
Debug.Log(string.Join(" ", a));
}

Dictionary<string, string> a = new Dictionary<string, string>();
Dictionary<string, string> b = new Dictionary<string, string>();
a.Add("사과", "apple");
a.Add("바나나", "banana");
a.Add("오렌지", "orange");
string tmp1;
string tmp2;
foreach(var item in a)
{
tmp1 = item.Key;
tmp2 = item.Value;
b.Add(tmp2, tmp1);
}
foreach (var item in b)
{
Debug.Log($"{item.Key} : {item.Value}");
}

int[,] a = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int[,] b = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int[,] sum = new int[3, 3];
int[,] mul = new int[3, 3];
for(int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
sum[i, j] = a[i, j] + b[i, j];
mul[i, j] = a[i, 0] * b[0, j] + a[i, 1] * b[1, j] + a[i, 2] * b[2, j]; #a는 행을 고정, b는 열을 고정시키고 움직이면서 곱하고 더함
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Debug.Log($"sum[{i},{j}]= {sum[i, j]}");
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
Debug.Log($"mul[{i},{j}]= {mul[i, j]}");
}
}
for (i=0; i<a.length; i++)보다 foreach(var item in a)를 애용하도록 하자. 7시간 열공 후 마무리!
'게임 개발' 카테고리의 다른 글
게임개발 6일차 (간단한 슈팅게임 4) (0) 2025.05.28 게임개발 5일차 (간단한 슈팅게임 3) (0) 2025.05.27 게임개발 4일차 (간단한 슈팅게임 2) (1) 2025.05.26 게임개발 3일차 (간단한 슈팅게임 1) (0) 2025.05.25 게임개발 2일차 (함수, struct, class, 추상화, 다형성, 상속) (0) 2025.05.24