Json파일에서 몬스터 방어구 타입을 불러와서 방어구에 tag를 설정해주는 부분에서 계속해서 문자열 비교에 실패하는 일이 발생하였다. 결론부터 말하자면 Json파일을 저장하는 부분에서 몬스터 방어구 타입이 각 줄의 맨 끝에 위치해있는데 그 맨 끝에 공백이 존재하는 점을 간과한 것이다. 이게 심각한 점이 그냥 디버그.로그를 통해서 콘솔 창에 출력하였을 때에는 보이지 않는 공백이라는 점이다. 처음에 “혹시 공백 때문에 비교가 잘 안되는 건가?”라고 생각하고 출력을 통해 보고 넘어갈 정도로 눈치채기 힘들었다.
혹시나 해서 string의 Trim이라는 메소드를 통해서 Json파일에서 넘어온 문자열의 공백을 제거해보니 문자열 비교가 정확하게 작동하는 것을 확인 할 수 있었다.
<aside> 📃 https://blockdmask.tistory.com/361https://blockdmask.tistory.com/361(공백제거 메소드)
</aside>
그래서 StatManager에서 문자열을 Json파일로 만들 때부터 줄의 맨 끝에 존재하는 보이지 않는 공백을 제거해주고 넣어주니 더 깔끔하게 코드가 짜여졌다. 이제 각각의 몬스터가 생성될 때 HP, 공격력, 방어 타입까지 가지고 나오게 되었다.
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class vMonsterStat : MonoBehaviour
{
[HideInInspector]
public Monster mMonster;
static string tagLight = "Armor_Light";
static string tagLeather = "Armor_Leather";
static string tagHeavy = "Armor_Heavy";
static string tagNoArmor = "Untagged";
[SerializeField]
public string HP, ATK, Type_A, Type_D;
private bool isfind = false;
void Start()
{
mMonster = StatManager.Monsters_d[0];
try
{
for (int i = 0; i < StatManager.Monsters_d.Count && !isfind; i++)
{
if (gameObject.name != null && StatManager.Monsters_d[i].Name == gameObject.name)
{
mMonster = StatManager.Monsters_d[i];
HP = mMonster.HP;
ATK = mMonster.ATK;
Type_A = mMonster.Type_A;
Type_D = mMonster.Type_D;
isfind = true;
}
}
}
catch (Exception e)
{
Debug.Log("Error");
}
if (string.Compare(Type_D, tagLight, true) == 0)
{
gameObject.transform.GetChild(0).transform.tag = tagLight;
}
else if(Type_D.Equals("Armor_Heavy"))
{
gameObject.transform.GetChild(0).transform.tag = tagHeavy;
}
else if(Type_D.Equals("Armor_Leather"))
{
gameObject.transform.GetChild(0).transform.tag = tagLeather;
}
else
{
gameObject.transform.GetChild(0).transform.tag = tagNoArmor;
}
}
}
아이템(무기)의 경우 한혁님이 커스터마이징하시고 계신데, 내가 짠 코드 방식과는 달라졌지만 일단은 큰 문제없이 진행되고 있는 것 같다. 특히 내가 static을 통해 전달했던 부분을 다른 방식으로 하신 것 같은데 결과적으로 나 또한 static을 버리게 되었기 때문에 한혁님의 방법이 더 적합한 것 같다.
static을 버린 이유는 각각의 몬스터에 저장이 되는 것이 아니었기 때문이다. 난 그저 앞뒤 생각없이 다른 스크립트에서 변수 참조하는 법만을 찾아보고 제일 간단한 방법으로 진행하였는데 생각해보니 static의 경우 내가 만들어 놓은 객체마다 다른 값이 저장되는 것이 아니라 다른 스크립트에서 참조할 때 (코드는 짧겠지만) 내가 생각한 방향과 다르게 진행될 수 있다는 것을 깨달았다. 그래서 vMonsterStat, vEquipStat(Json파일에서 데이터를 꺼내어 각 오브젝트에 배정하는 스크립트들)의 static을 모두 없애고 데미지 계산할 때 참조하는 형식을 아래와 같이 바꾸었다.
//바뀐 코드
defaultDamage.damageValue = int.Parse(gameObject.GetComponent<vMonsterStat>().ATK);
//기존 코드
defaultDamage.damageValue = int.Parse(vMonsterStat.ATK);
//참조는 쉽지만 생각해보면 계속해서 ATK에 다른 값이 덮어씌워지므로 데미지 계산에 사용할 때 많은 어려움이 있다.