Unity/기능

[Unity] Indexof - 배열 내 특정 요소의 위치 찾기

turbulence93 2025. 5. 29. 20:30

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는 동일한 데이터를 기반으로 생성되었지만 다른 인스턴스이다.
  • 유저가 볼 때 같은 데이터지만 시스템적으로 명확하게 구분을 해줘야 아이템을 찾지 못하는 문제를 방지할 수 있다.