본문 바로가기
개발일지

타원 함수

by TypeT 2023. 4. 3.

 

 

오직 승리 게임에서 사용된 타원 함수에 대한 설명입니다.
타원(사거리)에 대상이 존재하는지를 판별하는 역할을 하는 거죠.

공격 가능 영역

    protected bool InEllipse(Transform other)
    {
        _xRadius = unitData.attackRangeRadius * 10;
        _yRadius = _xRadius * 0.5f;
        var localPosition = transform.localPosition;
        var position = other.position;
        var x = position.x;
        var y = position.y;
        var distance = ((x - localPosition.x) * (x - localPosition.x) / (_xRadius * _xRadius)) + ((y - localPosition.y) * (y - localPosition.y) / (_yRadius * _yRadius));
        return distance <= 1;
    }

 

 


대상이 타원 범위 내에 있는지 확인하기 위해
함수 내부에서는 타원의 x, y축 반지름을 이용하여 공격 범위를 계산하고, 해당 위치와 계산된 범위를 비교하여 위치가 타원 범위 내에 있는지 여부를 반환합니다.

이 함수에서, _xRadius와 _yRadius는 각각 타원의 x축 반지름과 y축 반지름을 나타내며, (_yRadius * 0.5f 타원을 만듬)
이 값들은 unitData.attackRangeRadius 값을 이용하여 계산됩니다.

계산 결과값은 10을 곱하여 적절하게 조정됩니다. (유닛 크기를 고려해서 적당히)
또한, localPosition은 현재 객체의 위치를 나타내며, position은 주어진 위치(other)입니다.

이후 x와 y는 position의 x, y 좌표를 의미합니다. 이 함수에서는 distance라는 변수를 이용하여 위치(other)가 타원 범위 내에 있는지 여부를 계산합니다.

계산식은 (x - localPosition.x) * (x - localPosition.x) / (_xRadius * _xRadius)) + ((y - localPosition.y) * (y - localPosition.y) / (_yRadius * _yRadius))로, 위치의 x, y 좌표와 타원의 x, y축 반지름을 이용하여 계산됩니다.


마지막으로, distance가 1 이하인 경우에만 해당 위치가 타원 범위 내에 있는 것으로 판별하고, true 값을 반환합니다.


기즈모로 검증

    private void OnDrawGizmos()
    {
        // Draw the ellipse gizmo
        Gizmos.color = Color.red;
        const float angleStep = 20f; // angle step size for drawing the ellipse
        var prevPoint = Vector3.zero;
        for (float angle = 0; angle < 360; angle += angleStep)
        {
            var localPosition = transform.localPosition;
            var x = localPosition.x + _xRadius * Mathf.Cos(angle * Mathf.Deg2Rad);
            var y = localPosition.y + _yRadius * Mathf.Sin(angle * Mathf.Deg2Rad);
            var currPoint = new Vector3(x, y, 0);
            if (angle > 0)
            {
                Gizmos.DrawLine(prevPoint, currPoint);
            }
            prevPoint = currPoint;
        }
    }

 




해당 함수는 게임에서 유닛 공격 범위를 판정하는 데에 사용되었습니다.
타원 모양으로 범위를 나타내기 위해 타원 함수를 사용하였으며, Collider Trigger가 가끔 씹히는 문제가 있었기 때문에 타원 판정 함수를 만들었습니다. 이를 통해 보다 정확한 유닛 공격 판정이 가능해졌겠죠?

 

댓글