본문 바로가기
게임 개발(유니티)/멋쟁이 사자처럼 3기_회고록

[멋쟁이사자처럼 유니티 TIL] 2024_12_02(월) 강의 요약 및 정리

by goraku97 2024. 12. 2.

Rider의 편리한 기능

- 함수 자동 만들기

  함수로 만들고 싶은 영역선택-> Refector -> Refector This ->
  Extract Class -> Source Name
이름작성후 확인을 누르면

  해당 코드를 포함한 함수가 자동생성됨.

 

- Quick Fix(빠른 수정)

   Alt + Enter 를 누르면 다음과 같은 수정이 가능

 

  - 네임스페이스 추가:

    특정 클래스, 메서드, 속성 등이 선언되지 않은 경우 관련된 네임스페이스를 자동으로 추가

    Ex.) using System.Linq;가 누락되었다면 Alt + Enter를 눌러 추가 가능

 

  - 필요한 메서드/클래스 생성:

    호출된 메서드나 클래스가 정의되지 않은 경우, 해당 메서드/클래스를 생성

 

  - 자동 생성된 코드 삽입:

    인터페이스 구현, 메서드 오버라이드 등도 자동으로 생성

 

   - 코드 서식 및 최적화:

    사용하지 않는 네임스페이스 제거, 코드 리팩토링, 변수 타입 변경 등을 제안

 

  - 접고 싶은 구역을 설정할때

    시작하는 부분에 #region Values

    끝나는 부분에 #endregion 을 입력하면 해당 코드를 접을 수 있음

 

자료구조 Array활용해보기

private const int ARRAY_SIZE = 10;

//현재 클래스에서만 접근 가능한 배열 크기를 10으로 고정( const int ARRAY_SIZE = 10)

  하여 정의한 상수를 나타냄

 

private int[] playerScores = new int[ARRAY_SIZE];

// playerScores: 정수형 배열로, 플레이어의 점수를 저장

// ARRAY_SIZE로 지정했으므로, 이 배열에는 최대 10개의 플레이어 점수를 저장할 수 있음

 

private string[] itemNames = { "검", "방패", "포션", "활", "마법서" };

 // 5개의 이름("검", "방패", "포션", "활", "마법서")으로 배열을 초기화

 //  게임에서 사용되는 아이템의 이름을 관리하는 데 사용됨.

 

public GameObject[] enemyPrefabs;

 // GameObject 배열로, 적 캐릭터의 프리팹들을 저장.

 // 접근제한자가 public 이기 때문에, Inspector 창에서 설정 가능

 

private int[,] mapTiles = new int[10, 10];

 // int[,] mapTiles: 2D 배열로, 정수 맵의 타일 정보를 저장

    [,,] 를 써야 3D사용가능.  

 // new int[10, 10]: 크기가 10x10인 배열을 생성하고, 모든 값은 기본값 0으로 초기화

 

public GameObject Cube;

public GameObject Sphere;

// GameObject 의 변수로 Cube 를 할당. Inspector 창에서  설정가능

// GameObject 의 변수로 Sphere 를 할당. Inspector 창에서  설정가능

 

private GameObject[,] CubeTiles = new GameObject[10, 10];

// GameObject[,] CubeTiles : 2D 배열로, GameObject 큐브 타일 정보를 저장

// new GameObject[10, 10]: CubeTiles 배열을10x10 크기로 생성하고, 

                                              모든 값은 기본값 0으로 초기화.

 

void Start()

{ // PlayerScoresExample(); // ItemInventoryExample();

// EnemySpawnExample(); MapGenerationExample(); }

 // 하기의 4개의 코드를 게임 시작시 1번만 실행하기 위해,

   Start 함수를 사용.

 

void PlayerScoresExample()

// PlayerScoresExample() 이라는 함수를 실행.

 

for (int i = 0; i < playerScores.Length; i++)

// playerScores 배열의 길이(.Length)만큼 반복하는 for 루프

// i는 0부터 playerScores.Length - 1까지 반복하며, 각 배열의 인덱스에 접근

배열의 인덱스는 0부터 시작하기 때문에 Length - 1 을 사용하여

 마지막 인덱스를 정확하게 다룰 수 있음.  

(ex. 배열의 길이(Length)가 5일 때, 마지막 인덱스는 Length - 1인 4)

 

playerScores[i] = Random.Range(100, 1000);

// Random.Range(100, 1000)은 100 이상 1000 미만의 랜덤한 값을 생성

// 이 값을 playerScores[i] 배열의 각 요소에 할당하여 배열에 10개의 랜덤 점수를 할당.

 

int maxValue = 0;

// maxValue는 현재까지의 최고 점수를 저장하는 변수.

   초기값으로 0을 설정.

 

for (var i = 0; i < playerScores.Length; i++)

// playerScores 배열의 길이(.Length)만큼 반복하는 for 루프

// i는 0부터 playerScores.Length - 1까지 반복하며, 각 배열의 인덱스에 접근

 

if (playerScores[i] > maxValue)

// 배열의 각 점수(playerScores[i])가 현재까지 저장된 maxValue보다 클 경우

  if 문이 true 가 되어 하기의 코드를 실행.

 

maxValue = playerScores[i];

// 그 playerScores[i] 점수를 maxValue 에 저장.

 

Debug.Log($"최고 점수1: {maxValue}");

// " 최고 점수1:" 문장에다가 갱신된 {maxValue을 콘솔창에 표시함.

   ex. maxValue가 100이라면, 출력되는 메시지는 " 최고 점수1: 100"

   $ 를 사용하면, 중괄호 {} 안에 있는 변수나 표현식을 문자열에 삽입할 수 있음.

 

 

void ItemInventoryExample()

// ItemInventoryExample() 함수를 실행

 

int randomIndex = Random.Range(0, itemNames.Length);

Random.Range(0, itemNames.Length) :

// itemNames 배열의 길이를 기준으로, 0 이상 itemNames.Length 미만랜덤한 정수를 생성

int randomIndex :

// 상기의 값을 randomIndex 변수에 저장. 

   itemNames 배열에서 해당 인덱스의 아이템을 선택하는 데 사용

 

string selectedItem = itemNames[randomIndex];

// randomIndex 값에 해당하는 itemNames 배열의 아이템을 선택하여 selectedItem 변수에 저장

 

Debug.Log($"선택된 아이템: {selectedItem}");

// "선택된 아이템:" 문장에다가 갱신된 {selectedItem을 콘솔창에 표시함.

 

string itemName = "포션";

// "포션"이라는 문자열을 itemName 변수에 저장

 

bool hasPotion1 = Contains(itemName);

// Contains(itemName) 메서드를 호출하여 itemNames 배열에서 "포션"이 있는지 확인

  "포션" 이 있다면, hasPotion1 는  true, 없다면 false 를 반환.

 

Debug.Log($"포션 보유 여부: {hasPotion1}");

// "  포션 보유 여부 :" 문장에다가 갱신된 {hasPotion1을 콘솔창에 표시함.

  ex. hasPotion1 이 true라면, 출력되는 메시지는 " 포션 보유 여부: true"

 

string searchItem = "방패";

//  "방패" 이라는 문자열을 searchItem 변수에 저장

 

bool hasPotion2 = itemNames.Contains(searchItem);

//  Contains(itemName) 메서드를 호출하여 itemNames 배열에서 "방패" 있는지 확인

  "방패" 이 있다면, hasPotion2 는  true, 없다면 false 를 반환.

 

Debug.Log($"방패 보유 여부: {hasPotion2}")

// "  포션 보유 여부 :" 문장에다가 갱신된 { hasPotion2 을 콘솔창에 표시함.

  ex. hasPotion2 이 true라면, 출력되는 메시지는 " 방패 보유 여부: true"

 

private bool Contains(string itemName)

string itemName:

//메서드의 매개변수로 itemName이라는 문자열을 받음.

Contains

// 배열에 특정 항목(itemName)이 있는지 확인하는 기능을 담당

bool:

// 참이면 true, 거짓이면 false 을 반환

 

for (var i = 0; i < itemNames.Length; i++)

// itemNames 배열의 길이(.Length)만큼 반복하는 for 루프

// i는 0부터 itemNames.Length  - 1까지 반복하며, 각 배열의 인덱스에 접근

 

if (itemNames[i] == itemName)

// 만약 itemNames[i]itemName과 같다면, 이 조건문이 true 가 되어서

   하기의 코드를 실행.

 

return true;

// 만약 배열의 i번째 요소가 itemName과 같다면, true를 반환. 메서드는 종료

 

return false;

// for 루프가 끝까지 실행해도, 배열 내에 itemName이 없으면, false를 반환.

    메서드는 종료.

 

 

void EnemySpawnExample()

// EnemySpawnExample()  함수를 실행

 

if (enemyPrefabs != null && enemyPrefabs.Length > 0)

// enemyPrefabs 배열이 null이 아니고, 배열에 적 프리팹이 0 보다 많다면 if 문이 true 가 되어

   하기의 코드를 실행.

 

Vector3 spawnPosition = new Vector3(Random.Range(-10f, 10f), 0, Random.Range(-10f, 10f));

// 위치를 초기화하고, X축은  랜덤하게 -10 ~10, Y축은 고정, Z축도 랜덤하게 -10 ~ 10

   까지의 위치를 정하고, spawnPosition 에 저장함.

  

int randomEnemyIndex = Random.Range(0, enemyPrefabs.Length);:

// 0에서 enemyPrefabs 의 길이사이에서 랜덤하게 정수숫자를 정해서

  randomEnemyIndex 에 할당함.

 

Instantiate(enemyPrefabs[randomEnemyIndex], spawnPosition, Quaternion.identity);

// enemyPrefabs 의 randomEnemyIndex 배열에서 선택해서, spawnPosition 

  위치에,  회전없이 프리팹을 생성(Instantiate) 함.

 

Debug.Log($"적 생성됨: {enemyPrefabs[randomEnemyIndex].name}");

// "  적 생성됨 :" 문장에다가 갱신된 { enemyPrefabs[randomEnemyIndex].name } 

       을 콘솔창에 표시함

 

else

// 상기의 if 문이 false 라면 하기의 코드를 실행

 

Debug.LogWarning("적 프리팹이 할당되지 않았습니다.");

// 경고 아이콘과 함께  "적 프리팹이 할당되지 않았습니다.

   라는 로그를 노란색으로 콘솔창에 출력함.

 

void MapGenerationExample()

// MapGenerationExample() 이라는 함수를 실행

 

for (int x = 0; x < mapTiles.GetLength(0); x++)

for (int y = 0; y < mapTiles.GetLength(1); y++)

// mapTiles는 2차원 배열로, 각각의 칸이 x와 y 좌표를 나타냄.

 

// mapTiles.GetLength(0)은 배열의 첫 번째 차원의 크기(가로 길이)를 반환

   외부 루프는 맵의 (x축)을 순회

    mapTiles.GetLength(0)은 배열의 첫 번째 차원의 길이(행 개수)를 반환

 

// mapTiles.GetLength(1)은 배열의 두 번째 차원의 크기(세로 길이)를 반환

   내부 루프는 맵의 열(y축)을 순회

   mapTiles.GetLength(1)은 배열의  번째 차원의 길이(열 개수)를 반환

 

 mapTiles[x, y] = Random.value > 0.8f ? 1 : 0;

Random.value:

// Unity에서 제공하는 0 이상 1 미만의 부동소수점 난수를 생성하는 속성

  ex. 0.23, 0.75344, 0.8922111 등의 값이 무작위로 반환

Random.value > 0.8f ? 1 : 0;

// 20%의 확률로 참이 되므로, 각 칸은 80% 확률로 0, 20% 확률로 1이 됨.

 

그리고 나온 값을 mapTiles[x, y] 에 저장함.

 

for (int x = 0; x < mapTiles.GetLength(0); x++)

for (int y = 0; y < mapTiles.GetLength(1); y++)

// mapTiles는 2차원 배열로, 각각의 칸이 x와 y 좌표를 나타냄.

 

// mapTiles.GetLength(0)은 배열의 첫 번째 차원의 크기(가로 길이)를 반환

   외부 루프는 맵의 (x축)을 순회

    mapTiles.GetLength(0)은 배열의 첫 번째 차원의 길이(행 개수)를 반환

 

// mapTiles.GetLength(1)은 배열의 두 번째 차원의 크기(세로 길이)를 반환

   내부 루프는 맵의 열(y축)을 순회

   mapTiles.GetLength(1)은 배열의  번째 차원의 길이(열 개수)를 반환

 

if (mapTiles[x, y] == 1)

// mapTiles[x, y] 값이 1 이면  if 문이 true 가 되어 하기의 코드를 실행

 

CubeTiles[x, y] = Instantiate(Cube, new Vector3(x - 5, y - 5, 0), 

Quaternion.identity);

// Cube를 위치를 초기화하고, (x - 5, y - 5, 0) 위치에 회전없이 프리팹을 생성(Instantiate

   해서, CubeTiles[x, y] 에 저장함.

 

else

// 상기의 if 문이 false 면, else 문이 true 가 되어 하기의 코드를 실행.

 

CubeTiles[x, y] = Instantiate(Sphere, new Vector3(x - 5, y - 5, 0),

Quaternion.identity); }

// Sphere 를 위치를 초기화하고, (x - 5, y - 5, 0) 위치에 회전없이 프리팹을 생성(Instantiate

   해서, CubeTiles[x, y] 에 저장함.