2018. 4. 14. 04:05 IT/유니티 Tip & 파헤치기
[unity] 유도탄 만들기 (벡터의 내적, 외적 활용)
벡터의 내적과 외적을 이용한 유도탄 스크립트입니다.
참고사항 - 해당 스크립트를 가진 객체는 발사된 총알(유도탄) 입니다.
매 시간(0.04초)마다 자신의 위치와 목표 위치를 비교하여 각도를 조금씩 트는 스크립트입니다.
IEnumerator followTarget(GameObject _obj) { if (_obj != null) { while (gameObject.activeSelf) { Vector3 target = (_obj.transform.position - transform.position).normalized; // 내적(dot)을 통해 각도를 구함. (Acos로 나온 각도는 방향을 알 수가 없음) float dot = Vector3.Dot(transform.up, target); if (dot < 1.0f) { float angle = Mathf.Acos(dot) * Mathf.Rad2Deg; // 외적을 통해 각도의 방향을 판별. Vector3 cross = Vector3.Cross(transform.up, target); // 외적 결과 값에 따라 각도 반영 if (cross.z < 0) { angle = transform.rotation.eulerAngles.z - Mathf.Min(10, angle); } else { angle = transform.rotation.eulerAngles.z + Mathf.Min(10, angle); } // angle이 윗 방향과 target의 각도. // do someting. } yield return new WaitForSeconds(0.04f); } }else { Debug.Log("Check Target : target is null"); } }
Vector3.Dot - 벡터의 내적을 구하는 함수로, 현재 스크립트에서는 총알의 윗방향(나아가는 방향) 과 목표물 방향의 벡터 사이의 내적을 구하고 있습니다.
- Mathf.Acos(dot) * Mathf.Rad2Deg 를 통해 내적을 각도 값으로 변환합니다.
- 이때 나온 각도는 딱 두 벡터의 각도를 의미합니다. 즉, 기준이 없습니다.
- 예를 들어, up 과 left의 값도 90이고, up과 right의 값도 90입니다.
Vector3.Cross - 벡터의 외적을 구하는 함수로, 현재 스크립트에서는 내적과 마찬가지로 총알의 윗방향과 목표물 방향 벡터 사이의 외적을 구하고 있습니다.
- 내적을 통한 각도값은 기준이 없기때문에 그냥 쓰면 계속 뺑뺑이 돕니다.... 그래서 외적을 통해 회전할 방향을 결정합니다.
- 외적은 두 벡터와 직교하는 하나의 벡터를 구하는 의미로, 같은 두 벡터를 연산하더라도, 순서에 따라( 기준에 따라) 음수나 양수가 나올 수 있습니다. 이를 통해 각도의 방향을 구한 것입니다.
* 아래 영상은 위 코드를 활용해 만들었졌던 유도탄입니다.
'IT > 유니티 Tip & 파헤치기' 카테고리의 다른 글
Firebase 사용기 - 1. 개요 (0) | 2019.05.18 |
---|---|
Unity ECS (Entity Component System) Study - 1. 개요 (5) | 2019.05.18 |
[unity][TIP] 이미지 공유하기 구현- Android N 대응하기 (0) | 2018.05.03 |
[unity][TIP] 유니티 무한루프 또는 튕겼을 때 씬 복구하기. (2) | 2018.04.20 |
[unity] 화면 흔들기 (camera shake) (0) | 2018.04.14 |