일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- unity게임만들기
- c#프로그래머스기초문법
- 유니티공부
- 시샵
- unity3d게임만들기
- 시샵문법
- 오블완
- unity공부
- C#문법
- C++문법
- c# 백준
- c#문제
- 유니티게임만들기
- c#기본문법
- 유니티3dui
- unity게임
- unity3dservival
- c# c#프로그래머스
- 스파르타
- 유니티상호작용
- 스파르타코딩클럽
- c#
- unity3d
- c#코딩기초트레이닝
- 유니티서바이벌게임만들기
- 유니티
- 티스토리챌린지
- c#코테
- c#기초문법
- Unity
- Today
- Total
나 개발자 진짜 되냐?
[ 12月 17日 ] 오늘 내가 배운 것 _ 66日次 _ 튜터님은 츤데레👏 본문
오늘은
튜터님과 오오오오 오랜 시간 함께하며
나의 숭숭 뚫린 실력구멍이
드러나 부렸다..
모르는 게 너무 많았고..
.. 부족한 게 많았다.
코드 관련 질문에 대해
한마디도 못했다.
모르는 코드를 쓰고 있다는 말씀에
.. 마음이 울적했다.
한창 혼나고
마지막에 제 안부를 걱정해 주셔서
너무 감동받아서 훌쩍였다.
지 선생의 도움은 이래서 너무 많이 받으면 안 된다.
지 선생의 코드와
오늘 내가 고친 코드를 비교해 보는 시간을 가져보자..!
지 선생이 짜준 코드이다.
using UnityEngine;
public class DataManager : Singleton<DataManager>
{
public ItemDataList ItemDB => itemData_List ??= LoadData<ItemDataList, MetaItemDataList>(
"Item",
data => itemData_List.SetData(data.Item)
);
public MonsterDataList MonsterDB => monsterDataList ??= LoadData<MonsterDataList, MonsterDataList>(
"MonsterData",
data => monsterDataList.SetData(data.MonsterData)
);
public PlayerDataList PlayerDB => playerDataList ??= LoadData<PlayerDataList, PlayerDataList>(
"Player",
data => playerDataList.SetData(data.Player)
);
public DungeonDataList DungeonDB => dungeonDataList ??= LoadData<DungeonDataList, DungeonDataList>(
"Dungeon",
data => dungeonDataList.SetData(data.Dungeon)
);
protected override void Awake()
{
base.Awake();
Debug.Log("DataManager Awake 호출됨");
LoadAllData();
}
private void LoadAllData()
{
Debug.Log("모든 데이터 로드 시작");
// 각 데이터 프로퍼티에 접근하여 데이터 로드 실행
var items = ItemDB;
var monsters = MonsterDB;
var players = PlayerDB;
var dungeons = DungeonDB;
Debug.Log("모든 데이터 로드 완료");
}
// 제너릭 메서드: JSON 데이터 로드 및 변환
private T LoadData<T, M>(string resourceKey, System.Action<M> customAction = null) where T : new()
{
TextAsset data = ResourceManager.Instance.LoadAsset<TextAsset>(resourceKey, eAssetType.JsonData);
if (data != null)
{
Debug.Log($"JSON 파일 로드 성공: {resourceKey}");
M MetaDataList = JsonUtility.FromJson<M>(data.text);
if (MetaDataList == null)
{
Debug.LogError($"JSON 파싱 실패: {resourceKey}");
return new T();
}
customAction?.Invoke(MetaDataList);
return (T)(object)MetaDataList;
}
else
{
Debug.LogError($"{resourceKey} 데이터 불러오기 실패");
return new T();
}
}
}
여기서 람다가 또! 쓰이는데
보는 건 쉬운데 또 활용하는 게 굉장히 어렵다.
??=
이 친구가 누구냐!
널이면 실행해라
라는 뜻
근데 이렇게 해주니 문제가 매우 많이 발생했다.
1. 초기화를 안 해주었다.
2. 초기화를 해주면 널값이 아니기 때문에 뒷부분이 실행 안된다.
그래서 심각한 문제 발생
밑에도 문제가 있다.
너무나 당당하게 델리게이트를 썼다.
하지만 이건 정말 나의 큰 실수였다.
잘 모르면서 써서 호되게 혼나 부렸다.
여기의 문제
3. return new T는 순서가 엇갈린다.
초기화가 여기 있으면 매우 논란쓰
이래저래 고쳐보았다.
using UnityEngine;
public class DataManager : Singleton<DataManager>
{
private ItemDataList itemDataList;
public ItemDataList ItemDB => itemDataList ??= LoadData<ItemDataList, MetaItemDataList>("Item", data =>
{
itemDataList = new ItemDataList();
itemDataList.SetData(data.Item);
return itemDataList;
});
private MonsterDataList monsterDataList;
public MonsterDataList MonsterDB => monsterDataList ??= LoadData<MonsterDataList, MonsterDataList>("MonsterData", data =>
{
monsterDataList = new MonsterDataList();
monsterDataList.SetData(data.MonsterData);
return monsterDataList;
});
private PlayerDataList playerDataList;
public PlayerDataList PlayerDB => playerDataList ??= LoadData<PlayerDataList, PlayerDataList>("Player", data =>
{
playerDataList = new PlayerDataList();
playerDataList.SetData(data.Player);
return playerDataList;
});
private DungeonDataList dungeonDataList;
public DungeonDataList DungeonDB => dungeonDataList ??= LoadData<DungeonDataList, DungeonDataList>("Dungeon", data =>
{
dungeonDataList = new DungeonDataList();
dungeonDataList.SetData(data.Dungeon);
return dungeonDataList;
});
protected override void Awake()
{
base.Awake();
Debug.Log("DataManager Awake 호출됨");
LoadAllData();
}
private void LoadAllData()
{
Debug.Log("모든 데이터 로드 시작");
// 각 데이터 프로퍼티에 접근하여 데이터 로드 실행
var items = ItemDB;
var monsters = MonsterDB;
var players = PlayerDB;
var dungeons = DungeonDB;
Debug.Log("모든 데이터 로드 완료");
}
// 제너릭 메서드: JSON 데이터 로드 및 변환
private T LoadData<T,M>(string resourceKey, System.Func<M,T> customAction = null) where T : new()
{
TextAsset data = ResourceManager.Instance.LoadAsset<TextAsset>(resourceKey, eAssetType.JsonData);
if (data != null)
{
Debug.Log($"JSON 파일 로드 성공: {resourceKey}");
M MetaDataList = JsonUtility.FromJson<M>(data.text);
var loadData = customAction.Invoke(MetaDataList);
return loadData;
}
else
{
Debug.LogError($"{resourceKey} 데이터 불러오기 실패");
return default;
}
}
}
고치고 나서 코드이다!
한 시간 반동안
튜터님 자리에서
많이 배웠다.
1. 아까 코드에서 초기화를 람다 안에 넣어주었다.
람다.. 늘 들어도 어렵다.
그리고 그 데이터리스트들을 리턴해주었다.
리턴을 해주니 문제가 생겼다.
Action은 리턴을 해줄 수 없는 친구..!
그래서 우리는
새로운 친구
Func를 사용했다.
이 친구는 리턴이 가능하여
로드 데이터가 가능해졌다.
코드 고치는 게
가장 어려울지도 모르겠다.
'오늘 공부를 정리해봐요!' 카테고리의 다른 글
[ 12月 19日 ] 오늘 내가 배운 것 _ 68日次 _ 오늘은 발표 자료 준비中 (1) | 2024.12.19 |
---|---|
[ 12月 18日 ] 오늘 내가 배운 것 _ 67日次 _ UI는 어려워 (5) | 2024.12.18 |
[ 12月 16日 ] 오늘 내가 배운 것 _ 65日次 _ 쓰리 투 원 대격변! (0) | 2024.12.16 |
[ 12月 13日 ] 오늘 내가 배운 것 _ 64日次 _ JSON을 SO로 바꾸기 (4) | 2024.12.13 |
[ 12月 12日 ] 오늘 내가 배운 것 _ 63日次 (7) | 2024.12.12 |