[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 덕분에 프레임 수와 무관한 일정한 속도 유지

잔디가 심어지고 있따
다음주에 교재를 받는다는데 얼른 받아서 진도를 나가고 싶다
'프로그래밍 > 유니티 부트캠프' 카테고리의 다른 글
| 멋쟁이사자처럼 유니티 부트캠프 10회차 추가학습 (Transform 이동 회전, 연산자_2D 룰렛 돌리기) (1) | 2025.05.26 |
|---|---|
| 멋쟁이사자처럼 유니티부트캠프 9회차 추가학습 (수학과 회전, Unity C#) (0) | 2025.05.23 |
| W3Schools C# 개인학습 (WhileLoop->Break & Continue) (0) | 2025.05.21 |
| W3Schools C# 개인학습 (String Concatenation -> Swtich) (0) | 2025.05.21 |
| 멋쟁이사자처럼 유니티 부트캠프 7회차 추가학습(C#기초 GameObject 접근 / 유니티 ) (0) | 2025.05.21 |