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] 에 저장함.
'게임 개발(유니티) > 멋쟁이 사자처럼 3기_회고록' 카테고리의 다른 글
| [멋쟁이사자처럼 유니티 TIL] 2024_12_03(화) 강의 요약 및 정리(2)_단일 링크 리스트 (0) | 2024.12.03 |
|---|---|
| [멋쟁이사자처럼 유니티 TIL] 2024_12_03(화) 강의 요약 및 정리(1) (0) | 2024.12.03 |
| [멋쟁이사자처럼 유니티 TIL] 2024_11_29(금) 강의 요약 및 정리 (0) | 2024.12.01 |
| [멋쟁이사자처럼 유니티 TIL] 2024_11_28(목) 강의 요약 및 정리 (0) | 2024.12.01 |
| [멋쟁이사자처럼 유니티 TIL] 2024_11_27(수) 강의 요약 및 정리 (0) | 2024.11.28 |