Deff_Dev
[Unity/C#] Predicate를 이용한 중복 제거 랜덤 요소 반환 프레임워크 본문
Predicate
- 반환 값이 반드시 Bool이고 입력 파라미터가 1개인 Delegate이다.
- 반환 타입을 정해야줘야 하는 Func와 달리 Bool 타입으로 고정이기 때문에 사용 목적을 명확하게 전달할 수 있다.
List<int> numbers = new List<int> { -1, 5, 0, -3, 10 };
// Predicate 정의
Predicate<int> isPositive = delegate (int x)
{
return x > 0;
};
// 리스트에서 조건을 만족하는 요소 찾기
int firstPositive = numbers.Find(isPositive);
Console.WriteLine("첫 번째 양수: " + firstPositive);
중복 제거한 랜덤 요소 반환 프레임 워크
HashSet을 이용한 중복제거 코드를 모든 타입의 리스트, 배열이 사용할 수 있도록 프레임워크화 했다.
모든 타입에 대응될 수 있도록 제네릭 메소드로 선언하고 매개 변수로 IList<T>, Count, Predicate<T>를 받는다.
- IList는 배열과 List가 상속받는 인터페이스로 IList를 상속받는 모든 타입에 대응하기 위해서 사용한다.
- Count는 반환되는 요소들의 갯수이다.
- Predicate<T>는 선택적 매개변수로, 중복 제거 시 필요한 조건을 설정하는 데 사용된다.
public static HashSet<T> GetUniqueCollections<T>(IList<T> collection, int count, Predicate<T> predicate = null)
{
HashSet<T> hash = new HashSet<T>();
for (int i = 0; i < count; i++)
{
int rand = Random.Range(0, collection.Count);
if ((predicate == null || predicate(collection[rand])) && !hash.Add(collection[rand]))
{
i--;
}
}
return hash;
}
사용
조건이 없을 때
public Transform[] EnemyWayPoints;
HashSet<Transform> randomPoint = CollectionUtils.GetUniqueCollections(EnemyWayPoints, 2);
중복을 제거한 2개의 요소를 반환한다.
조건이 있을 때
public Transform[] EnemyWayPoints;
HashSet<Transform> randomPoint = CollectionUtils.GetUniqueCollections
(EnemyWayPoints, 2, point => point != EnemyWayPoints[0]);
0 번째 Point 이외의 요소들 중에 중복을 제거한 2개의 요소를 반환한다.
'Unity(유니티) > 유니티 공부' 카테고리의 다른 글
[Unity/C#] 배치 최적화 (CombineMeshes, Terrain to Mesh) (0) | 2024.07.30 |
---|---|
[Unity/C#] Material vs SharedMaterial (0) | 2024.07.27 |
[Unity/C#] 어드레서블 에셋 로드 (0) | 2024.07.11 |
[Unity/C#] 어드레서블 그룹 순서 이슈 해결 (0) | 2024.07.10 |
[Unity/C#] 어드레서블 (Addressable) 사용 (0) | 2024.07.10 |