Movement 심화
정규화
h, v를 Input에 따라 그냥 가져오게 되면, 대각선의 경우 앞뒤좌우 이동보다 빠른 속도로 이동해버린다.
따라서 속도를 일정하게 맞추기 위해 정규화 과정을 거쳐준다.
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxisRaw("Vertical");
Vector3 dir = new Vector3(h, 0, v); // 대각선의 경우 더 빠른 속도가 되어버림
Vector3 normalDir = dir.normalized; // 정규화 과정 (-1~1)
Debug.Log($"현재 입력 : {normalDir}");
transform.position += normalDir * moveSpeed * Time.deltaTime;
이동 방향에 보게 하기
LookAt() : 즉시 어떤 위치를 바라보게 하는 함수
transform.LookAt(transform.position + dir); // 지금 위치에서 이동할 위치를 바라보게 함
게임 수학
각도
Degree
일상적으로 사용하는 각의 단위
Radian
반지름의 길이 = 호의 길이
1Rad = 약 57.3도
Mathf 이용 변환
// 각도(Degree) -> 라디안(Radian)
// Mathf.Deg2Rad
// 라디안(Radian) -> 각도(Degree)
// Mathf.Rad2Deg
float degree = 180f;
float rad = degree * Mathf.Deg2Rad;
Degree로만 계산할 시 유니티 상에서 이상한 값이 나올 수도 있기 때문에 라디안으로 변환해서 계산해야한다.
LookAt 실습
실행순서
public class Study_GameObject : MonoBehaviour
{
void Start()
{
CreateAmongus();
}
}
public class Study_LookAt : MonoBehaviour
{
public Transform targetTf;
public Transform turretHead;
void Start()
{
targetTf = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
turretHead.LookAt(targetTf);
}
}
위처럼 Start()에서 캐릭터 생성과 타겟 설정을 한다면 어느쪽이 먼저 실행될 지 알 수 없다.
캐릭터 생성이 타겟 설정보다 나중에 되면 타겟이 Null으로 설정된다.
Awake() : 시스템 주축 세팅
Start() : 서브적인 세팅
(보통 Manager를 만들어서 혼자 Awake를 쓰거나 함)
따라서 아래처럼 수정하면 작동된다.
public class Study_GameObject : MonoBehaviour
{
void Awake() // 또는 OnEnable로 써도 먼저 실행
{
CreateAmongus();
}
}
총알 쏘기
총알 발사
public class Bullet : MonoBehaviour
{
public float bulletSpeed = 100f;
void Update()
{
transform.position += transform.forward * bulletSpeed * Time.deltaTime;
}
}
Timer로 시간 설정
timer로 시간 측정해서 cooldownTime마다 총알 생성(발사)
public float timer;
public float cooldownTime;
void Update()
{
turretHead.LookAt(targetTf);
timer += Time.deltaTime;
if (timer >= cooldownTime)
{
timer = 0f;
Instantiate(bulletPrefab, firePos.position, firePos.rotation); // 총알 생성
}
}
행성 실습
URP 방식 아니라 렌더링 깨지는 경우
머테리얼 선택 후 Edit - Rendering - Materials - Convert Selected Built-in Materials to URP
그리는 구조가 Build-in Rendering Pipeline에서 최근에 URP(Universal Rendering Pipeline)로 바뀜
자전
transform.Rotate(Vector3.up, rotSqeed * Time.deltaTime); // 위쪽 방향의 축 기준으로 회전
공전
public Transform targetPlanet;
public bool isRevolution = false;if (isRevolution)
{
// 공전 기능
transform.RotateAround(targetPlanet.position, Vector3.up, revSpeed * Time.deltaTime);
// (타겟 대상, 회전축, 속도)
}
이렇게 한 경우 달은 지구가 움직이기 때문에 이상한 경로로 움직이게 된다.
지구의 위치를 동기화 받아서 달도 돌아야하기 때문에 지구의 자식이 되어야 한다.
단축키
shift + f : 대상한테 카메라 고정