[유니티 프로젝트] 디파짓 시스템 구현 (UI 업데이트 이전)
디파짓 시스템을 위한 메서드를 구현하였는데 그 중간 점검 및 정리
우선 디파짓시스템이란 현재 진행중인 프로젝트 건즈 앤 레이첼스에서 사용하는 일종의 송금 시스템이다.
마을 (기억의 성소) -> 던전 으로 이루어진 게임 플로우에서 던전에서 수금한 골드를 단순히 던전 내부에서만 소비하는 것이 아닌 다음 도전을 위해 일부 손해를 보고 마을로 일부 금액을 보낼수 있는 기능이다.
총 두명의 디파짓 NPC가 존재하며 두명은 기사단원과 도적단원으로 기사단원은 금액의 일정 확률 (스테이지별로 상이) 로 매번 다르지만 확정적으로 송금을 해주지만 도적은 전체 금액 또는 0원을 송금하는 기능을 가진다 (이는 도적단원은 전체 금액을 들고 도망칠수 있다는 설정에서 가져왔다.)
이런 시스템을 위해 UI를 팀원이 제작 infomanager 에서 실질적인 디파짓 기능의 체크를 메서드로 구현하였는데 구현부는 아래와 같다.
/// <summary>
/// 디파짓 메서드 디파짓 성공 금액 성소 지갑에 더함 + 자동 저장 (도적단원 일경우 인자값 true)
/// </summary>
/// <param name="isRouge">도적단원일경우 true</param>
public bool Deposit(bool isRouge = false)
{
var price = this.possessionAmountInfo.dungeonGoldAmount;
if (price < 50) return false;
if (this.possessionAmountInfo.LastDipositList == null)
this.possessionAmountInfo.LastDipositList = new List<int[]>() { new int[2], new int[2], new int[2], new int[2] }; ;
var tempArr = this.possessionAmountInfo.LastDipositList[this.dungeonInfo.CurrentStageInfo - 1];
if (isRouge)
{
var ran = UnityEngine.Random.Range(0, 2);
var finalGold = price * ran;
this.possessionAmountInfo.LastDipositList[this.dungeonInfo.CurrentStageInfo - 1]
= new int[] { tempArr[0] + finalGold, tempArr[1] + price };
this.possessionAmountInfo.goldAmount += finalGold;
}
else
{
var ran = UnityEngine.Random.Range(1, 11) * 0.1f;
var depositGold = price * ran;
var finalGold = (int)Math.Round(depositGold / 10.0f) * 10;
this.possessionAmountInfo.LastDipositList[this.dungeonInfo.CurrentStageInfo - 1]
= new int[] { tempArr[0] + finalGold, tempArr[1] + price };
this.possessionAmountInfo.goldAmount += finalGold;
//Debug.Log(finalGold);
}
this.possessionAmountInfo.dungeonGoldAmount -= price;
//Debug.LogFormat("디파짓 골드 : {0} , 최종 골드 {1}",
// this.possessionAmountInfo.LastDipositList[this.dungeonInfo.CurrentStageInfo - 1][0],
// this.possessionAmountInfo.LastDipositList[this.dungeonInfo.CurrentStageInfo - 1][1]);
this.SavepossessionGoodsInfo();
return true;
}
우선 룰은 이러하다 10의 단위로 끊어서 금액을 반올림 하여 송금하며 송금내역을 스테이지별로 정수 배열 타입의 리스트로 보관한다.
소지금액이 50골드 미만일시 0원을 송금하게 될수 있는걸 대비하여 송금을 못하게 막는다 (bool 값 반환)
만약 로그 일경우 bool 타입 매개변수를 받아 확인하여 처리하며
로그의 경우 100%의 금액을 50%의 확률로 송금, 기사단원의 경우 데이터 테이블을 참조하여 어느정도의 수수료를 가져갈지 정해진다.(해당 부분은 데이터 테이블의 부재로 아직 업데이트 전이다)
이렇게 송금이 끝날시 보내진 금액을 info 클래스에 저장한다.
추가로 스테이지가 끝나고 결과창을 볼수 있는데 모든 스테이지 별로 성공한 디파짓 금액 과 디파짓으로 사용한 금액 , 마지막으로 전체 스테이지 금액을 표시해주기 위해 튜플 객체를 리스트로 반환한다.
여기서 튜플은 제이슨 파일로 직렬화가 불가능 하기에 실제 info 클래스에서는 List<int[]> 타입으로 저장한다
( 반환값이 튜플인 이유는 함께 작업하는 팀원의 구현 사항에 맞췄기 때문이다.)
코드는 아래와 같다.
/// <summary>
/// 디파짓 결과를 튜플 리스트로 반환합니다 [0] : 스테이지별 디파짓 성공한 금액 [1] : 스테이지별 디파짓한 금액
/// </summary>
/// <returns></returns>
public List<Tuple<int,int>> MakeDipositTupleList()
{
var tupleList = new List<Tuple<int,int>>();
var templist = this.possessionAmountInfo.LastDipositList;
for (int i = 0;i < templist.Count;i++)
{
tupleList.Add(new Tuple<int, int>(templist[i][0], templist[i][1]));
}
tupleList.ForEach((x) => Debug.LogFormat("튜플 아이템 1 : {0} 아이템 2 {1}", x.Item1, x.Item2));
return tupleList;
}
추가적으로 UI 연동 및 데이터 연동만 된다면 디파짓도 마무리