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에 다른 값이 덮어씌워지므로 데미지 계산에 사용할 때 많은 어려움이 있다.