Item 구현
- 김영호
- 2021년 8월 20일
- 3분 분량
최종 수정일: 2023년 4월 21일
여러가지 Item을 구현하기 위해 가장 기본적인 틀로써 Item을 구현했다.
Item의 기본적인 구조들과, 가상 함수들을 추가하였고, 각각 가상 함수들은 bool Type의 반환을 가지게 해서 추후 만들어질 아이템들에서 Use나 Equip 등을 하게 되었을때 base한번으로 적용 가능한 ItemType인지 검사할 수 있도록 하여 일일히 검사하는 코드를 짜지 않아도 되도록 하였다.
Item.cs
/// <summary>
/// ===================
/// Item Base Construct
/// ===================
///
/// =========
/// Item Type
/// =========
/// Equip (장비)
/// 특징 : Inventory에 최대 한개 씩 들어갈 수 있고, Player가 장착하여 /// 능력치를 얻음
/// Consumable (소모품)
/// 특징 : Inventory에 여러개(품목 당 갯수 지정)가 들어갈 수 있고,
/// 사용하여 능력치를 얻음(사용 시 갯수 감소)
/// Other (기타)
/// 특징 : Inventory에 여러개(품목 당 갯수 지정)가 들어갈 수 있고,
/// 기타 기능(판매 등)에 사용할 수 있음
/// </summary>
public class Item : ScriptableObject
{
public enum ItemType
{
weapon, //무기
armor, //방어구
consumable, //소모품
other //기타
}
public Sprite icon; //아이콘
public ItemType item_Type; //종류
public string item_Name; //이름
public int item_Max; //최대 갯수
public price; //가격
public string item_Tooltip; //아이템 툴팁
//아이템 사용
virtual public bool Use()
{
if(item_Type != ItemType.consumable)
{
Debug.Log("사용 아이템이 아닙니다!");
return false;
}
Debug.Log("아이템 사용!");
return true;
}
//장비 장착
virtual public bool Equip()
{
if(item_Type == ItemType.weapon || item_Type == ItemType.armor )
{
Debug.Log("장비 장착");
return true;
}
Debug.Log("무기, 방어구 아이템이 아닙니다.");
return false;
}
//장비 해제
virtual public bool EquipOff()
{
if(item_Type == ItemType.weapon || item_Type == ItemType.armor )
{
Debug.Log("장비 해제");
return true;
}
Debug.Log("무기, 방어구 아이템이 아닙니다.");
return false;
}
}
Item.cs를 상속받은 스크립트 예시
Item ToolTip
Item ToolTip은 Item의 정보를 보여주기 위한 매체이다.
Item_ToolTip.cs는 Slot에 들어가게 되는 스크립트로 Slot에 Item이 들어있을 시 그 Item 의 ToolTip 문자열을 UI에 업데이트 해준다.
ItemToolTip.cs
public class Item_Tooltip : MonoBehaviour
{
Slot slot; //Item을 담고 있는 Slot
Transform tooltipBox; //UIManager(Singleton class)의 tooltipBox
Object
Text tooltip_Name; //아이템 이름
Text tooltip_Tip; //아이템 팁
Text tooltip_Price; //아이템 가격
void Start()
{
//Get Slot
slot = GetComponent<Slot>();
//Get Tooltip Box
tooltipBox = UIManager.Instance().tooltipBox;
if(tooltipBox != null)
{
//아이템 이름을 표기할 UI GetComponent
tooltip_Name =
tooltipBox.Find("tooltip_Name").GetComponent<Text>();
//아이템 팁을 표기할 UI GetComponent
tooltip_Tip =
tooltipBox.Find("tooltip_Tip").GetComponent<Text>();
//아이템 가격을 표기할 UI GetComponent
tooltip_Pricee =
tooltipBox.Find("tooltip_Price").GetComponent<Text>();
}
}
void PointerEnter()
{
//Slot not have Item then do nothing
if(slot.isEmpty) return;
//Set Tooltip Text
if (tooltip_Name != null)
tooltip_Name.text = slot.item_slot.Peek().item_Name;
if (tooltip_Tip != null)
tooltip_Tip.text = slot.item_slot.Peek().item_Tip;
if (tooltip_Price != null)
tooltip_Price.text = slot.item_slot.Peek().item_Price;
//Tooltip Box On
if(tooltipBox != null)
tooltipBox.gameObject.SetActive(true);
}
void PointerExit()
{
//Slot not have Item then do nothing
if(slot.isEmpty) return;
//Tooltip Box On
if(tooltipBox != null)
tooltipBox.gameObject.SetActive(true);
}
}
PointEnter(), PointerExit()를 각 상황에 맞게 구현하고 Slot에 들어갈 Event Trigger에 연결하여 사용했다.
ToolTip을 보여줄 때 마우스 위치에 따라 UI가 화면 밖으로 나가 가려지게 되는 경우가 발생할 수 있기 때문에 마우스의 위치에 따라 Item ToolTip의 위치를 교정해주는 스크립트가 필요하다고 판단 하여 ToolTipPositioning 스크립트를 새로 추가하였다.
ToolTipBox는 마우스를 중심으로 사분면 중 한 곳에 위치할 것이기 때문에 구현을 할 때도 Vector2를 사용해 계산된 값에 따라 x, y값을 0(우,하) 1(좌,상)으로 표현하고 결과에 맞춰 ToolTipBox의 위치를 조정하였다.
ToolTipPositioning.cs
Item Container
이제 Item을 만들었으니 플레이어가 Item을 획득하게 하기 위한 Object에 Item을 담을 Item Container를 만들었다.
Item Container는 간단하게 회전하는 Animation를 가진 Cube에 World Space로 설정한 Canvas를 달고 그 안에 Image를 넣어 Container에 들어간 Item의 Icon을 불러와 이 Container가 무엇을 포함하고 있는지 보여주도록 하였다.
ItemContainer.cs
public class ItemContainer : MonoBehaviour
{
public Item item;
public Image containerImg;
void Start()
{
if( item != null)
containerImg.sprite = item.icon;
}
void OnTirggerEnter(Collider other)
{
if(other.tag == "Player")
{
//Inventory에 Container가 가지고있는 Item 추가 시도
if(Inventory.Instance().Item.Add(item))
Destroy(gameObject); //추가 성공 시 Container 제거
}
}
}
그 외
장비 아이템의 경우 장착 시 실제 오브젝트가 동적할당되어 실제 모델이 나오게 할 것인데, 이후에 구현될 Player에 무기와 방어구의 스폰 위치를 추가하여 그 GameObject의 자식으로 스폰하게 하였다.
추후에 도입할 Unity_chan의 모델을 사용하면 무기는 봐줄만 했지만 방어구는 어색했기 때문에 Object의 생성 기능은 사용하지 않을 예정이다.
인게임에서의 아이템