본문 바로가기

멋쟁이사자처럼 유니티부트캠프 9회차 추가학습 (수학과 회전, Unity C#)

@salmu2025. 5. 23. 11:30
반응형

[9회차 수업내용]

1. Unity C# & 게임수학

2. 터렛 회전 실습

3. 태양계 회전 실습

 

1.1 Normalize - 벡터 정규화

: 벡터 방향은 유지하고 길이를 1로 만드는 것 → 방향만 남기고, 크기는 없애는 연산

:방향은 유지하되, 속도(크기)는 별도로 조절하고 싶을 때 사용

 

Vector3 dir = new Vector3(3, 0, 4);
Vector3 norm = dir.normalized;

 

 

 

2.1 회전 - LookAt()

Unity에서 LookAt오브젝트가 특정 방향(또는 위치)을 바라보게 만드는 함수

[예시]

transform.LookAt(transform.position + normalDir);

 

      • LookAt“위치”를 바라보는 함수라서 단순히 방향 벡터만 넣으면 안 되고 현재 위치 + 방향 형태로 “바라볼 목표 위치”를 계산
      • normalDir정규화(normalized) 되어 있어야 정확한 방향이 됨
      • LookAt즉시 회전시킵니다. 부드럽게 돌리고 싶다면 Quaternion.Lerp 또는 Slerp 사용

 

2.2 부드러운 회전 - Quaternion.Slerp /Quaternion.Lerp

void Update()
{
    Vector3 normalDir = new Vector3(1, 0, 0); // 예시: 오른쪽 방향
    Quaternion targetRotation = Quaternion.LookRotation(normalDir); // 바라볼 회전값 계산

    transform.rotation = Quaternion.Slerp(
        transform.rotation,        // 현재 회전값
        targetRotation,            // 목표 회전값
        Time.deltaTime * 5f        // 회전 속도 조절
    );
}

 

[분석]

    • LookRotation()벡터 방향 → 회전값(쿼터니언) 으로 변환하는 함수
    • Quaternion.Slerp(a, b, t) 현재 회전 a에서 목표 회전 b까지 보간 비율 t 부드럽게 회전

 

*lerp slerp 차이

  • Lerp 직선 보간 (단순하고 빠름) 작은 각도의 단순 회전
    Slerp 구면 보간 (더 자연스럽고 정확함) 3D 오브젝트의 자연스러운 방향 전환

 

 

 

2.3 터렛 만들기

뿌쀼뿌쀼뿌ㅃ

 


2.4 Unity Callback (Awake 등)

: Unity가 자동으로 호출해주는 함수

콜백 메서드 언제 호출되나 설명
Awake() 오브젝트가 인스턴스화될 때 가장 먼저 호출됨 (씬에 있으면 플레이 시작 시 실행)
OnEnable() 오브젝트가 활성화될 때 SetActive(true) 시 호출
Start() 처음 Update() 직전 Awake() 다음에 1번 실행됨
Update() 매 프레임마다 호출 게임 로직 처리
FixedUpdate() 고정된 시간 간격으로 호출 물리 엔진 관련 처리 (ex. Rigidbody)
LateUpdate() 모든 Update() 후 호출 따라가는 카메라 등에 사용
OnDisable() 오브젝트가 비활성화될 때 SetActive(false) 시
OnDestroy() 오브젝트가 삭제될 때 Destroy(gameObject) 등으로 제거될 때 호출

 

 

 

2.5 터렛 Lookat + bullet 생성 코드 

using UnityEngine;

public class StudyLookAt : MonoBehaviour
{
    public Transform targetTf;
    public Transform turretHead;

    public GameObject bulletPrefab; // 총알 프리팹
    public Transform firePos; // 발사 위치

    /* ------ 생성 주기 제어 ------ */
    public float timer;
    public float cooldownTime;

    void Start()
    {
        targetTf = GameObject.FindGameObjectWithTag("Player").transform;
    }
    void Update()
    {
        turretHead.LookAt(targetTf);

        /* ------ 타이머 ------ */
        timer += Time.deltaTime;
        if(timer >= cooldownTime)
        {
            timer = 0f;
            Instantiate(bulletPrefab, firePos.position, firePos.rotation);
        }
    }
}

 

[코드 분석]

Time.deltaTime =이전 프레임과 현재 프레임 사이에 흐른 시간(초 단위) / 프레임 독립적 이동

timer 변수에 매 프레임마다 시간 누적 → 현재까지 경과한 시간 저장

누적된 시간이 cooldownTime 이상이 되면 타이머 초기화 → 다음 주기를 기다림

Instantiate 함수 1.10 참고

2025.05.22 - [프로그래밍/유니티 부트캠프] - 멋쟁이사자처럼 유니티 부트캠프 8회차 추가학습(컴포넌트 접근과 캐릭터 이동)

 

 

2.5 총알 발사

void Update()
{
    transform.position += transform.forward * bulletSpeed * Time.deltaTime;
}

 

항목 Vector3.forward transform.forward
의미 월드 좌표계 기준 앞 방향 오브젝트(자기 자신)의 앞 방향
항상 (0, 0, 1) 오브젝트 회전에 따라 달라짐
회전 반영 ❌ 반영 안 됨 ✅ 반영됨
언제 사용? 고정된 방향(예: 항상 z+ 방향으로 이동할 때) 오브젝트가 보는 방향으로 이동 시

 

 

 

 

3. 태양계 회전 만들어보기 

회전은 10일차 내용으로 정리

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

목차