게임엔진/Unity
Unity 외적을 이용해 유도탄 만들기
레옹
2021. 10. 21. 19:55
기존에 사용하던 유도탄 코드
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));
결과