티스토리 뷰
오목 검출 알고리즘을 생각하던 중에
문득 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);
}
}
'유니티 > C# Code' 카테고리의 다른 글
Parttern 응용 : Commander (+UniTask) (0) | 2024.09.12 |
---|---|
Mesh Bake를 배웠습니다. (0) | 2024.08.31 |
(Player Input) 캐릭터의 이동 구현 코드 (0) | 2024.07.11 |
GPT >> Application의 path 종류에 대해 설명해줘 (0) | 2024.06.19 |
(학원과제) Array vs List vs ArrayList (0) | 2024.05.20 |