티스토리 뷰

유니티/C# Code

RaycastAll과 Array.Sort

해충 2024. 8. 31. 02:05

오목 검출 알고리즘을 생각하던 중에

문득 RaycastAll로 검출된 RaycastHit 배열의 요소가

Ray의 시작점으로부터 가까운 순으로 반환되는지 궁금해져서 실험해 봤다.

 

 

생각대로 될 리가 없지 ㅋㅋㅋ 

혹시나 했던 역시나, 뒤죽박죽으로 배열에 담겨 반환되었다.

 

그럼 거리 순으로 정렬하면 어떨까?

 

System.Array.Sort(hits, (hit1, hit2) => hit1.distance.CompareTo(hit2.distance));

 

List를 사용할 때 Sort를 그저 오름차순 정렬에만 사용해서 몰랐는데,

System.Array.Sort는 람다함수와 병행하면

정렬할 수 없는 사용자 정의 객체를

비교 메서드를 사용하여 기준에 따라 정렬할 수 있다.

 

 

7개의 큐브가 거리 순으로 정렬되었다.

 

이것이 Array.Sort의 다양한 오버라이딩 메서드이다.

여기에 사용된 건 사진의 첫 번째 코드인데,

 

매개변수 Comparison<T>이 매개변수 2개를 받는 delegate인 것을 확인할 수 있었다.

 

첫 번째 인자값이 두 번째 인자값보다 작으면 음수 값,

첫 번째 인자값이 두 번째 인자값보다 크면 양수 값,

같으면 0을 반환한다는데 ...

그 반환 값을 인덱스 값으로 사용하는 모양새라면 정렬되는 게 납득이 된다.

 

그리고 RaycastHit 안에 distance라는 게 있는지 이번에 알게 되었다...

 

 

테스트에 사용한 코드는 아래와 같다.

using UnityEngine;
using System;

public class RaycastAllTest : MonoBehaviour
{
    void Start()
    {
        Ray ray = new Ray(transform.position, transform.forward);
        RaycastHit[] hits = Physics.RaycastAll(ray);
        Array.Sort(hits, (hit1, hit2) => hit1.distance.CompareTo(hit2.distance));
        for (int i = 0; i < hits.Length; i++)
        {
            print(hits[i].transform.name);
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawLine(transform.position, transform.forward * 100f);
    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함