0. 서문

복수의 투사체 발사 시 원뿔 모양 방사 로직 구현 간 이슈 경험

1. 문제 원인

기본 방향 벡터에 대해 특정 범위 (e.g. 30도)의 회전 적용에서 문제 발생

1) 회전 축 문제

2) 쿼터니언 변환 문제

2. 해결 방안

1) 회전 축 문제

현재 개발중인 게임은 2차원 게임으로 z축을 중심으로 회전이 이뤄지도록 설정함

 

2) 쿼터니안 변환 문제

회전 변환의 적용 방법으로 두가지를 고려하였다.

1, sin, cos 함수 구현을 통한 회전벡터 구현

2. 내장 함수 활용을 통한 회전벡터 구현

이때, 내장 함수 'Quaternion.AngleAxis'와 'Quaternion.Euler'를 활용하는 방법으로 회전벡터를 구하는 방법을 선택하였다.

 

3. 적용 방법

- e.g. y축 기준 -45도 회전

1. Quaternion.AngleAxis 활용

vector = Quaternion.AngleAxis(-45, Vector3.up) * vector;

2. Quaternion.Euler 활용

transform.rotation = Quaternion.Euler(new Vector(0f, 45f, 0f));

 

- 실제 적용 예시

Vector3 targetPos = GameManager.instance.mPlayer.mScanner.mNearestTarget.position;
Vector3 rootDir = targetPos - GameManager.instance.mPlayer.transform.position;
rootDir = rootDir.normalized;

// 방사형 공격 로직
for (int i = 0; i < GameManager.instance.mWeaponLastData[mId].Projectile; ++i)
{
    Vector3 dir = rootDir;
    if(GameManager.instance.mWeaponLastData[mId].Projectile != 1)
    {
        float rot = 30 * (i / ((float)GameManager.instance.mWeaponLastData[mId].Projectile - 1)) - 15;
        // dir = Quaternion.AngleAxis(rot, Vector3.forward) * dir;
        dir = Quaternion.Euler(0, 0, rot) * dir;
    }
            
    Transform bullet = mWeaponPool.Get().transform; // 부족한 것을 오브젝트 풀로 추가
    bullet.parent = mWeaponPool.transform;
    bullet.position = GameManager.instance.mPlayer.transform.position;
    bullet.rotation = Quaternion.FromToRotation(Vector3.up, dir);
    bullet.GetComponent<Range>().Init(Mathf.RoundToInt(GameManager.instance.mWeaponLastData[mId].Damage), GameManager.instance.mWeaponLastData[mId].Pierce, dir, GameManager.instance.mWeaponLastData[mId].Speed); // -1 is Infinity Per
}

4. 참고 자료

https://discussions.unity.com/t/rotate-a-vector3-direction/14722

https://docs.unity3d.com/kr/2023.2/Manual/class-Transform.html

 

트랜스폼 - Unity 매뉴얼

Transform은 게임 오브젝트의 Position, Rotation, Scale 그리고 부모 지정 상태를 저장합니다.게임 오브젝트에는 항상 트랜스폼 컴포넌트가 첨부되어 있으므로 트랜스폼 컴포넌트 없이는 트랜스폼을 제

docs.unity3d.com

 

https://docs.unity3d.com/ScriptReference/Quaternion.AngleAxis.html

 

Unity - Scripting API: Quaternion.AngleAxis

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

https://docs.unity3d.com/ScriptReference/Quaternion.Euler.html

 

Unity - Scripting API: Quaternion.Euler

Description Returns a rotation that rotates z degrees around the z axis, x degrees around the x axis, and y degrees around the y axis; applied in that order. Description Returns a rotation that rotates z degrees around the z axis, x degrees around the x ax

docs.unity3d.com

 

+ Recent posts