본문 바로가기

멋쟁이사자처럼 유니티 부트캠프 10회차 추가학습 (Transform 이동 회전, 연산자_2D 룰렛 돌리기)

@salmu2025. 5. 26. 16:21
반응형

[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  캐릭터 회전시켜보기

7번 실행 모습

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

 

2025.05.20 - [프로그래밍/유니티 부트캠프] - W3Schools C# 개인 학습 (syntax -> strings) Casting / 연산자 % == != && || ! .

(연산자 내용 참고)

 

 

 

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) — 회전이 전혀 적용되지 않은 상태 (기본 쿼터니언값)
  • 의미: 오브젝트가 초기 방향(회전 없이, 원래 방향)을 가진 상태
  • 자주 초기화나 기본값 설정에 사용
반응형
salmu
@salmu :: SMU 각종 기록

목차