-
스파르타3D서바이벌/아이템장착기능/유니티숙련주차게임 개발기록 2024. 6. 4. 18:59
public void OnEquipButton()
{
if (slots[curEquipIndex].equipped)
{
UnEquip(curEquipIndex);
}
slots[selectedItemIndex].equipped = true;
curEquipIndex = selectedItemIndex;
CharacterManager.Instance.Player.equip.EquipNew(selectedItem);
UpdateUI();
SelectItem(selectedItemIndex);
}이라는 함수를 작성 하고 장착 버튼에 등록을 해준다.
if (slots[curEquipIndex].equipped)
{
UnEquip(curEquipIndex);
}라는 코드로 장착을 시도 할 경우에 장착 하고 있던 아이템은 장착 해제 하게 한다. 처음 장착을 할 때는 적용이 안 된다. 그러므로 다음 코드에서 curEquipIndex = selectedItemIndex; 라는 코드를 통해 현재 선택 된 아이템에 Indext를 넣어주고 다음에 장착버튼을 누를 경우에 장착 돼있는 아이템은 해제를 하게 하는 것이다.
그리고 slots[selectedItemIndex].equipped = true; 코드를 사용해서 그 아이템의 equipped 을 true로 바꿔준다. 그리고 CharacterManager.Instance.Player.equip.EquipNew(selectedItem); 를 작성 해준다.
public void EquipNew(ItemData data)
{
UnEquip();
curEquip = Instantiate(data.equipPrefab,equipParent).GetComponent<Equip>();
}
public void UnEquip()
{
if (curEquip != null)
{
Destroy(curEquip.gameObject);
curEquip = null;
}
}EquipNew 함수와 UnEquip 함수. UnEquip함수를 통해서 장착중인 장비가 있다면 파괴 하고 null상태로 만든 다음에 무기를 생성 할 수 있는 상태로 만들어 준다.
그후에 curEquip = Instantiate(data.equipPrefab,equipParent).GetComponent(); 라는 것을 통해 선택한 아이템을 장착 하게 만들어 준다. itemData에는 프리펩을 넣어둔 데이터가 있고 선택한 아이템이 그 프리펩을 저장 하고 있다면 그것을 생성 하는 것이다. 그리고 GetComponent 하는 이유는 그 아이템의 기능들을 사용하기 위함이다. 나중에 장비의 공격모션, 공격력, 공격속도 등등을 참조하기 위해서다.
이 때 UnEquip 함수가 2개 있는 것을 볼 수 있다.(오버로딩) 하나는 장착하고 있던 것을 해제, 하나는 파괴다.
public void OnEquipButton()
{
if (slots[curEquipIndex].equipped)
{
UnEquip(curEquipIndex);
}
slots[selectedItemIndex].equipped = true;
curEquipIndex = selectedItemIndex;
CharacterManager.Instance.Player.equip.EquipNew(selectedItem);
UpdateUI();
SelectItem(selectedItemIndex);
}이 코드대로 실행이 된다면 만약 장착을 하고 있을 경우에 UnEquip()이 2번 호출 된다. 코드의 중복인 것이다.
public void UnEquip()
{
if (curEquip != null)
{
Destroy(curEquip.gameObject);
curEquip = null;
}
}if조건문으로 인해 문제는 없지만 코드의 중복은 피하면 좋다.
어찌 되었든 EquipNew 를 통해서 아이템을 장착 할 수가 있게 되고 EquipNew 를 보면
public void EquipNew(ItemData data)
{
UnEquip();
curEquip = Instantiate(data.equipPrefab,equipParent).GetComponent();
}라고 되어 있다. 여기서 data가 갖고 있는 equipPrefab을 생성을 해서 무기를 장착하게 한다.
여기서 장착 변수 변경은 UnEquip(int index)가 한다. 하나는 장착여부 변경, 하나는 오브젝트 파괴와 생성이다.
아무튼 코드를 이렇게 작성 해주면 우린 버튼을 눌렀을 경우에 아이템을 장착을 할 수 있게 되고, 만약 장착중인 아이템이 있다면 장착을 해제 하고 장착을 누른 것을 다시 장착 하게 할 것이다. 오브젝트는 파괴 후에 다시 생성 하고 화면에 나타낼 것이다. 그런데 파괴와 생성은 별로 좋지 않은데 이 부분도 고안해봐야 할 것 같다.
그리고 해제 버튼이다.
public void OnUnEquipButton()
{
UnEquip(selectedItemIndex);
}함수를 만들고 버튼에 등록 해주면 된다. 그러면 만들어둔 UnEquip함수가 또 실행 되어서 장착여부를 없앨 것이다.
private void UnEquip(int index)
{
slots[index].equipped = false;
CharacterManager.Instance.Player.equip.UnEquip();
UpdateUI();
if(selectedItemIndex == index)
{
SelectItem(selectedItemIndex);
}
}UnEquip 함수. equipped 값을 바꾸고, UnEquip을 호출해서 프리펩을 삭제 하는 것을 볼 수가 있다. 그리고 UdateUI를 호출 해서 아이템슬롯의 정보를 바꾼다. 그리고 SelectItem을 한 번 더 호출 해서 선택 했던 아이템슬롯에 정보를 한 번 더 표시 되게 하는 것을 볼 수가 있다.
public void SelectItem(int index)
{
if (slots[index].item == null) return;
selectedItem = slots[index].item;
selectedItemIndex = index;
selectedItemName.text = selectedItem.displayName;
selectedItemDescription.text = selectedItem.description;
selectedStatName.text = string.Empty;
selectedStatValue.text = string.Empty;
for (int i = 0; i < selectedItehttp://m.consumables.Length; i++)
{
selectedStatName.text += selectedItem.consumables[i].type.ToString() + "\n";
selectedStatValue.text += selectedItem.consumables[i].value.ToString() + "\n";
}
useButton.SetActive(selectedItem.type == ItemType.Consumable);
equipButton.SetActive(selectedItem.type == ItemType.Equipable && !slots[index].equipped);
unequipButton.SetActive(selectedItem.type == ItemType.Equipable && slots[index].equipped);
dropButton.SetActive(true);
}SelectItem 함수.
이제 진짜 마지막으로 InputSystem을 이용한 TAB키를 눌렀을 때 인벤토리창이 나오게 해주면 된다.
public void OnInventory(InputAction.CallbackContext context)
{
if (context.phase == InputActionPhase.Started)라는 코드를 작성해줘서 TAB키가 눌렸을 때 코드가 실행 되게 해주고, 실행 할 코드에 Action을 사용 할 것이다.
public Action inventory; 을 선언 해준다. 왜 여기서 Action을 썻을까. 그건 지금은 모른다. 뭔가 좀 더 편리하기 때문일 것 같긴 하다.
그렇게 하고 코드에
inventory?.Invoke(); 를 추가 해줘서 OnInventory 함수를 만들어 준다.( 나중에 Instpector에서 버튼 함수 등록 하는 거 잊지 말기. 인풋액션 들어가 있는 플레이어에 추가 해야 함)
그리고 이제 이 inventory Action에 함수를 등록을 해줘야 한다. 함수는 UIInventory에서 등록을 해주겠다.
private PlayerController controller;를 만들어 주고 Start에서 GetComponent를 해준다.
그리고 Start에서 controller.inventory += Toggle; 라는 코드를 넣어줘서 시작 할 때 Action에 등록이 되게 해준다. 그리고 이제 Toggle 함수를 만들어준다. Toggle은 껏다 켰다 한다는 기능이란 소리.
public void Toggle()
{
if (IsOpen())
{
inventoryWindow.SetActive(false);
}
else
{
inventoryWindow.SetActive(true);
}
}
public bool IsOpen()
{
return inventoryWindow.activeInHierarchy;
}코드를 이렇게 작성을 해줘서 TAB키를 눌렀을 때 인벤토리 창이 켜졌다 꺼졌다를 구현 할 수 있게 된다.
inventoryWindow는 GameObject형식으로 선언한 변수. activeInHierarchy는 inventoryWindow가 활성화 돼있는지 아닌지 Bool값을 리턴해주는 기능이다. 이 것을 활용해서 켰다 껐다를 반복 하게 할 수가 있게 되는 것이다.
이로써 아이템과 인벤토리를 구현하게 되었다.
'게임 개발기록' 카테고리의 다른 글
게임개발 숙련주차 팀과제/아이템 미리보기 화면 만들기/스파르타 부트캠프 (0) 2024.06.12 스파르타 3D 숙련주차 개인과제 (0) 2024.06.12 스파르타3D서바이벌/아이템사용기능/유니티숙련주차 (0) 2024.06.04 스파르타3D서바이벌게임/Inventory만들기/유니티 숙련주차 (0) 2024.06.04 스파르타3D서바이벌게임 / ItemSlot 만들기 / 유니티숙련주차 (0) 2024.06.04