카테고리 없음

Unity 본캠프 29일차

julesnow 2025. 5. 19. 23:35

복습

(정리 할 거임..)

 

✅ 1. player.Move(forward);에서 Move는 왜 대문자? player는 왜 소문자?

💡 규칙

  • 클래스명 / 메서드명: 첫 글자 대문자 (PascalCase) → Move(), TakeDamage()
  • 변수 / 객체: 첫 글자 소문자 (camelCase) → player, health, score

즉:

csharp
복사편집
Player player = new Player(); // 클래스는 대문자, 변수는 소문자 player.Move(); // 변수.메서드()

영어로 치면
“Player라는 사람을 한 명 만들고 → 그 사람을 player라고 부르고 → player가 Move() 한다”
라고 보면 돼.


✅ 2. follow(Player player)에서 매개변수 이름도 player인데 이건 뭐야?

csharp
복사편집
public void follow(Player player) { ... }
  • Player → 타입(클래스 이름)
  • player → 이름(이 함수 안에서 쓸 변수명)

즉:

“Player 타입의 player라는 이름의 객체가 들어온다”

→ 헷갈리면 이름 다르게 해도 돼:

csharp
복사편집
public void follow(Player targetPlayer) { ... }

✅ 3. .은 무슨 의미?

player.Move()에서 **. (dot)**은

“~의 것” / "속해 있는 것” 의미야.

즉:

csharp
복사편집
player.Move();

“player의 Move() 함수 실행”
= “player가 움직여!”


✅ 4. FSM vs 싱글톤?

항목FSM (상태 기계)싱글톤 (단 하나의 인스턴스)
의미 객체의 상태를 나누어 관리 프로그램 전체에서 하나만 존재
예시 Idle, Run, Jump 상태 전환 GameManager, UIManager
목적 상태별 행동 분리 공통 자원/관리자 역할
 
  • 둘은 다른 개념이야. FSM은 캐릭터처럼 "변하는 것", 싱글톤은 매니저처럼 "하나로 유지되는 것".

✅ 5. enable이란?

  • 어떤 기능을 켜고 끄는 bool 속성이야
csharp
복사편집
gameObject.SetActive(true); // GameObject 전체 활성화 component.enabled = false; // 특정 컴포넌트만 비활성화

"enable"은 "쓸 수 있게 하다"라는 뜻 그대로임!


✅ 6. 옵저버 패턴이 뭐야? EventManager는?

옵저버 패턴은:

“변화를 감지해서 → 자동으로 반응하는 구조”

  • event나 delegate 사용
  • 여러 객체가 한 이벤트를 “구독(subscribe)”하고, 그 이벤트가 발생하면 “자동 실행”

옵저버 vs EventManager

옵저버EventManager
직접 구독/해지 중앙에서 이벤트 등록/호출
분산적 반응 구조적으로 관리
 

👉 옵저버 패턴 = 싱글톤 또는 EventManager를 쓰는 방법 중 하나가 될 수 있어.


✅ 7. 싱글톤이 싱글톤과 상호작용하면 안 되는 이유?

  • 싱글톤끼리 서로 의존하면 → 순환 참조(Dependency Loop) 발생
  • 유지보수 어려워짐 (서로가 서로를 계속 참조해서 수정이 꼬임)

💥 해결법:

  • EventManager 또는 인터페이스 + 의존성 주입(DI) 사용

✅ 8. 싱글톤 예시

csharp
복사편집
public class GameManager : MonoBehaviour { public static GameManager Instance { get; private set; } private void Awake() { if (Instance == null) Instance = this; else Destroy(gameObject); } }

✅ 9. 옵저버 패턴을 "넘어가야" 하는 시기?

  • 이벤트가 너무 많고 복잡해졌을 때
  • 의존관계가 정리되지 않을 때
    → 이때는 StateMachine, EventBus, ScriptableObject 이벤트로 넘어감

✅ 10. delegate, <>, UnityAction

💡 delegate = 함수 저장소

csharp
복사편집
public delegate void MyDelegate(); // 반환 X, 인자 X MyDelegate d = SomeFunction; d(); // 실행

💡 UnityAction

  • delegate를 쉽게 쓰게 도와주는 Unity 전용 래퍼
  • UnityAction, UnityEvent, Action, Func 등 다양

✅ 11. Update()를 지양하는 이유?

  • 매 프레임마다 실행됨 → 성능 저하 유발
  • 불필요한 Update()는 쓰지 말고 → 이벤트 기반으로 변경 권장

✅ 12. Composite 패턴이란?

  • 객체를 트리 구조로 관리 (부모-자식 개념)
  • 예: 메뉴 UI, 적 그룹
  • 전체 or 부분을 같은 방식으로 처리

예:

UIController가 Button이나 Panel들을 자식으로 갖고 → 전체를 한 번에 켜거나 끄는 구조


✅ 13. 디자인 패턴?

코드를 효율적으로 짜는 공식같은 설계 템플릿

대표 3가지:

분류예시
생성 싱글톤, 팩토리
구조 컴포지트, 데코레이터
행동 옵저버, 상태(State), 전략(Strategy)
 

✅ 14. public, void, string 등 정리

키워드뜻왜 씀?
public 외부 접근 가능 다른 스크립트에서도 접근 가능
void 반환값 없음 결과를 되돌려주지 않음
string 문자열 타입 "Nabi" 같은 텍스트 저장용
 

✅ 15. : 는 상속

csharp
복사편집
public class UIController : MonoBehaviour

→ UIController는 MonoBehaviour를 상속받는다
(= Unity의 기능들을 쓸 수 있게 됨)


✅ 16. [SerializeField]란?

  • private인데 인스펙터에 표시하고 싶을 때
csharp
복사편집
[SerializeField] private int health;

✅ 17. Init()은 뭐야?

초기화(Initialize) 함수. 보통 시작할 때 값 세팅할 때 씀.

✅ 18. ( <> ), delegate, event

⬜ <float>, <int> 등은 제네릭(Generic)

  • 어떤 타입이 들어올지 미정일 때 쓰는 틀 (템플릿)
csharp
복사편집
List<int> numbers = new List<int>(); // int용 리스트 Func<float> getHealth = SomeFunction; // float을 반환하는 함수 저장

✅ 19. OnTakeDamage?.Invoke(10); 의 의미

csharp
복사편집
public event Action<float> OnTakeDamage; ... OnTakeDamage?.Invoke(10f);

✔️ 의미

  • ?는 널 검사: 구독한 애가 없으면 아무것도 안 함
  • Invoke(10)은 이벤트 발생: “나 데미지 입었어!” 라고 알림

즉:
"누가 나를 구독하고 있다면, 10만큼 데미지를 입었다고 알려줘!"


✅ 20. event는 함수 안에서만 발생?

  • 정의는 클래스 안에서 (event Action OnSomething)
  • 호출(Invoke)은 클래스 안에서만 가능
  • 하지만 외부 클래스는 구독만 가능 (+=)
csharp
복사편집
player.OnJump += PlaySound; // 구독은 가능 player.OnJump.Invoke(); // 호출은 안 됨 (컴파일 에러)

✅ 21. public이 접근 제한자?

네! 정확해요.

키워드의미
public 어디서나 접근 가능
private 해당 클래스 안에서만
protected 상속받은 클래스까지 가능
 

→ void만 쓴다고 해서 private이 되는 건 아님. 명시 안 하면 기본은 private.


✅ 22. Shift + Enter는 Rider에서 무슨 기능?

  • 줄바꿈만 하고 자동 줄 완성 안 됨
  • 반대로 Enter만 누르면 자동완성/세미콜론 등 붙음

✅ 23. void TakeDamage(float damage) 에서 float은 실수?

정확해!

  • float = 실수 타입 (예: 1.0f, 2.5f)
  • int = 정수 타입

✅ 24. 콜백과 UnityAction

csharp
복사편집
public UnityAction OnMove; ... OnMove?.Invoke();
  • 콜백 = "이거 끝나면 저거 실행해줘"
  • OnMove += () => Debug.Log("움직임!");

→ 람다식으로 짧고 간단하게 함수 지정 가능


✅ 25. 람다식이 편한 이유 + 단점

csharp
복사편집
OnMove += () => DoSomething();
  • 편함: 함수 만들지 않고 코드 안에 직접 작성 가능
  • 단점: 람다식으로 등록한 함수는 빼거나 제거(−=) 불가
    → +=만 되고 -= 안 됨 → 메모리 누수 가능성

그래서 InputSystem처럼 자동으로 연결된 이벤트엔 람다식 남발 X


✅ 26. delegate = 함수 저장소?

그렇지!
함수를 변수처럼 저장하고, 실행하고, 전달할 수 있게 해주는 게 delegate

csharp
복사편집
delegate void MyFunc(); MyFunc f = SomeMethod; f(); // 함수 실행

✅ 27. 왼쪽 = 오른쪽 뜻?

csharp
복사편집
health = 10;

“왼쪽에 오른쪽 값을 넣는다”
"오른쪽 계산 먼저 → 왼쪽에 넣기" 순서야


✅ 28. PlayerController는 외형 컨트롤러?

보통 입력 + 애니메이션 + 움직임을 조작하는 클래스 이름이야

csharp
복사편집
public class PlayerController : MonoBehaviour

✅ 29. OnMove?.Invoke(); 이건 뭐야?

  • 델리게이트나 이벤트가 비어 있지 않다면 실행해줘!
  • 즉, "구독자한테 알려줘!" 라는 의미

✅ 30. 델리게이트 초딩도 이해 가능하게

🎓 비유:

델리게이트 = 호출 가능한 친구 목록

csharp
복사편집
public delegate void MoveHandler(); public MoveHandler OnMove; ... OnMove += Jump; OnMove += Run; OnMove(); // → Jump()도 실행되고 Run()도 실행됨!

✅ 31. 델리게이트 종류

종류설명예시
Action 반환값 없음 Action jump = Jump;
Action<T> 매개변수 1개 Action<float> damage
Func<T> 반환값 있음 Func<int> GetScore
Predicate<T> true/false 반환 Predicate<int> isEven
 

✅ 32. Func<bool> que;는 지양하라고?

→ Func<bool>은 결과를 되돌리는 함수라서, 상태 흐름이 복잡해질 수 있음

→ 초보자 땐 Action으로 한쪽방향 소통만 먼저 익히는 게 좋아


✅ 33. Coroutine 초딩도 설명

“잠깐 기다렸다가 다시 실행할 수 있는 함수”

csharp
복사편집
StartCoroutine(MyRoutine()); IEnumerator MyRoutine() { yield return new WaitForSeconds(2); Debug.Log("2초 후 실행!"); }
  • 여러 단계 작업(걷기 → 멈춤 → 다시 시작)을 시간 간격 두고 처리할 수 있어.

✅ 34. UnityAction 사용법

csharp
복사편집
public UnityAction onJump; void Jump() { onJump?.Invoke(); // onJump가 등록되어 있으면 실행! }

→ UI 버튼, 이동 이벤트 등에 쓰기 좋음

✅ 35. 딕셔너리(Dictionary) 초딩도 알기 쉽게

"사전처럼 key = value 한 쌍으로 저장하는 구조"

csharp
복사편집
Dictionary<string, int> itemCounts = new Dictionary<string, int>(); itemCounts["Potion"] = 3; itemCounts["Bomb"] = 1; Debug.Log(itemCounts["Potion"]); // 3 출력
KeyValue
"Potion" 3
"Bomb" 1
 

🎓 비유:

"‘Potion’이라는 이름표가 붙은 서랍에 3개 들어있음!"


✅ 36. out과 ref 초딩도 설명

키워드의미
ref 값을 받고 넘김 (기존 값을 수정)
out 값을 넘김만 (초기화 안 해도 됨)
 
csharp
복사편집
void GiveValue(out int x) { x = 10; } GiveValue(out int y); // y는 10이 됨

🔧 컴포넌트 가져올 때 자주 써:

csharp
복사편집
if (TryGetComponent(out Rigidbody rb)) { rb.AddForce(...); }

→ "Rigidbody 컴포넌트가 있다면, rb에 넣어줘"


✅ 37. Coroutine은 비동기처럼 보이지만 사실은 동기 방식

  • Coroutine은 Unity가 시간차를 둬서 처리해주는 거지, 스레드를 나누는 진짜 비동기(Await, Task)가 아님
csharp
복사편집
IEnumerator FadeOut() { yield return new WaitForSeconds(1f); // 1초 쉼 Debug.Log("1초 후 실행"); }

일시정지 + 순차 실행 구조, 진짜 병렬 처리 아님


✅ 38. Vector3 v = new Vector3(3, 0, 4); 의 뜻?

  • v는 3D 좌표 (x=3, y=0, z=4)를 의미하는 벡터야.
  • 즉, 공간상에서 "오른쪽으로 3, 위로 0, 앞으로 4" 만큼 떨어진 위치

✅ 39. abstract class 초딩도 알기 쉽게

"공통된 설계도만 있고, 실제 내용은 자식이 직접 만들어야 함"

csharp
복사편집
public abstract class Animal { public abstract void Speak(); // 자식이 꼭 구현해야 함 } public class Cat : Animal { public override void Speak() { Debug.Log("Meow"); } }

🎓 비유:

Animal은 "동물은 소리를 낼 수 있다"까지만 정의하고,
Cat은 "고양이는 ‘야옹’을 낸다"라고 구체화함


✅ 40. 알고리즘 구조? 로직?

개념의미
로직 문제를 해결하는 행동 흐름 (ex. “1초마다 체력 감소”)
알고리즘 문제 해결을 위한 정해진 절차/공식 (ex. 정렬, 길찾기)
 

✅ 41. 구조 짜는 연습 어떻게?

  1. 자연어로 먼저 말해봐
  2. “플레이어가 점프하고, 땅에 닿으면 다시 점프 가능”
  3. 동사 중심으로 메서드 만들기
  4. csharp
    복사편집
    void Jump(); void OnLanding();
  5. 상태 나누기 (Idle, Jumping, Falling)

→ 연습 주제:

  • 상자 열기 시스템
  • 퀘스트 트리거
  • NPC 대화 구조

✅ 42. 델리게이트 = 콜백?

✔️ 거의 같은 의미로 써.

  • 델리게이트 = 함수 저장소
  • 콜백 = "필요할 때 돌려부르는 함수"
csharp
복사편집
public Action onFinish; onFinish += () => Debug.Log("끝났다!");

✅ 43. 인터페이스를 충돌 처리에 쓰는 이유?

csharp
복사편집
public interface IDamageable { void TakeDamage(float dmg); }
  • IDamageable을 구현한 애만 타격 받게 할 수 있음
csharp
복사편집
if (other.TryGetComponent(out IDamageable target)) { target.TakeDamage(10); }

이름만 맞는 게 아니라, **"그걸 쓸 수 있는 자격이 있는지"**를 체크 가능


✅ 44. UIManager를 싱글톤으로 쓰는 경우?

플레이어가 씬 이동을 해도 UI는 항상 하나만 존재해야 하니까

  • 예: 인벤토리, 체력 UI, 맵 표시
  • DontDestroyOnLoad()로 살아남게 해놓고 → 어떤 씬에서든 UIManager.Instance.OpenInventory() 호출 가능

✅ 45. OnlyUP 같은 게임에서 델리게이트가 애매한 이유?

  • 대부분 UI가 동적으로 활성화되는 게 없음
  • 이벤트보다는 단순한 조건문 처리 (if(거리 < 10) 등)이 많음

그러나:

  • 최대 높이, 남은 HP 같은 건 델리게이트로 UI 갱신에 쓸 수 있어

✅ 46. Unity 단축키: F 키

  • 씬 뷰에서 오브젝트 선택 후 F 누르면 → 자동 포커싱

“카메라야, 내가 지금 선택한 거에 맞춰서 가줘!”


✅ 47. AddListener(() => ...)와 버튼

csharp
복사편집
myButton.onClick.AddListener(() => Debug.Log("눌림"));
  • 익명 함수로 동작 넣기 편함
  • 동적 UI 생성 시 필수

하지만:

  • 정적 UI라면 인스펙터에 함수 드래그해서 넣는 게 더 편함

✅ 48. "가까워지면 if / 멀어지면 비활성화?"는?

  • 거리 계산해서 SetActive(true) / SetActive(false) 처리하는 패턴
csharp
복사편집
if (Vector3.Distance(playerPos, objPos) < 5f) obj.SetActive(true); else obj.SetActive(false);

버튼 2개를 쓰는 이유는 "UI 표시/숨김"을 명확하게 나누고 싶어서


✅ 49. "알고리즘은 검색 딸깍, 에셋 딸깍이면 되지만 구조는 안된다"란?

  • 알고리즘은 “답이 정해진 문제 해결 공식”
  • 구조는 “전체 시스템을 어떻게 설계할지” → 답이 없어

코드 구조 설계는 연습과 패턴 학습이 중요


✅ 50. RayCast와 맵 정보?

Raycast는 “눈앞의 한 줄기”일 뿐 → 전체 맵 구조를 모름

그래서 미로 탐색처럼 "전체 길을 찾아야" 하는 곳에는 부족함


✅ 51. A* (에이스타) 알고리즘 초딩도 알기 쉽게

"가장 빠르고, 가장 짧은 길을 찾아주는 똑똑한 길찾기 알고리즘"

  1. 시작점에서 한 칸씩 이동해보기
  2. 도착점까지의 예상 거리를 기준으로 최적 경로 선택
  3. 뱅뱅 도는 대신, 직선 + 목적지 방향 위주로 움직임

✅ 보너스: A* 적용 방법 (Unity)

  • Grid 만들기
  • 각 셀에 f = g + h 계산
  • OpenList와 ClosedList로 관리
  • 다음에 이동할 칸 = f가 가장 작은 칸

에셋도 있어: A* Pathfinding Project (Aron)