반응형
[10회차 수업내용]
1. 룰렛 돌리기
2. Transform 이동과 회전
3. 연산자
4. 기타 (Unity C#)
1.1 Vector3.forward
- 정확한 값: new Vector3(0, 0, 1)
- 의미: 월드 좌표계 기준으로 “앞쪽(Z+ 방향)“을 의미
(절대방향/월드좌표계)
| Vector3.forward | (0, 0, 1) | 정면 (앞쪽) | 월드 Z+ |
| Vector3.back | (0, 0, -1) | 뒤쪽 | 월드 Z− |
| Vector3.right | (1, 0, 0) | 오른쪽 | 월드 X+ |
| Vector3.left | (-1, 0, 0) | 왼쪽 | 월드 X− |
| Vector3.up | (0, 1, 0) | 위쪽 | 월드 Y+ |
| Vector3.down | (0, -1, 0) | 아래쪽 | 월드 Y− |
*이걸 축으로 회전하면, 오른손 좌표계를 따름 (Unity)
<->
| transform.forward | 오브젝트가 실제로 바라보고 있는 방향 (로컬 Z+) |
1.2 룰렛 클릭/감속 코드
using UnityEngine;
public class RouletteController : MonoBehaviour
{
public float rotSpeed;
public bool isStop; // false
void Start()
{
rotSpeed = 0f;
}
void Update()
{
transform.Rotate(Vector3.forward * rotSpeed); // Z축 기준으로 회전하는 기능
// 마우스 왼쪽 버튼을 눌렀을 때 -> 1번 실행
if (Input.GetMouseButtonDown(0))
{
rotSpeed = 5f;
}
// 키보드 스페이스 버튼을 눌렀을 때 -> 1번 실행
if (Input.GetKeyDown(KeyCode.Space))
{
isStop = true;
}
if (isStop == true)
{
rotSpeed *= 0.98f; // 현재 속도에서 특정 값만큼 줄이는 기능
if (rotSpeed < 0.01f)
{
rotSpeed = 0f;
isStop = false;
}
}
}
}
2.1 캐릭터 회전시켜보기

using UnityEngine;
public class StudyTransform : MonoBehaviour
{
public float moveSpeed = 10f;
public float rotateSpeed = 70f;
void Update()
{
// 1. 월드 좌표계 기준으로 앞으로 이동
transform.position += Vector3.forward * moveSpeed * Time.deltaTime;
// 2. 로컬 좌표계 기준으로 앞으로 이동
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
// 3. 월드 좌표계 기준으로 앞으로 이동
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime, Space.World);
// 4. 월드 좌표계 기준으로 Y축을 따라 회전 (Quaternion 사용)
transform.rotation = Quaternion.Euler(0f, transform.eulerAngles.y + rotateSpeed * Time.deltaTime, 0f);
// 5. 로컬 좌표계 기준으로 Y축 회전 (Rotate 함수)
transform.Rotate(Vector3.up, rotateSpeed * Time.deltaTime); // Space.Self 생략
// 6. 월드 좌표계 기준으로 Y축 회전
transform.Rotate(Vector3.up, rotateSpeed * Time.deltaTime, Space.World);
// 7. 월드 좌표 (0,0,0) 중심으로 Y축을 따라 회전
transform.RotateAround(Vector3.zero, Vector3.up, rotateSpeed * Time.deltaTime);
// 8. 위와 동일한 코드, 벡터를 명시적으로 작성한 버전
transform.RotateAround(new Vector3(0, 0, 0), new Vector3(0, 1, 0), rotateSpeed * Time.deltaTime);
// 9. 오브젝트가 월드 좌표 (0,0,0)을 바라보도록 회전
transform.LookAt(Vector3.zero);
}
}
2.1.3. Transform.Translate 는 월드 좌표 기준으로 사용 가능
- 두 번째 인자는 이 벡터가 어떤 좌표계를 기준으로 해석될지를 결정
- Space.World를 지정하면, 이동 벡터가 월드(세계) 좌표계를 기준으로 해석
2.1.4. Quaternion.Euler
: Unity에서 오일러 각도(Euler angles)를 쿼터니언 회전값으로 변환하는 함수
2.1.5. Rotation과 Rotate
| 항목 | transform.rotation | transform.Rotate() |
| 회전 방식 | 절대 회전 값 직접 설정 | 상대 회전 (누적 회전) |
| 인자 형식 | Quaternion 값 | 회전할 각도(Vector3) 또는 (축, 각도) |
| 회전 기준 | 절대 회전 | 상대 회전 (기존 회전에 더해짐) |
| 주 용도 | 정확한 각도로 고정, 즉시 방향 지정 | 점진적 회전, 애니메이션, 자연스러운 회전 |
| 예시 코드 | transform.rotation = Quaternion.Euler(0, 90, 0); | transform.Rotate(0, 90, 0); |
| 좌표계 지정 | 안됨 (쿼터니언 자체가 회전 정보) | 가능 (Space.Self / Space.World) |
| 내부적으로 | 회전을 덮어씀 (기존 회전 무시) | 기존 회전에서 더함 |
2.1.7 RotateAround()
:특정 위치를 중심으로 공전
+ LookRotation
| 항목 | transform.RotateAround() | Quaternion.LookRotation() |
| 기능 | 특정 위치를 중심으로 공전 (빙글빙글 회전) | 특정 방향을 바라보게 회전 |
| 회전 중심 | 외부 위치(Vector3) | 회전 중심은 자기 자신 |
| 반환값 | 없음 (즉시 회전 수행) | 쿼터니언(Quaternion) 반환 |
| 회전 방식 | 자기 위치를 바꿔가며 회전 | 위치는 그대로, 방향만 바꿈 |
| 좌표계 | 항상 월드 좌표계 기준 | 방향 벡터 기반 (월드/로컬 가능) |
| 예시 용도 | 카메라가 플레이어 주위를 도는 경우 | 캐릭터가 타겟을 바라보게 할 때 |
2.2 transform.localScale
:로컬 좌표계 기준, 즉 부모 오브젝트를 기준으로 한 상대 크기를 설정하거나 가져올 때 사용
// 오브젝트를 가로로 2배, 세로는 그대로, 깊이는 절반 크기로
transform.localScale = new Vector3(2f, 1f, 0.5f);
//모든 축을 2배로 확대
transform.localScale *= 2f;
3. 선행연산자와 후행연산자
| 구분 | 사용법 | 동작 순서 | 예시 결과 |
| 선행 연산자 | ++i | 먼저 값 증가 → 그 값을 사용 | i=5 → a=++i → a=6, i=6 |
| 후행 연산자 | i++ | 먼저 값 사용 → 값 증가 | i=5 → a=i++ → a=5, i=6 |
(연산자 내용 참고)
4.1 OnEnable : 오브젝트가 활성화될 때 자동으로 호출되는 Unity 콜백 함수
1. 씬의 오브젝트가 SetActive(true) 상태면➡ 게임이 시작될 때 자동으로 OnEnable() 실행됨
2. 오브젝트를 끄고 켤 때마다 OnEnable()이 실행 : UI 값 초기화, 리스너 연결 등에 사용
3. 스크립트를 끄고 켰을 때 ➡ 컴포넌트만 껐다 켜도 OnEnable()이 실행됨
4. 풀링(Pooling) 시스템
총알, 적, 이펙트 등을 미리 숨겨놓고 SetActive(true)로 재활용할 때 (생성 비용 줄임)
(정리) 어떨때 쓰는가?
| 상황 | 사용 목적 | 예시 코드 / 설명 |
| 오브젝트 재활성화 시 | 값 초기화 / 타이머 리셋 / UI 초기화 | SetActive(true)로 다시 켰을 때 초기 세팅 |
| UI 메뉴 열릴 때 | 버튼 상태 초기화 / 선택값 초기화 | 메뉴를 켤 때마다 UI 상태 초기화 |
| 풀링 오브젝트 재사용 시 | 총알/이펙트 위치 초기화 | SetActive(true) 시 위치, 속도 등 초기화 |
| 오디오 설정 동기화 | 소리 켜짐 여부, 볼륨 적용 | audio.volume = Settings.volume; |
| 옵저버 등록 | 이벤트 등록 / 리스너 연결 | GameEvents.OnStart += MyMethod; |
| 플레이어 등장 시 설정 | 무기 세팅, 체력 세팅 등 | 씬 전환 후 재등장할 때 초기값 세팅 |
| 테스트용 리셋 기능 | 매 테스트마다 초기화 필요 | 에디터에서 오브젝트 활성화 시 자동 초기화 |
*리스너란 -이벤트가 발생했을 때 실행할 함수
ex)
| 버튼 클릭 | OnStartButtonClicked() |
| 충돌 발생 | OnHitEnemy() |
| 체력 0이 됨 | OnPlayerDied() |
| 스킬 사용 가능됨 | OnSkillReady() |
4.2 UV란?
: 3D 모델의 표면(메시)에 2D 이미지(텍스처)를 입히기 위한 좌표 시스템
- U : 가로축 (X축과 비슷한 개념)
- V : 세로축 (Y축과 비슷한 개념)
3D 좌표: (X, Y, Z)
텍스처 좌표: (U, V)
ex) 사각형 메시(mesh)에 사각형 텍스처를 정확히 1:1 대응시키는 예
Vector2[] uv = new Vector2[]
{
new Vector2(0, 0), // 왼쪽 아래
new Vector2(1, 0), // 오른쪽 아래
new Vector2(1, 1), // 오른쪽 위
new Vector2(0, 1) // 왼쪽 위
};
mesh.uv = uv;
4.3 Quaternion.identity
- 값: (0, 0, 0, 1) — 회전이 전혀 적용되지 않은 상태 (기본 쿼터니언값)
- 의미: 오브젝트가 초기 방향(회전 없이, 원래 방향)을 가진 상태
- 자주 초기화나 기본값 설정에 사용
반응형
'프로그래밍 > 유니티 부트캠프' 카테고리의 다른 글
| 멋쟁이사자처럼 유니티 부트캠프 11회차 추가학습 (배경 횡스크롤과 Material) (0) | 2025.05.27 |
|---|---|
| W3Schools C# 개인학습 (Array->Multidimensional Arrays) (0) | 2025.05.26 |
| 멋쟁이사자처럼 유니티부트캠프 9회차 추가학습 (수학과 회전, Unity C#) (0) | 2025.05.23 |
| 멋쟁이사자처럼 유니티 부트캠프 8회차 추가학습(컴포넌트 접근과 캐릭터 이동) (0) | 2025.05.22 |
| W3Schools C# 개인학습 (WhileLoop->Break & Continue) (0) | 2025.05.21 |