일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 크래프톤 정글
- 전쟁-전투
- C
- TiL
- 알고리즘
- 알고리즘수업-너비우선탐색2
- c#
- Unity
- 오블완
- 크래프톤 정글 4기
- project3
- 이벤트 함수 실행 순서
- BFS
- KRAFTON JUNGLE
- 백준
- 파이썬
- anonymous page
- 티스토리챌린지
- 4기
- 크래프톤정글4기
- 네트워크
- kraftonjungle
- 핀토스
- 추상클래스와인터페이스
- 연결리스트
- User Stack
- 다익스트라
- 크래프톤정글
- pintos
- 유니티
- Today
- Total
말감로그
[Unity] Valley - 식물 로드 버그 수정 본문
저장하고 이어하기 버튼을 누르면 저렇게 타일이 이상하게 설정되고, 해당 에러가 발생했다.
이 에러는 배열의 인덱스를 벗어난 값에 접근하려고 할 때 발생하는 오류이다.
이 오류가 발생한 코드 부분은 SetTilePlantSaveData에서 SetTile을 해주는 부분이었다.
GameManager.instance.tileManager.seedMap.SetTile(position, plantData.growthStagesTiles[currentGrowthStage - 1]);
currentGrowthStage 값이 plantData.growthStagesTiles 배열의 범위를 벗어나면서 오류가 발생했다. currentGrowthStage가 0이거나 growthStagesTiles 배열의 길이보다 크면 해당 인덱스에 접근할 수 없게 되어 오류가 발생하게 된다.
그래서 이 문제를 해결하기 위해 currentGrowthStage의 값이 배열 범위 내에 있는지 확인하는 조건문을 걸어야 된다.
if (currentGrowthStage - 1 >= 0 && currentGrowthStage < plantData.growthStagesTiles.Length)
{
GameManager.instance.tileManager.seedMap.SetTile(position, plantData.growthStagesTiles[currentGrowthStage - 1]);
}
GrowPlant 코루틴 함수에선 조건문을 걸었지만, 이 부분엔 조건문을 거는 걸 놓쳐버려서 난 에러였던 것같당.
그리고 함수 안에서 SetTileState로 로드한 데이터를 tileStates딕셔너리에 추가를 해주었지만, tileStates가 비어 있다는 문제가 발생하면서 로드할 시 물을 줘도 성장하지 못했던 문제가 있었다.
GameManager.instance.tileManager.SetTileState(position, currentState);
이것은 로드하면서 SetTileState 함수가 호출되기 전에 tileStates 딕셔너리에 값을 추가하는 코드가 없었기 때문에 계속 비어있었던 것이다. 그래서 추가하는 코드를 추가해주어 정상적으로 tileState 딕셔너리에 값이 추가되도록 하였다.
public void SetTileState(Vector3Int position, string state)
{
if (tileStates.ContainsKey(position))
{
tileStates[position] = state;
}
else
{
tileStates.Add(position, state);
}
}
새로운 게임 시작 시 초기 아이템 툴바에 장착하기 기능 추가
InventoryManager 스크립트에 startItemAdd() 함수를 생성하여 새로운 게임이 시작할 시 초기화 해주면서 툴바에 아이템을 장착해주게 하였다.
//InventoryManager.cs
public void startItemAdd(string inventoryName)
{
foreach (var item in startItems)
{
inventoryByName[inventoryName].Add(item);
}
}
//GameManager.cs
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name == "InGameScene")
{
if (TitleUIManager.instance.isNewGame)
{
player.inventoryManager.ClearInventory();
plantGrowthManager.ClearPlantSaveData();
inventorySave.DeleteSavedFiles();
player.inventoryManager.startItemAdd("Toolbar");
}
else
{
player.inventoryManager.LoadInventory();
plantGrowthManager.LoadPlantsData();
}
}
}
'TIL' 카테고리의 다른 글
[Unity] Valley - 동물 움직임 제어 (0) | 2024.11.19 |
---|---|
[Unity] Valley - Animated Tile (0) | 2024.11.15 |
[Unity] Valley - 식물 데이터 저장/로드 (새로하기 & 이어하기) (0) | 2024.11.13 |
[Unity] Valley - 인벤토리 저장/로드 (새로하기 &이어하기) (3) | 2024.11.13 |
[Unity] Valley - 인벤토리 저장 & 로드 시스템 (2) | 2024.11.12 |