Carrot
본문 바로가기
Unity/멋쟁이사자처럼 부트캠프

[멋쟁이사자처럼부트캠프] 유니티 게임 개발 5기(7일차) - C# 기초 및 유니티 GameObject 접근

by 독기품은토끼 2025. 5. 21.
✅ 오늘의 학습 목표
1. C# 기초 학습
2. 유니티 GameObject 접근

 

1. C# 기초 학습(4)

1. 상수

변하지 않는 수(불견 값)로, 변수를 상수로 설정하는 키워드이다.

const float PI1 = 3.1415f;
readonly float PI2 = 3.1415f;1

 

▶ Const

  • 컴파일(Compile) 단계에서 값이 적용
  • int, float, string, enum 등에 적용 가능
  • 선언할 때 초기화 필요

▶ Readonly

  • 런타임(Run Time) 단계에서 값이 적용
  • 모든 Type에 적용 가능
  • 반드시 초기화 X
  • const보다 readonly가 더 유연하다.

 

2. Collection

메모리에 저장되는 데이터들의 구조

// 배열 (Array)
int[] array;
int[] array1 = { 1, 2, 3, 4, 5 };
int[] array2 = new int[5];
int[] array3 = new int[5] { 1, 2, 3, 4, 5 };

// 리스트 (List)
List<int> list1 = new List<int>();
// List<int> list; // 이렇게 사용하지 않음

// 딕셔너리 (Dictionary)
Dictionary<string, string> dic1 = new Dictionary<string, string>();

// 스택 (Stack)
Stack<string> stack1 = new Stack<string>();

// 큐 (Queue)
Queue<string> queue1 = new Queue<string>();
자료구조 네임스페이스 특징 주요 메서드/속성
배열
(Array)
System - 크기 고정 (정적 배열)
- 동일한 타입 요소
- 인덱스로 접근
Length, 인덱스 접근 (arr[0])
리스트
(List)
System.Collections.Generic - 크기 가변 (동적 배열)
- 순차적 자료
- 제네릭 지원
Add(), Remove(), Count, Insert(), Contains()
딕셔너리
(Dictionary)
- 키-값 쌍 저장
- 키는 고유
- 빠른 검색
Add(), Remove(), ContainsKey(), TryGetValue(), Keys, Values
스택
(Stack)
- 후입선출 (LIFO)
- 제네릭 지원
Push(), Pop(), Peek(), Count

(Queue)
- 선입선출 (FIFO)
- 제네릭 지원
Enqueue(), Dequeue(), Peek(), Count

 

3. Index

Collection을 순서로 접근할 수 있는 방법

🥕 예행 작업
1. Scene 생성 (Array)
2. Script 생성 (StudyArray)

 

3.1. 인덱스 값 확인

using System.Collections.Generic;
using UnityEngine;

public class StudyArray : MonoBehaviour
{
    int[] arrayNumber = new int[5] { 1, 2, 3, 4, 5 };

    void Start()
    {
        Debug.Log($"Array의 첫번째 값 : {arrayNumber[0]}");
        Debug.Log($"Array의 세번째 값 : {arrayNumber[2]}");
        Debug.Log($"Array의 여섯번째 값 : {arrayNumber[5]}"); // 에러
    }
}

 

 

3.2. 배열과 리스트 각각 인덱스 접근 방법

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.iOS;

public class StudyArray : MonoBehaviour
{
    // Array
    int[] arrayNumber = new int[5] { 1, 2, 3, 4, 5 };

    // List
    List<int> listNumber = new List<int>();

    void Start()
    {
        // Array
        Debug.Log($"Array의 첫번째 값 : {arrayNumber[0]}");
        Debug.Log($"Array의 세번째 값 : {arrayNumber[2]}");
        Debug.Log($"Array의 여섯번째 값 : {arrayNumber[5]}");

        // List
        listNumber.Add(1);
        listNumber.Add(2);
        listNumber.Add(3);
        listNumber.Add(4);
        listNumber.Add(5);

        Debug.Log($"현재 List에 있는 데이터 수 : {listNumber.Count}"); // arrayNumber.Length
        Debug.Log($"현재 List의 마지막 데이터 : {listNumber[listNumber.Count - 1]}");
    }
}

 

4. 접근제한자

클래스 안에 있는 변수나 함수(메서드)에 누가 접근할 수 있는지 결정하는 키워드

 

접근 제한자 외부 클래스 접근 자식 클래스 접근 유니티 인스펙터 표시
private X X X (기본 값)
public O O O
protected X O X
SerializeField X X O
// 1
int number1 = 1;

// 2
private int number2 = 2;

// 3
public int number3 = 3;

// 4
[SerializeField]
int number4 = 4;
[SerializeField] int number5 = 5;

 

▶ 1 (Default)

  • C# 기본 접근 제한자는 private
  • number1은 클래스 내부에서만 사용 가능

▶ 2 (Private)

  • private가 명시되어 있어 클래스 내부에서만 사용 가능

▶ 3 (Public)

  • public은 외부에서 접근 가능
  • 다른 스크립트나 유니티 인스펙터에서 사용 가능

▶ 4 (SerializeField)

  • SerializeField는 외부 접근이 안 되는 것을 유니티 인스펙터 창에 노출시켜 설정할 수 있게 해주는 속성
  • 다른 스크립트에서는 사용하지 못함

 

4.1. 육안으로 확인해 봅시다. (다른 스크립트에서 접근)

🥕 예행 작업
1. ProgrammerA 스크립트 생성 (위 코드와 동일)
2. ProgrammerB 스크립트 생성
using UnityEngine;
using DevA;

public class ProgrammerB : MonoBehaviour
{
    //ProgrammerA pA = new ProgrammerA();
    public ProgrammerA pA; // 유니티에서는 이미 실체화 되었기 때문에 new 연산자를 사용하지 않음

    void Start()
    {
        //pA.number1 = 10; // private라 불가능
        pA.number2 = 20; // public이라 가능
        //pA.number3 = 30; // private라 불가능
        //pA.number4 = 40; // 유니티 인스펙터창이 아니여서 불가능
        //pA.number5 = 50; // 유니티 인스펙터창이 아니여서 불가능
    }

}

  • private나 Serialize로 선언된 변수는 타 스크립트에서 참조하지 못하는 것을 확인할 수 있음
  • public인 number2 변수만 참조 가능!

 

노란 박스 추가 설명

  • Unity는 모든 MonoBehaviour 컴포넌트를 GameObject에 붙여서 관리
  • new로 생성하면 Unity에서 관리하지 못함
    • new로 만든 MonoBehaviour 객체는 씬에 존재하지 않고, Unity의 에디터/인스펙터에서도 보이지 않음
    • 즉, Unity 시스템과 동기화되지 않아서 Start, Update 등 작동하지 않음
  • 따라서 이미 실체화된 컴포넌트를 참조해서 사용함

 

2. GameObject 접근

🥕 예행 작업
1. Scene 생성 (Component)
2. Script 생성 (StudyComponent)
3. GameObject 생성 (Cube, Study Component)
using UnityEngine;

public class StudyComponent : MonoBehaviour
{
    public GameObject obj;

    public string changeName;

    void Start()
    {
        obj = GameObject.Find("Main Camera"); // Main Camera 오브젝트를 찾아서 할당하는 기능

        obj.name = changeName;
    }
}

 

나는 name을 '아아'라고 설정했는데, 내가 여기서 좀 헷갈렸던 게..

Main Camere 라는 오브젝트를 찾아서 obj에 할당했으니까,

obj에는 'Main Camera'가 연결되고, Change Name에만 '아아'가 나타나는 줄 알았음 근데 둘 다 '아아'라고 나타남..

그냥 오브젝트는 오브젝트고, 이름은 이름인가봄! 그래서 obj 칸에 나타나는 건 이름인 '아아'가 오는 건가봄..

 

 


 

 

또다시 회고 시간!!

강사님께서 오늘 뭔가 흥미로운 책과 유튜브를 알려주셨다.

 

 

처음엔 그냥 저런 게 있나 보다 하고 넘어갔었는데

지금은 "구할 수 없는 책" 이 한마디에 급 관심 상승 ㅎㅋㅋㅋㅋ

찾아보니까 근처 도서관에서 대여 가능한 걸로 확인됐다.

반납 연기까지 하면 최대 30일 빌릴 수 있던데.. 회고 시간에 저 책 빌려서 공부를 해볼까?ㅅ?

 

추가로 유튭도 하나 알려주셨는데

 

우리 수업에서는 게임 수학에 대해 깊게 다루지 않는다고 해서 해당 강의를 참고해 보는 것도 좋다 하셨음!

 

마츠우라 켄이치로 책은 보니까 10년 전 책이라.. 흠~ 과연 요즘 기술이 잘 적혀 있을까? 싶긴 해서..

이 강의로 회고 시간을 활용해볼까 싶음!!