Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 벡터
- Unity
- 충돌 알고리즘
- 우분투
- ubuntu
- SOH
- Expanding Polytope Algorithm
- PS
- 문제풀이
- Doubly Connected Edge List
- 외적
- linux
- C
- Vector
- 분할축 이론
- 내적
- uclidean algorithm
- Graham Scan
- 다이나믹 프로그래밍
- 백준
- 보로노이다이어그램
- c#
- 유니티
- 리눅스
- C++
- 알고리즘
- 수학
- AABB
- GJK
- dp
Archives
- Today
- Total
마이 플밍 블로그
Unity 외적을 이용해 유도탄 만들기 본문
기존에 사용하던 유도탄 코드
float dirAngle = transform.rotation.eulerAngles.z;
dirAngle = dirAngle < 0 ? 180 + (180 + dirAngle) : dirAngle;
if (target != null) {
Vector2 targetDir = ((Vector2)target.position - (Vector2)transform.position).normalized;
float targetDirAngle = Mathf.Atan2(targetDir.y, targetDir.x);
targetDirAngle *= Mathf.Rad2Deg;
targetDirAngle = targetDirAngle < 0 ? 180 + (180 + targetDirAngle) : targetDirAngle;
float angleDifferent = targetDirAngle - dirAngle;
angleDifferent = angleDifferent < -180 ? -(-360 - angleDifferent) : angleDifferent;
float dirAngleDifferent = angleDifferent > 180 ? -(360 - angleDifferent) : angleDifferent;
dirAngleDifferent = 0 < dirAngleDifferent ? rotateSpeed : -rotateSpeed;
float saveAngle = dirAngleDifferent * Time.fixedDeltaTime + dirAngle;
transform.rotation = Quaternion.Euler(0, 0, saveAngle);
rigidBody2D.rotation = saveAngle;
float moveDirAngle = transform.rotation.eulerAngles.z * Mathf.Deg2Rad;
moveDir = new Vector2(Mathf.Cos(moveDirAngle), Mathf.Sin(moveDirAngle));
}
Vector2 movePosition = rigidBody2D.position + (moveDir * speed) * Time.fixedDeltaTime;
rigidBody2D.rotation = dirAngle;
rigidBody2D.MovePosition(movePosition);
외적을 이용한 유도탄 코드
Vector2 dir = transform.right;
Vector2 targetDir = target.position - transform.position;
// 바라보는 방향과 타겟 방향 외적
Vector3 crossVec = Vector3.Cross(dir, targetDir);
// 상향 벡터와 외적으로 생성한 벡터 내적
float inner = Vector3.Dot(Vector3.forward, crossVec);
// 내적이 0보다 크면 오른쪽 0보다 작으면 왼쪽으로 회전
float addAngle = inner > 0 ? rotateSpeed * Time.fixedDeltaTime : -rotateSpeed * Time.fixedDeltaTime;
float saveAngle = addAngle + transform.rotation.eulerAngles.z;
transform.rotation = Quaternion.Euler(0, 0, saveAngle);
float moveDirAngle = transform.rotation.eulerAngles.z * Mathf.Deg2Rad;
moveDir = new Vector2(Mathf.Cos(moveDirAngle), Mathf.Sin(moveDirAngle));
결과
'게임엔진 > Unity' 카테고리의 다른 글
[Unity] 구글 스프레드 시트 데이터 연동 방법 (0) | 2021.11.23 |
---|---|
[Unity] Zenject - DI개요(1) (0) | 2021.11.17 |