본문 바로가기

멋쟁이사자처럼 유니티 부트캠프 8회차 추가학습(컴포넌트 접근과 캐릭터 이동)

@salmu2025. 5. 22. 17:52
반응형

[8회 차 수업내용]

1. C#유니티 _ 컴포넌트 

2. 캐릭터 이동

 

1. void 함수 = 반환값이 없는 함수

void SayHello()
{
    Console.WriteLine("Hello!");
}

 

 

<-> 반환타입이 있는 함수 = return을 필요로 함

int Add(int a, int b)
{
    return a + b;
}

 

 

 

1.2. 구문 

GameObject.Find("이름") 이름으로 GameObject 찾기
GameObject.FindGameObjectWithTag("태그") 태그로 GameObject 하나 찾기
obj.transform 오브젝트의 위치/회전/크기 정보 접근

 

[예시]

void Start()
{
    GameObject enemy = GameObject.FindGameObjectWithTag("Enemy");
    if (enemy != null)
    {
        enemy.transform.position = new Vector3(0, 1, 0); // 위치 변경
    }
}

 

"Enemy"라는 태그가 붙은 오브젝트를 찾아서 변수 enemy에 저장

->null일 경우 뒤의 코드를 실행하지 않음 (오류 방지용)

-> 찾은 오브젝트의 위치를 변경

 

 

 

 

 

 

 

1.3 transform에서 자주 쓰는 속성 (Properties)

position 월드 좌표 기준 위치 transform.position = new Vector3(0, 1, 0);
localPosition 부모를 기준으로 한 로컬 위치 transform.localPosition
rotation 월드 좌표 기준 회전 (Quaternion 쿼터니언) transform.rotation = Quaternion.identity;
localRotation 부모 기준 회전 transform.localRotation
eulerAngles XYZ 축 각각의 회전값 (각도 - 오일러) transform.eulerAngles = new Vector3(0, 90, 0);
localScale 오브젝트의 크기(비율) transform.localScale = new Vector3(1, 2, 1);
parent 부모 Transform transform.parent = otherTransform;
childCount 자식의 개수 int count = transform.childCount;

 

 

 

 

 

1.4 오일러 회전과 쿼터니언 회전

항목 오일러 회전 (Euler) 쿼터니언 회전 (Quaternion)
구조 3축 회전 각도 (x, y, z) 4차원 수학적 표현 (x, y, z, w)
복소수 기반 4차원 좌표계
이해하기 쉬움? 쉽다  어렵다
Gimbal Lock 위험 있음 없음
사용 예시 transform.eulerAngles transform.rotation
내부 처리 방식 사용자용 Unity 엔진 내부 회전 계산에 사용

 

 

  • 설정할 땐 Euler: transform.eulerAngles = new Vector3(...)
  • 계산할 땐 Quaternion: Quaternion.Lerp(), Quaternion.LookRotation()

*Gimbal Lock 이란 -회전축이 겹쳐서 방향 제어가 망가지는 상황

 

 

 

 

1.5 인자(Argument)와 매개변수(Parameter)

Parameter (매개변수) 함수를 정의할 때 함수가 받을 값의 자리 void SayHi(string name)
Argument (인자) 함수를 호출할 때 함수에 실제로 넘겨주는 값 SayHi("Alice")

 

void SayHi(string name)   // ← parameter
{
    Console.WriteLine("Hi, " + name);
}

SayHi("Alice");           // ← argument

 

 

1.6 컴포넌트 접근 및 제어

개념 설명 예시 코드
GetComponent<T>() 게임오브젝트에서 특정 타입의 컴포넌트를 가져올 때 사용 GetComponent<MeshRenderer>()
AddComponent<T>() 특정 타입의 컴포넌트를 추가할 때 사용 AddComponent<MeshFilter>()
Destroy()   Destroy(GetComponent<MeshRenderer>());
.material MeshRenderer 등에서 사용하는 재질(Material) 접근 GetComponent<MeshRenderer>().material
.mesh MeshFilter에서 사용하는 3D 모델 메쉬 데이터 접근 GetComponent<MeshFilter>().mesh
.enabled = false 해당 컴포넌트를 비활성화 (렌더링, 스크립트 등 꺼짐) GetComponent<MeshRenderer>().enabled = false;
.enabled = true 해당 컴포넌트를 다시 활성화 GetComponent<MeshRenderer>().enabled = true;
SetActive(false) 오브젝트 전체를 비활성화 (모든 컴포넌트와 자식 포함 작동 중지) gameObject.SetActive(false);
SetActive(true) 오브젝트 전체를 다시 활성화 gameObject.SetActive(true);

 

 

 

*GetComponent<MeshRenderer>() 문법 구조 분해

gameObject.GetComponent<MeshRenderer>()

 

  • gameObject: 현재 오브젝트 (스크립트가 붙은 대상)
  • . (점): 접근 연산자 — 오브젝트에 붙은 기능/함수에 접근할 때 사용
  • GetComponent<>(): Unity에서 제공하는 제네릭 메서드
  • <MeshRenderer>: 컴포넌트 타입을 제네릭으로 명시
  • `() (괄호): 함수를 “실행”하라는 뜻

 

반응형

 

 

 

1.7 transform과 Transform의 차이

Transform 클래스 타입 이름 (대문자) — Unity의 Transform 컴포넌트 타입 정의
= Unity의 Scene 상에서 존재하기 위한 필수 데이터
Transform target;
transform 변수 이름 (소문자) -Unity가 자동으로 제공하는 “미리 설정된 변수" transform.position

 

*

transform은 현재 GameObject에 붙어 있는 Transform 컴포넌트를 참조하는 내장 변수

내부적으로는 
 Transform transform => this.GetComponent<Transform>(); 라고 제공됨

 

 

 

 

1.8 Destroy 함수와 시간적용 

Unity에서 게임 오브젝트, 컴포넌트, 에셋 등을 삭제할 때 사용

Destroy(gameObject, 3f); // 3초 뒤 삭제

*OnDestroy게임 오브젝트가 삭제되는 순간에 호출되는 함수

 

 

 

1.9 기본매개변수 (Default Parameter)

매개변수에 기본값을 미리 지정해 놓는 것

호출할 때 인자를 생략해도 자동으로 그 값이 들어간다

void Greet(string name = "Guest")
{
    Console.WriteLine("Hello, " + name);
}

*Greet 함수에  Guest를 기본매개변수로 설정해놨기 때문에, 인자 전달이 안될 경우 Guest를 기본값으로 출력함

void니까 반환값도 없음! 

 

 

1.10 Instantiate

  • Unity 자체 함수로,
  • 게임 오브젝트나 프리팹을 복제해서 씬에 생성
  • C# 문법이 아니라 Unity API의 일부

[예시] 총알 생성

public GameObject bulletPrefab;

void Shoot()
{
    Instantiate(bulletPrefab, transform.position, transform.rotation);
}

 

 

 

 

1.11 Transform 계층 구조 접근 방법

 

대상 코드 예시 설명
자식 수 transform.childCount 자식 오브젝트 개수 반환
특정 자식 transform.GetChild(0) 첫 번째 자식의 Transform 반환
자식의 자식 transform.GetChild(0).GetChild(1) 첫 번째 자식의 두 번째 자식 접근
부모 오브젝트 transform.parent 바로 위 부모의 Transform 반환
최상위 부모 transform.root 루트(가장 위) Transform 반환
이름 확인 transform.name 또는 .gameObject.name 오브젝트 이름 출력

 

 

*주의 0부터 시작이니까 항상 주의

   Debug.Log($"캐릭터의 첫번째 자식 오브젝트의 이름 : {objTf.GetChild(0).name}");
   Debug.Log($"캐릭터의 마지막 자식 오브젝트의 이름 : {objTf.GetChild(count - 1).name}");

 

 

 

 

 

1.12 오버로딩(Overloading)

같은 함수 이름을 매개변수의 개수나 타입을 다르게 해서 여러 번 정의하는 것같은 함수 

→ 사용자가 전달하는 인자에 따라 적절한 함수가 자동으로 선택

 

 

 

 

 

2.1 Input System(Input Manager)를 활용한 캐릭터 부드러운 이동 코드 분석

public class Movement : MonoBehaviour
 {
     public float moveSpeed = 5f;
     
     void Update()
     {
         // 부드럽게 증감하는 값
         float h = Input.GetAxis("Horizontal");
         float v = Input.GetAxis("Vertical");
         
         // // 딱 떨어지는 값
         // float h = Input.GetAxisRaw("Horizontal");
         // float v = Input.GetAxisRaw("Vertical");
         
         Vector3 dir = new Vector3(h, 0, v);
         Debug.Log($"현재 입력 : {dir}");
         
         transform.position += dir * moveSpeed * Time.deltaTime;
     }
 }

 

 

[분석]

코드 설명
Input.GetAxis("Horizontal") A/D 또는 ←/→ 키의 입력을 -1.0 ~ 1.0 사이의 부드러운 값으로 반환
Input.GetAxis("Vertical") W/S 또는 ↑/↓ 키의 입력을 -1.0 ~ 1.0 사이의 부드러운 값으로 반환
Vector3 dir = new Vector3(h, 0, v); 입력된 방향을 기준으로 이동 방향 벡터 구성 (수평 X축, 수직 Z축)
transform.position += ... 현재 위치에 방향 * 속도 * 시간 을 더해 부드럽게 이동

 

 

 

 

2.2 부드러운 움직임 / 즉시 변화하는 움직임 (GetAxis / GetAxisRaw)

함수 반환 값 범위 움직임 느낌 언제 쓰나
GetAxis -1.0 ~ 1.0 (부드럽게 변화) 부드러운 가속/감속 느낌 자연스러운 이동에 적합
GetAxisRaw -1, 0, 1 (즉시 반응) 바로 꺾이는 느낌 빠른 반응이 필요한 조작 (예: 메뉴 선택 등)

 

*위치 = 현재 위치 + 방향 * 속도 * 시간

Time.deltaTime 덕분에 프레임 수와 무관한 일정한 속도 유지

 

 

잔디가 심어지고 있따 

다음주에 교재를 받는다는데 얼른 받아서 진도를 나가고 싶다

 

 

 

 

반응형
salmu
@salmu :: SMU 각종 기록

목차