top of page

BattleStar - 함선정보 - 무기 시스템

  • 작성자 사진: 100 powerun
    100 powerun
  • 2024년 11월 27일
  • 2분 분량

최종 수정일: 2월 27일

8. 무기 정보 - 분류별 무기 정보 확인









1. 무기 정보 UI 코드


사용된 구조


List(리스트)

instance(싱글톤)


Instantiate(동적 생성)

Destroy(오브젝트 파괴)

AddListener(리스너 추가)




LoadWeaponSlotData

아래의 코드는 조건에 따라 객체를 생성합니다. 구조를 따라 일부 조건에 일치하는 내용을 필터링 하고 필터링 된 데이터를 동적으로 객체를 인스턴스화 한 뒤 관리 리스트에 포함시키는 방식으로 동작합니다.


동작

1 - 초기화

ResetData()함수를 통해 기존에 호출되어있거나 할당된 데이터를 초기화 합니다.


2 - 조건 검증과 데이터 순회

가장 상위의 if문을 통해 먼저 enum대분류 조건을 검증 한 뒤 for문을 통해 싱글톤 인스턴스 정보를 조건으로 반복문을 순회합니다.


3 - 조건 검증 후 데이터 동적 객체 생성 및 리스트 관리

반복문 순회 중 해당 인스턴스 내에 조건에 검증된 정보가 존재한다면 새로운 동적생성 후 리스트로 생성된 객체를 관리합니다.



코드 구조


GameManager.instance.currentPlayerData.ownedWeaponCount

게임 메니저 내에 존재하는 데이터는 싱글톤으로 만들었습니다. 해당 데이터는 게임을 플레이 하는 플레이어의 데이터이기 때문에 싱글톤 패턴화를 시켜 관리측면이나 데이터를 불러올 때 용의하게 만들었습니다.


GameObject newSlot = Instantiate(weponSlot, weaponSlotContent.transform);

weaponSlotList.Add(newSlot);

새로운 객체를 조건문에 검증된 데이터 수 만큼 생성한 뒤 해당 객체를 리스트로 관리하게 만들었습니다. 이렇게 생성된 List는 후에 추가적인 데이터를 할당 할 때 순서가 꼬이거나, 순서를 인지하지 못하여 하나의 객체에 여러 데이터가 씌워져 덮어쓰는 일이 없도록 설계했습니다.



LoadWeponData

아래의 코드는 List내에 존재하는 모든 요소를 확인 후 조건에 일치하는 내용을 확인한 뒤 weaponSlotList의 count번째의 요소의 데이터를 ownedWeapon데이터와 해당 데이터의 스프라이트를 가져와 불러오고, 버튼 리스너를 추가해주는 함수 입니다.


동작

1 - 조건문 검증과 List내의 요소 검증

if문을 통해 검증할 데이터를 확인한 후 for문을 이용해 List내의 요소에서 처음 if문과 같은 데이터를 검증합니다.


2 - 데이터 옮겨쓰기

검증된 데이터는 weaponSlotList의 count번째의 요소에 currentPlayerData내의 ownedWeapon자체의 데이터와 내부 요소인 스프라이트를 가져옵니다. 이후 count의 수를 1씩 증가시켜줍니다.


3 - 반복문 종료 후 초기화

모든 ownedWeapon의 요소를 확인했다면 반복문을 종료하고 count를 0으로 초기화 시켜 줍니다.




count

count는 전체 list 요소 중 각각 조건문에서 요구하는 조건에 맞는 내용을 따로 뽑아내기 위해 만든 int형 변수 입니다. for문을 이용해 List의 전체 요소를 확인하기 때문에 i를 지정하기는 힘들고, if문 내에 변수를 만들경우 계속해서 초기화하기 때문에 맨 위에 함수 내에서 선언 후 각 if문의 끝 마다 count를 0으로 만들어 버그를 방지하였습니다.


AddListener(FunctionA);

weaponSlotList의 요소에는 버튼이 존재하며 이 버튼에 리스너를 추가하는 함수 입니다.


AddListner 이외에도 버튼과 관련된 함수

1 - 람다를 이용하여 인자가 있는 함수 추가하기

Button.onClick.AddListener(() => FuncA(5));

람다식을 사용하지 않을경우 코드가 매우 복잡하게 바뀌기 때문에 람다식을 사용하는것이 좋습니다.


2 - RemoveListner로 이벤트 삭제하기

Button.onClick.RemoveListener(FuncA);

Add와는 다르게 리스너를 제거하는 함수로 반복이벤트가 일어나게 하지 않기 위해 사용합니다.



코드가 전체적으로 싱글톤에 많이 의지합니다. 때문에 테스트가 끝났을 당시 다시 일일히 초기화 해야하는 번거로움이 존재하지만 쉽게 데이터를 가져오거나 불러오는 등 개발 난이도를 많이 낮춰주기도 했습니다.





Comments


bottom of page