내일배움캠프/TIL

[내배캠][Unity6기][TIL] 데이터 로드 리팩토링 (2)

binary는 호남선 2024. 12. 31. 21:29

인간 데이터를 받아올 때 Human과 HumanController, 2개의 클래스에서 모두 데이터를 들고 있는 것이 불필요해 보인다는 피드백을 받았다.

변경해서 사용할 데이터도 아니고 한번 받아오고 변수로 저장해 사용하고 있다.

그래서 Awake 순서만 잘 맞춰서 한쪽에서 로드한 데이터를 다른 쪽에서 초기화하는 방식으로 변경했다.

 

[ 변경 과정 ]

1. Human -> HumanController 로 Awake 순서 조정(컴포넌트 추가 순서 조정, or project setting에서 변경하기)

2. Human의 Awake에서 Data 받아오고 HumanController 연결

3. HumanController의 데이터 세팅

4. HumanController에서 데이터 불러오는 부분 삭제

 

[ 수정 전 ]

public class Human : MonoBehaviour
{
    private DataTable.Human_Data _humanData;
    private int _coin;  // 놀랐을 때 떨어뜨리고 가는 재화량(처치 시 획득 재화량)
    public float MaxFear { get; private set; }
    public int LifeInflicted { get; private set; }
    
    public HumanController controller;
    
    private void Awake()
    {
        // 데이터 세팅
        _humanData = DataManager.Instance.GetHumanByIndex(id);
        MaxFear = _humanData.maxFear;
        _coin = _humanData.coin;
        LifeInflicted = _humanData.lifeInflicted;
        
        if (controller == null)
        {
            controller = gameObject.AddComponent<HumanController>();
        }
    }
 }
public class HumanController : MonoBehaviour
{
    private DataTable.Human_Data _humanData;
    public int id;
    private float _speed;
    public float Cooldown { get; private set; }
    public float MinFatigueInflicted { get; private set; }
    public float MaxFatigueInflicted { get; private set; }
    
    private void Awake()
    {
        // 데이터 세팅
        _humanData = DataManager.Instance.GetHumanByIndex(id);
        _speed = _humanData.speed;
        Cooldown = _humanData.cooldown;
        MinFatigueInflicted = _humanData.minFatigueInflicted;
        MaxFatigueInflicted = _humanData.maxFatigueInflicted;
    }
}

 

[ 수정 후 ]

public class Human : MonoBehaviour
{
    private Human_Data _humanData;
    public int id;
    private int _coin;  // 놀랐을 때 떨어뜨리고 가는 재화량(처치 시 획득 재화량)
    public float MaxFear { get; private set; }
    public int LifeInflicted { get; private set; }
    
    public HumanController controller;

    private void Awake()
    {
        // 데이터 세팅
        _humanData = DataManager.Instance.GetHumanByIndex(id);
        MaxFear = _humanData.maxFear;
        _coin = _humanData.coin;
        LifeInflicted = _humanData.lifeInflicted;
        
        if (controller == null)
        {
            controller = gameObject.AddComponent<HumanController>();
        }
        controller.SetHumanData(_humanData); // 컨트롤러에서 사용하는 데이터 세팅
    }
}
public class HumanController : MonoBehaviour
{
    private float _speed;
    public float Cooldown { get; private set; }
    public float MinFatigueInflicted { get; private set; }
    public float MaxFatigueInflicted { get; private set; }
    
    public void SetHumanData(Human_Data humanData)
    {
        _speed = humanData.speed;
        Cooldown = humanData.cooldown;
        MinFatigueInflicted = humanData.minFatigueInflicted;
        MaxFatigueInflicted = humanData.maxFatigueInflicted;
    }
}