0. 생성한 스크립트
- Switch : number값 읽어서 어느값인지 콘솔창에 출력하기
- Interator : 반복문 연습
- Array : 랜덤값을 배열의 크기만큼 생성 / 행렬 예
- Batch : 프리펩 자동생성 후 배치
1. 오브젝트 움직이기
public float speed = 1.0f; //전역변수
float x = 0.0f; //변수 선언 후 초기화
float z = 0.0f;
if (Input.GetKey(KeyCode.W))
{
z += speed;
}
else if (Input.GetKey(KeyCode.S)) //둘다 if로 하면 정지하니 서로 반대 방향일경우는 else if로 한다.
{
z -= speed;
}
if (Input.GetKey(KeyCode.D)) //앞뒤 / 좌우는 if로 나눠서 써야 대각선 이동이 가능하다.
{
x += speed;
}
else if (Input.GetKey(KeyCode.A))
{
x -= speed;
}
x *= Time.deltaTime;
z *= Time.deltaTime;
//transform.position += new Vector3(x, 0, z);와 같은 의미지만 함수로 간단하게 처리했다.
transform.Translate(new Vector3(x, 0, z));

2. 메모리 구조
- 32비트의 렘이 있다는것은 1비트당 1번지의 공간을 할당할 수 있다는것을 말한다.
- 만약 int a=0;이 ox300번지에 할당되었다면 int는 4바이트이니 0x304까지의 공간이 int a에 할당된다.
- a=10;을 하면 이 공간에 10이라는 값이 저장되는 것이다.
- 메모리 한 공간은 4바이트로 이루어져있다.

- 코드 영역 : 실행할 프로그램의 코드가 저장되는 영역으로 CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
- 데이터 영역 : 프로그램의 전역 변수와 정적(static) 변수가 저장되는 영역으로 프로그램의 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.
- 힙 영역 : 사용자가 직접 관리할 수 있는 메모리 영역으로 사용자에 의해 메모리 공간이 '동적'으로 할당되고 해제된다.
- 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.(배열의 0 ~ 후 순서로 생각하면 될듯하다.)
- 스택 영역 : 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역으로 한수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸한다.
- 스택 영역에 저장되는 함수의 호출 정보를 스택프레임 이라고 한다.
- 스택은 후입선출로 동작하며, 스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.

3. 스위치 문
- 도구 -> 옵션 -> C# -> 코드스타일 -> 서식 -> 들여쓰기 -> case 내용 들여쓰기 및 들여쓰기(블록_)체크해제
- ctrl + k + f : 선택범위 옵션대로 설정하기
- break; 가 없다면 break;가 나올때까지 위의 조건이 전부 실행되고 멈춘다.
public int number = 0; //전역변수
switch (number)
{
case 1:
print("number는 1과 같음");
break;
case 2:
print("number는 2과 같음");
break;
case 3:
print("number는 3과 같음");
break;
case 4:
print("number는 4과 같음");
break;
case 5:
case 6:
case 7:
print("number는 5,6,7 중 하나");
break;
default:
{//조건을 두 줄이상 쓸 경우 중괄호를 넣어 쓴다.
print("해당 사항 없음");
print("맞는 숫자가 없다");
}
break;
}



4. 반복문
- while / do~while / for
- 반복문은 while 보다 for문을 더 많이 쓴다.
- continue는 밑의 내용이 실행 안되고 다음 반복으로 넘어간다.
- break;는 만나는 즉시 반복에서 빠져나간다.
public int end = 10; //전역 변수
int i = 0;
while(i < end)
{
i ++;
print($"i = {i}"); //1 ~ 10까지 출력
}
for(int i = 0; i < end; i++)
{
print($"i = {i}"); //0 ~ 9까지 출력
}
int index = 0;
while (true)
{
index++;
if(index > end)
{
break; //while은 이걸 만나면 루프에서 빠져나간다.
}
print($"index = {index}"); //1 ~ 10까지 출력
}
//for(int index = 0; ; index++) //for문 무한반복
{
if(index > end)
{
break;
}
print($"index = {index}"); //0 ~ 10까지 출력
}
for(int index = 0; index < end; index++)
{
if(index > 3 && index <= 5)
{
continue;
}
print($"index = {index}");
}

5. 메모리공간 할당
- 정적할당 => int a = 10;
- 스택 메모리에 값이 저장된다.
- 동적할당 => int a = new int(); => 크기 지정을 하지않고 우리가 마음대로 늘려서 사용하는 공간이다.
- 스택에 a의 공간을 만들고 여기에 값을 저장하는 heap공간의 주소를 저장한다.
- new는 heap공간에는 a변수 공간에 넣을 값을 저장할 공간을 만든다.
- 즉, 동적할당은 스텍 메모리에 주소가 저장이되고, 힙 메모리에 값이 저장된다.

6. 배열
- int [] a = new int[5]; => 1차원 배열
- int [,] a = new int[3,5]; => 2차원 배열(3행 5열)
int[] arr = new int[5];
for(int i = 0; i < 5; i++)
{
arr[i] = Random.Range(0, 20); //0 ~ 19까지 랜덤으로 출력된다.
}
for(int i = 0; i < arr.Length; i++) //arr.Length = 5
{
print($"arr[{i}] = {arr[i]}");
}
print($"arr의 크기 : {arr.Length}");
int[] arr2 = new int[] { 3, 1, 5, 4 }; //바로 초기화할때 쓸 수 있다.
for (int i = 0; i < arr2.Length; i++) //arr.Length = 4
{
print($"arr[{i}] = {arr2[i]}");
}
int[,] arr3 =
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 } //각 한 차원당 한 그룹으로 묶어줘야한다.
};
for(int row = 0; row < 3; row++)
{
for(int col = 0; col < 4; col++)
{
print($"arr3[{row}][{col}] = {arr3[row,col]}");
}
print($"{row}행 끝");
}
print($"arr3의 크기 : {arr3.Length}");
print($"arr3 행의 크기 : {arr3.GetLength(0)}");
print($"arr3 열의 크기 : {arr3.GetLength(1)}");

7. 에셋 임포트 및 프리펩 생성
- ctrl + n : 새로운 씬 생성 단축키
- Assets -> Import new Assets 클릭 후 폴더에 갖고있는 에셋 모델 ' 스킨 등 클릭 후 임포트
- 모델 클릭 후 -> 컴포넌트에 Meterials -> Extract Materials 클릭 후 스킨을 넣을 변수 아이콘 생성할 폴더 선택
- 생성된 아이콘 클릭 후 -> albedo 왼쪽 동그라미 클릭 -> 변수명과 같은 스킨 더블클릭
- 생성 완료된 모델을 씬 창에 배치한 후 생성된 오브젝트 아이콘을 에셋 폴더로 드래그한다.
- origin profeb 클릭하면 프리펩 생성 완료

8. 프리펩 자동생성 및 이동
- fbx : 원본파일 / prefab : 프리펩파일
- Instantiate(원본, 붙여넣는 좌표, 회전값) : 원본을 복사해서 붙여넣는 함수
public GameObject prefab; //프리펩 넣을 전역변수
GameObject[] objs; //프리펩 자동생성을 위한 게임오브젝트 배열 전역변수
public int number; //몇개를 생성할지 넣을 변수 전역변수
public float speed = 1.0f; //이동시 스피드 전역변수
private void Start()
{
objs = new GameObject[10];
for(int i = 0; i < objs.Length; i++)
{
float z = Random.Range(-50.0f, 50.0f);
float x = Random.Range(-50.0f, 50.0f);
objs[i] = Instantiate(prefab, new Vector3(x, 0, z), Quaternion.identity); //Quaternion.identity : 회전없음
}
}
private void Update()
{
float x = 0.0f; //변수 선언 후 초기화
float z = 0.0f;
if (Input.GetKey(KeyCode.W))
{
z += speed;
}
else if (Input.GetKey(KeyCode.S)) //둘다 if로 하면 정지하니 서로 반대 방향일경우는 else if로 한다.
{
z -= speed;
}
if (Input.GetKey(KeyCode.D)) //앞뒤 / 좌우는 if로 나눠서 써야 대각선 이동이 가능하다.
{
x += speed;
}
else if (Input.GetKey(KeyCode.A))
{
x -= speed;
}
x *= Time.deltaTime;
z *= Time.deltaTime;
objs[number].transform.Translate(new Vector3(x, 0, z)); //transform.position += new Vector3(x, 0, z);와 같은 의미지만 함수로 간단하게 처리했다.
}
