반응형
[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일차 내용으로 정리
반응형
'프로그래밍 > 유니티 부트캠프' 카테고리의 다른 글
| W3Schools C# 개인학습 (Array->Multidimensional Arrays) (0) | 2025.05.26 |
|---|---|
| 멋쟁이사자처럼 유니티 부트캠프 10회차 추가학습 (Transform 이동 회전, 연산자_2D 룰렛 돌리기) (1) | 2025.05.26 |
| 멋쟁이사자처럼 유니티 부트캠프 8회차 추가학습(컴포넌트 접근과 캐릭터 이동) (0) | 2025.05.22 |
| W3Schools C# 개인학습 (WhileLoop->Break & Continue) (0) | 2025.05.21 |
| W3Schools C# 개인학습 (String Concatenation -> Swtich) (0) | 2025.05.21 |