마이 플밍 블로그

Unity 외적을 이용해 유도탄 만들기 본문

게임엔진/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));

결과

'게임엔진 > Unity' 카테고리의 다른 글

[Unity] 구글 스프레드 시트 데이터 연동 방법  (0) 2021.11.23
[Unity] Zenject - DI개요(1)  (0) 2021.11.17