일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- gamemake
- 꿀벌대모험
- Unity 2D
- 게임제작
- 게임 프로그래밍
- Unity
- 유니티
- CharacterChase
- mapmake
- 보스제작
- BossMake
- StyleGAN2withADA
- Untiy2D
- StableDiffusion
- 대학생
- hack&slash
- Plastic SCM
- Game Maker
- DownFallSequence
- 생성AI
- 유니티2D
- 게임
- 캐릭터추적
- c#
- 개발 후기
- game make
- 게임 개발
- 게임프로그래밍
- Unity2D
- game
- Today
- Total
GameMakeStory
DownFallSequence- 인벤토리 시스템과 아이템 (4) 본문
1. 설계
- 이전 글에서는 Tooltip에 대해서 설명하였다.
https://gamemakestory.tistory.com/8
DwonFallSequence - 인벤토리 시스템과 아이템(3)
1. 설계 이전 글에서는 인벤토리 UI와 인벤토리에 아이템이 들어가도록 GameManger 스크립트를 제작하였다. https://gamemakestory.tistory.com/7 DownFallSequence - 인벤토리 시스템과 아이템 (2) 1. 설계 저번 글에
gamemakestory.tistory.com
이번 글에서는 아이템을 선택하면 추가하도록 제작할 것이고, 인벤토리에서 아이템을 클릭하여 사용할 수 있도록 제작할 예정이다.
왜 아이템을 선택하면 추가하도록 하는 기능이 필요한가?
이유는 본 게임에서 인트로가 지나고 게임 시작할 때 3가지 아이템 중 하나를 고를 수 있으며, 나중에 상점 시스템에 같이 사용해야 하기 때문이다.
또한 인벤토리에서 아이템을 클릭할 수 있도록 하는 이유는 아이템을 사용하기 때문이다.
이번 글에서 개발에 필요한 것들이 무엇이 있는지 살펴보자.
- 아이템 클릭 시스템 제작 (UI, 스크립트)
- 인벤토리 클릭 스크립트 제작
2. 아이템 클릭 스크립트 제작
2-1. 탐색 아이템 UI 제작
인벤토리 UI 제작 글에서 사용한 Grid Layout Group를 사용하였다.
2-2. 아이템 클릭 스크립트
using UnityEngine.EventSystems;
public class ItemButton : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
{
// ... 이하 코드 생략 ...
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
위 코드에서는 MonoBehaviour 말고도 IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler를 사용하였다.
MonoBehaviour는 유니티에서 생성하는 모든 스크립트가 상속받는 기본 클래스라면, MonoBehaviour 옆에 있는 3가지는 마우스 포인터의 이벤트 인터페이스들이라고 보면 된다. 그렇기에 인터페이스를 상속받으려면 오버라이딩을 해야 한다.
마우스 포인터의 이벤트 인터페이스를 사용하는 이유는 2-1. 탐색 아이템 UI 제작을 할 때 UI버튼이 아니라 이미지로만 사용했기 때문이다.
주의사항
위 이벤트는 Canvas의 Graphic Raycaster 컴포넌트에서 Raycast를 쏴주며,
이벤트에 대한 Raycast를 받기 위해서는 UI의 Image안에 있는 Raycast Target이 체크되어 있어야 한다.
또한 일반 오브젝트 같은 경우들은 Collider가 붙어 있어야 한다.
사용한 마우스 이벤트 인터페이스
- IPointerClickHandler - OnPointerClick : 동일 오브젝트에서 포인트를 누르고 뗄 때 호출
- IPointerEnterHandler - OnPointerEnter : 포인터가 오브젝트에 들어갈 때 호출
- IPointerExitHandler - OnPointerExit : 포인터가 오브젝트에서 나올 때 호출
public class ItemButton : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
{
public Item itemData;
public void OnPointerClick(PointerEventData eventData)
{
if(GameManager.instance.items.Count<GameManager.instance.slots.Length)
{
GameManager.instance.AddItem(itemData);
ItemSelect();
}
else
{
Debug.Log("Full!!!!");
}
}
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
OnPointerClick는 위에서 설명했듯이 이미지를 클릭 시 작동되는 이벤트이다.
탐색 아이템 UI 중 하나를 클릭하면 먼저 인벤토리를 검사하여 가득 차있는지 없는지를 검사한다.
인벤토리에 공간이 있으면 아이템을 추가하고 공간이 없으면 넣지 않도록 되어 있다.
public void ItemSelect()
{
GameObject.Find("SelectItemCanvas").transform.Find("ItemSelect").gameObject.SetActive(false);
tooltip.HideTooltip();
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
아이템 선택시 탐색 아이템 UI는 비활성화 되고 tooltip도 숨긴다.
public class ItemButton : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
{
[SerializeField]
private Tooltips tooltip;
public Item itemData;
public void OnPointerEnter(PointerEventData eventData)
{
tooltip.ShowTooltip();
tooltip.UpdateTooltipName(itemData.itemName);
tooltip.UpdateTooltip(itemData.itemDes); //TODO System.text StringBuilder
}
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
마우스 포인터가 이미지 안으로 들어갔을 경우 실행되는 코드이다.
들어가면 tooltip를 실행시키고 탐색 아이템의 이름과 정보를 최신화시킨다.
public class ItemButton : MonoBehaviour, IPointerClickHandler, IPointerEnterHandler, IPointerExitHandler
{
[SerializeField]
private Tooltips tooltip;
public Item itemData;
public void OnPointerExit(PointerEventData eventData)
{
tooltip.HideTooltip();
tooltip.UpdateTooltipName("");
tooltip.UpdateTooltip(""); //CLEAR
}
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
위 코드는 전 코드와 반대되는 코드이다.
마우스 포인터가 나올 시 tootip가 보이지 않도록 실행되는 코드이다.
3. 인벤토리 클릭 스크립트
- 필수 변수
using UnityEngine.EventSystems;
public class ItemUsedButton : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler
{
public int buttonID; //슬롯 버튼 순서
public Item thisItem;
public Tooltips tooltip;
//호감도 아이템
private Item glasses;
private Item loveScout;
public MoveManager moveManager;
public CharaterDialogSystem charaterDialogSystem;
public Selectpop selectpop;
public Selectpop sellSelectPop;
UIManager uIManager;
GameManager gameManager;
TimeManager timeManager;
private void Start()
{
uIManager = GameObject.Find("UIManager").GetComponent<UIManager>();
gameManager = GameObject.Find("GameManager").GetComponent<GameManager>();
timeManager = GameObject.Find("TimeManager").GetComponent<TimeManager>();
}
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
- GetThisItem()
//HELPER FUNCTION to get the items on this button
private Item GetThisItem()
{
for(int i = 0; i <GameManager.instance.items.Count; i++)
{
if(buttonID == i)
{
thisItem = GameManager.instance.items[i];
}
}
if(GameManager.instance.items.Count == 0)
{
thisItem = null;
}
return thisItem;
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
슬롯을 클릭 시 슬롯 안에 있는 아이템이 무엇인지 알려주는 기능을 가진 코드이다.
- Use()
public void Use()
{
// switch문 사용(?) 코드와 UI를 만들고 불러오는 형식으로 만들자
if (thisItem.Inherence == "Gold")
{
uIManager.gold += 500;
}
else if(thisItem.Inherence == "Glasses")
{
//호감도 3번 측정 가능하며 재사용이 불가능하다
GameObject.Find("UICanvas").transform.Find("GlassesFavoriteBtn").gameObject.SetActive(true);
uIManager.Glasses();
}
else if(thisItem.Inherence == "Scroll")
{
//낮은 위험 및 중간 위험을 한번 회피하게 해준다
}
else if (thisItem.Inherence == "Oblivion")
{
#region 호감도 초기화
//호감도 초기화(최악인 상대에게는 안먹힘
if (gameManager.charater == "Liam")
{
if (gameManager.Npc_FP_Man[9] >= 20)
{
gameManager.Npc_FP_Man[9] = 41;
}
}
else if (gameManager.charater == "Beris")
{
if(gameManager.Npc_FP_Man[5]>=20)
{
gameManager.Npc_FP_Man[5] = 41;
}
}
// ... 이하 43개의 if문 생략
}
//이하 17개의 아이템 생략
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
위 코드는 아이템을 사용하는 코드이다.
thisItem를 조사해서 사용하는 것과 맞을 경우에 관련 아이템을 사용하도록 제작한다.
호감도 관련된 아이템을 사용할 시
gameManager에서 조사한 캐릭터들이 캐릭터 이름과 같은 경우 호감도를 수정한다.
- Removed()
public void Removed()
{
Debug.Log(GetThisItem());
GameManager.instance.RemoveItem(GetThisItem());
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
위 코드는 아이템을 인벤토리에서 제거하는 코드이다.
아이템을 사용하거나 제거할 시 사용된다.
- OnPointerEnter(), OnPointerExit()
public void OnPointerEnter(PointerEventData eventData)
{
GetThisItem();
if(thisItem != null)
{
tooltip.ShowTooltip();
tooltip.UpdateTooltipName(thisItem.itemName);
tooltip.UpdateTooltip(thisItem.itemDes); //TODO System.text StringBuilder
}
}
public void OnPointerExit(PointerEventData eventData)
{
if(thisItem != null)
{
tooltip.HideTooltip();
tooltip.UpdateTooltipName("");
tooltip.UpdateTooltip(""); //CLEAR
}
}
본 팀의 게임에 적용된 실제 스크립트 중 일부이다.
아이템 클릭 스크립트에서 사용한 것이랑 같지만 다른 점은 GetThisItem()을 이용하여 무슨 아이템인지 파악하고 아이템이 있을 경우에만 tooltip이 나올 수 있도록 제작이 되었다.
처음에 마우스 이벤트 처리 기능을 몰랐을 경우에는 모두 버튼으로 사용하였다. 하지만 마우스 이벤트를 알게 된 이후로 버튼뿐만 아니라 일반 오브젝트나 이미지 등등 다양한 곳에 이벤트를 편하게 사용하게 되었다.
Raycast를 직접 쏘는 것이 아닌 마우스 이벤트 처리로 다 하기 때문에 코드도 짧아지고 다양한 구성할 수 있도록 해결할 수 있었다.
3. 마치며
- 다음 글에는 UIManager를 제작하여 UI에 대해서 제작하고 설명할 예정이다.
'DownFallSequence(다폴시)' 카테고리의 다른 글
DownFallSequence - 상점(구매) (0) | 2023.07.22 |
---|---|
DownFallSequence - UI 제작 (0) | 2023.07.13 |
DownFallSequence - 인벤토리 시스템과 아이템(3) (0) | 2023.06.23 |
DownFallSequence - 인벤토리 시스템과 아이템 (2) (0) | 2023.06.21 |
DownFallSequence - 인벤토리 시스템과 아이템 (1) (0) | 2023.06.20 |