이번 포스트 에서는 아이템 데이터를 작성하는 방법과 아이템 클래스를 만들어서 아이템을 어떤식으로 사용할 것인지 구현하는 부분을 살펴보겠습니다.
먼저 아이템은 총 6가지 종류로 구상했습니다.
1. 무기
2. 방패
3. 헬멧
4. 아머
5. 슈즈
6. 장신구
그리고 각 종류 마다 3개씩의 아이템을 만들계획입니다.
무기 : 검1, 검2, 검3 이런식으로 말이죠.
그리고 각 아이템 마다 다 등급을 5가지를 만들 생각입니다. 노멀, 레어, 유니크, 에픽, 레전드 이렇게 말이죠.
6종류의 아이템에 각각 3가지 아이템 그리고 각 아이템당 5개의 등급을 가진다고 하면 생성되는 아이템 개수는 총 90개가 됩니다.
이를 위해서 가장 먼저 스크립터블 오브젝트 시스템을 이용해서 기본적인 아이템의 데이터 애셋들을 만들계획입니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "Item Data", menuName = "Scriptable Object/Item Data")]
public class Item_ScriptableObject : ScriptableObject
{
public enum ItemType { Weapon, Shield, Helmet, Armor, Shoes, Accessories}
public ItemType itemType; // 아이템 타입
public string itemname; // 아이템 영어 이름
public string koreanName; // 아이템 한글이름
public Sprite icon; // 아이템 아이콘
public int itemPow;//기본적인 아이템 스탯 업 효과
public int LvUP_Rate; // 레벨에 따른 itemPow의 증가 비율
}
스크립터블 오브젝트는 그 안에 삽입된 데이터들이 게임이 플레이동안 변경될시 게임이 끝나도 초기화 되지 않고 계속 변경된 채로 남아있게 됩니다. 그래서 어떤 데이터를 저장하거나 불러오는데 사용할 수는 있지만, 일반적으로 게임속에서 변하지 않는 데이터를 만들어주는 것이 좋습니다. 게임중에 절대 바뀔리 없는 데이터 덩어리를 만든다고 생각하면 좋을 것 같습니다.
그래서 그렇게 절대 변하지 않는 데이터들만 변수로 지정해 주었습니다.
그리고 나서 이제 직접 데이터를 만들어 줍니다.

프로젝트 창에서 마우스 우클릭으로 Create를 누르면 가장 위에 ScriptableObject라는 탭이 생성된 것을 확인할 수 있습니다. 거기서 앞에서 만들어준 ItemData를 클릭하면 프로젝트 창에 스크립터블 오브젝트 애셋이 생성됩니다.

그리고 이 애셋을 클릭하면 인스팩터 창에 데이터를 입력할 수 있게됩니다.

이 애셋을 계속해서 복사하던지 아니면 새롭게 만들던지 해서 자신이 원하는 숫자 만큼의 애셋을 생성한 뒤 각각의 애셋에 아이템 데이터를 입력해 줍니다.
저는 일단 각 타입에 3개씩 총 18개의 애셋을 생성했습니다. 왜냐하면 각각의 아이템에 등급이 추가되는 것은 1개의 기본 데이터를 가지고 각 등급이 올라갈때마다 일정 비율로 스탯이 증가하도록 할 계획이기 때문입니다.
그렇게 아이템 데이터 애셋을 완성했다면 이제 Item 클래스를 만들어 게임 안에서 변하는 변수들을 채워서 완전한 아이템 객체를 만들 준비를 했습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Item
{
public Item_ScriptableObject itemData;
int itemLV;
int MaxLv=20;
public Sprite backGround;
public Sprite slot;
public enum ItemGrade { Nomal, Rare, Unique, Epic, Legend }
public ItemGrade itemGrade;
public bool isGained = false;
public int ItemLv
{
get
{
return itemLV;
}
set
{
if (value > MaxLv)
{
itemLV = MaxLv;
}
else
{
itemLV = value;
}
}
}
public void Setting(Sprite background, Sprite slot)
{
this.backGround = background;
this.slot = slot;
}
int CalItempow()
{
int num=0;
int itempow;
switch (itemGrade)
{
case ItemGrade.Nomal: num = 1;break;
case ItemGrade.Rare: num = 2; break;
case ItemGrade.Unique: num = 3; break;
case ItemGrade.Epic: num = 4; break;
case ItemGrade.Legend: num = 5; break;
}
itempow = itemData.itemPow * num;
return itempow;
}
public int Cal_LevelupPow()// 레벨 업당 올라가는 스탯의 양 계산
{
int pow;
if(itemLV <= 1)//레벨이 1일때 계산
{
pow = CalItempow() * itemLV;
}
else
{
pow = CalItempow() * itemData.LvUP_Rate * itemLV;
//레벨이 2이상일때 계산
}
return pow;
}
}
좀 긴 것 같지만 하나씩 살펴보겠습니다.
public Item_ScriptableObject itemData; //아이템 기본 데이터
int itemLV; // 아이템 레벨
int MaxLv=20; // 아이템 최고 레벨
public int ItemLv // 아이템레벨 프로퍼티
{
get
{
return itemLV;
}
set
{
if (value > MaxLv)
{
itemLV = MaxLv;
}
else
{
itemLV = value;
}
}
}
변수부분 부터 살펴보면 첫번째로 앞에서 만든 스크립터블 오브젝트 애셋을 담는 변수를 선언합니다. 이 안에 각 아이템의 이름과 기본 파워,아이콘 등이 저장되어 있습니다.
그리고 그 다음으로 게임안에서 계속 변하는 아이템 레벨이 있습니다. 최고 레벨은 20으로 설정했습니다.
그 다음으로는 아이템 레벨에 대한 프로퍼티를 만들어 최고 레벨보다 높은 수가 세팅되면 최고레벨로 고정되도록 만들었습니다.
public Sprite backGround;
public Sprite slot;
public enum ItemGrade { Nomal, Rare, Unique, Epic, Legend }
public ItemGrade itemGrade;
public bool IsGained = false;
그 다음은 아이템을 UI나타낼때 아이콘을 제외한 백그라운색과 슬롯 모양은 아이템의 등급에 따라 달라짐으로 백그라운 스프라이트와 슬롯 스프라이트를 변수로 설정해 따로 입력해줄 계획입니다.
그리고 이 아이템의 등급을 enum으로 만들어 itemGrade라는 변수로 설정해 주었습니다.
마지막으로 플레이어캐릭터가 이 아이템을 얻었는지를 표시하기 위해 IsGained라는 bool 변수를 추가 해주었는데, 이변수는 사용하지 않고 나중에 얻은 아이템에 대한 리스트를 따로 만들어 관리하기로 했습니다.
다음으로는 함수들을 살펴보겠습니다.
public void Setting(Sprite background, Sprite slot)
{
this.backGround = background;
this.slot = slot;
}
첫번째 함수는 처음 아이템이 만들어질때 아이템의 백그라운드 스프라이트와 슬롯 스프라이트를 매개변수로 받아 각 변수에 입력해주는 함수입니다.
int CalItempow()
{
int num=0;
int itempow;
switch (itemGrade)
{
case ItemGrade.Nomal: num = 1;break;
case ItemGrade.Rare: num = 2; break;
case ItemGrade.Unique: num = 3; break;
case ItemGrade.Epic: num = 4; break;
case ItemGrade.Legend: num = 5; break;
}
itempow = itemData.itemPow * num;
return itempow;
}
public int Cal_LevelupPow()// 레벨 업당 올라가는 스탯의 양 계산
{
int pow;
if(itemLV <= 1)//레벨이 1일때 계산
{
pow = CalItempow() * itemLV;
}
else
{
pow = CalItempow() * itemData.LvUP_Rate * itemLV;
//레벨이 2이상일때 계산
}
return pow;
}
나머지 두개의 함수는 아이템을 강화해서 레벨이 올라갈때 아이템의 스텟이 올라가는 양을 계산하는 함수입니다.
int CalItempow 함수에는 아이템의 등급마다 올라가는 아이템의 기본 파워를 계산해줍니다. 그리고 retrun되는 정수를
public int Cal_LevelupPow 함수에서 받아서 사용하도록 했습니다.
pow = CalItempow() * itemLV;
pow = CalItempow() * itemData.LvUP_Rate * itemLV;
이런식으로 말이죠.
아무튼 레벨이 올라갈때 올라갈 스탯을 계산하는 함수를 다른 팀원이 사용한다고 하면
int StatUP = (생성 아이템 객채) item. Cal_LevelupPow();
int ATKPow = BasicPow + StatUP;
이런식으로 사용할 수 있을 것 같습니다.
중요한 것은 접근한정자를 잘 설정하는 것인데, 팀원들이 헷갈리지 않게 클래스 안에서 계산할 수 있는 것은 private로 만들고 다른 팀원들이 사용해야하는 부분만 딱 public으로 만들어 한줄이나 두줄로 사용할 수 있게 가공해주는 과정이 중요하다고 생각합니다.
아이템 클래스를 만들때 핵심은 아이템을 사용한다는 부분에서 다른 팀원들이 사용하기 좋게 최대한 만들어 주는 것을 중점적으로 생각해서 만들었습니다.
이제, 이 클래스를 가지고 직접 아이템 객체들을 생성하고, 이 객체들을 다른 팀원들이 사용하기 좋게 가공해주어야 하는 작업이 남아 있는데, 그건 다음 포스트에서 다루도록 하겠습니다.
********************************************************************************************
Item 클래스의 CalItempow() 함수 부분을 좀 더 간편한 코드로 바꿔봤습니다.
int CalItempow()
{
int num=0;
int itempow;
switch (itemGrade)
{
case ItemGrade.Nomal: num = 1;break;
case ItemGrade.Rare: num = 2; break;
case ItemGrade.Unique: num = 3; break;
case ItemGrade.Epic: num = 4; break;
case ItemGrade.Legend: num = 5; break;
}
itempow = itemData.itemPow * num;
return itempow;
}
이건 원본 부분입니다 .
int CalItempow()
{
int num= (int)itemGrade+1;
int itempow = itemData.itemPow * num;
return itempow;
}
이건 바뀐 부분입니다. 간단해 질 수 있었던 이유는 제가 enum 변수데이터를 int 형식의 정수 변환해서 받을 수 있다는 점을 나중에서야 깨달았습니다.
enum 데이터는 따로 정해지 않아도 알아서 인트형식의 번호가 붙는다는 것을 알게 되었습니다.
public enum ItemGrade { Nomal, Rare, Unique, Epic, Legend }
위에서 사용한 ItemGrade의 데이터 순서대로 Nomal =0, Rare=1, Unique=2, Epic=3, Legend =4 이런 식으로 말이죠.
그리고 이러한 enum 데이터의 int 값을 받아서 사용하기 위해서서는 위의 코드와 같이 "(int)enum의 변수" 형태로 사용할 수 있게 됩니다.
int num = (int)itemGrade +1
그래서 num 이라는 int변수에 지금 현재 이 아이템이 가진 등급을 정수 형태로 바꿔서 담습니다.
그런데, 원래 아이템 타입이 가지고 있던 파워에서 등급마다 곱샘을 적용해서 아이템 파워를 올리려고 하면 Nomal의 정수형 데이터가 0 이기 때문에 +1을 해주었습니다.
Nomal 이면 원래 아이템 파워에서 1배가 늘어나고, Rare면 원래 아이템 파워에서 2가 늘어나도록 말이죠.
아무튼 꽤 긴 코드가 짧은 몇줄의 코드로 변환되는 과정도 설명해 보았습니다.
감사합니다.
'유니티 방치형 모바일 게임 팀프로젝트' 카테고리의 다른 글
| 아이템 소환 UI 및 아이템 소환 시스템 (0) | 2024.04.30 |
|---|---|
| 아이템 객체의 생성과 아이템의 사용 구조화 (0) | 2024.04.29 |