1. 문제 상황
배열 내 요소룰 Where문으로 필터링 후, 해당 요소가 배열 내 몇 번째 위치에 있는지 알아야 하는 상황이 있었다.
Where은 IEnumerable를 반환하기 때문에 Length나 Count가 없어 for문을 사용할 수 없고,
foreach문은 요소의 정확한 위치를 파악할 수 없어 문제가 발생했다.
2. 해결 방법
- C#에서는 배열에서 특정 요소의 위치를 찾을 수 있게 Array.Indexof 함수를 제공한다.
//inventory 내에서 몇번째에 있는 아이템인지 검사
int slotNum = Array.IndexOf(invenItems, findItem);
- 찾아야 하는 아이템이 배열 요소내 몇번째 있는지 int로 반환해 준다.
- 요소가 존재하지 않으면 -1을 반환한다.
3. 주의 사항
- Indexof는 배열내 동일한 인스턴스가 여러개 있다면 가장 가까운 요소만 반환을 해준다.
- 인벤토리를 관리할 때 아이템을 동일한 인스턴스로 설정하지 않도록 한다.
- 동일한 인스턴스가 여러개 들어있는 경우
ItemInstance a = new ItemInstance(itemData);
invenitems[0] = a;
invenitems[5] = a;
int index = Array.IndexOf(invenItems, a); // 결과: 0 (5는 무시됨)
- 같은 인스턴스로 아이템을 저장하면 뒤쪽에 있는 5번 요소는 찾을 수 없게 된다.
- 같은 데이터지만 다른 인스턴스인 경우
ItemInstance a = new ItemInstance(itemData);
ItemInstance b = new ItemInstance(itemData);
invenitems[0] = a;
int index = Array.IndexOf(invenItems, b); // 결과: -1 (찾지 못함)
- a와 b는 동일한 데이터를 기반으로 생성되었지만 다른 인스턴스이다.
- 유저가 볼 때 같은 데이터지만 시스템적으로 명확하게 구분을 해줘야 아이템을 찾지 못하는 문제를 방지할 수 있다.
'Unity > 기능' 카테고리의 다른 글
| [Unity] StateMachineBehaviour (0) | 2025.06.25 |
|---|---|
| [Unity] 유니티 내장 안개 설정하기 (0) | 2025.06.16 |
| [Unity] eulerAngles와 rotation 차이점 (0) | 2025.05.28 |
| [Unity] Rigidbody의 velocity와 AddForce 차이점 (0) | 2025.05.27 |
| [Unity] Getter와 반환 매서드의 차이점 (0) | 2025.05.26 |