+ Item관련 Excel, Json, So 수정 + DropItemTable 로직 수정 + 아이템 프리팹에서 Enable Interaction 체크하면 직접 룻팅, 해제하면 자동 룻팅 + 체력회복 아이템 추가 + 개발자 메뉴 상호작용 "F1" 키를 통해 접근 가능 + 보스 맵은 마법진을 상호작용하면 보스전 시작 + 맵 안에서 교전 중일 때, 투명 벽 쉐이더 추가 + 맵 마다의 통로를 통해서 이동 가능 + 선형적인 맵 구조에 맞게 리소스 및 위치 수정 + 타이틀 화면으로 이동할 때 나타나는 오류 수정(CombatUiManager OnDisable 싱글톤 문제) Closes #25, #26
87 lines
3.1 KiB
C#
87 lines
3.1 KiB
C#
using System.Collections.Generic;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine;
|
|
|
|
namespace BlueWater.Items
|
|
{
|
|
public class ItemManager : Singleton<ItemManager>
|
|
{
|
|
[SerializeField, Required]
|
|
private Item _defaultItemPrefab;
|
|
|
|
[SerializeField, Required]
|
|
private ItemDataSo _itemDataSo;
|
|
private Dictionary<int, ItemData> _itemDictionary;
|
|
|
|
[SerializeField, Required]
|
|
private ItemDropTableSo _itemDropTableSo;
|
|
private Dictionary<int, ItemDropTable> _itemDropTableDictionary;
|
|
|
|
protected override void OnAwake()
|
|
{
|
|
base.OnAwake();
|
|
|
|
Initialize();
|
|
}
|
|
|
|
private void Initialize()
|
|
{
|
|
_itemDictionary = new Dictionary<int, ItemData>(_itemDataSo.ItemDataList.Count);
|
|
foreach (var element in _itemDataSo.ItemDataList)
|
|
{
|
|
_itemDictionary.TryAdd(element.Idx, element);
|
|
}
|
|
|
|
_itemDropTableDictionary = new Dictionary<int, ItemDropTable>(_itemDropTableSo.ItemDropTables.Count);
|
|
foreach (var element in _itemDropTableSo.ItemDropTables)
|
|
{
|
|
_itemDropTableDictionary.TryAdd(element.CharacterData.CharacterIdx, element);
|
|
}
|
|
}
|
|
|
|
public void ItemDropRandomPosition(int idx, Vector3 dropPosition)
|
|
{
|
|
var itemDropTable = GetItemDropTableByIdx(idx);
|
|
if (itemDropTable == null) return;
|
|
|
|
var droppedItemList = itemDropTable.GetDroppedItemList();
|
|
foreach (var element in droppedItemList)
|
|
{
|
|
var newDropPositionX = Random.Range(dropPosition.x - 1f, dropPosition.x + 1f);
|
|
var newDropPositionZ = Random.Range(dropPosition.z - 1f, dropPosition.z + 1f);
|
|
var newDropPosition = new Vector3(newDropPositionX, dropPosition.y, newDropPositionZ);
|
|
|
|
var itemPrefab = _itemDictionary[element.Idx].ItemPrefab;
|
|
if (!itemPrefab)
|
|
{
|
|
itemPrefab = _defaultItemPrefab;
|
|
}
|
|
var instantiateItem = Instantiate(itemPrefab, newDropPosition, Quaternion.identity);
|
|
instantiateItem.Initialize(element);
|
|
instantiateItem.AddForce(Vector3.up * 20f, ForceMode.Impulse);
|
|
}
|
|
}
|
|
|
|
public ItemData GetItemDataByIdx(int idx)
|
|
{
|
|
if (_itemDictionary.TryGetValue(idx, out var itemData)) return itemData;
|
|
|
|
Debug.LogError($"{idx}와 일치하는 아이템이 없습니다.");
|
|
return null;
|
|
}
|
|
|
|
public ItemDropTable GetItemDropTableByIdx(int idx)
|
|
{
|
|
if (idx == 0)
|
|
{
|
|
Debug.Log("ItemDropTable이 비어있습니다.");
|
|
return null;
|
|
}
|
|
|
|
if (_itemDropTableDictionary.TryGetValue(idx, out var itemDropTable)) return itemDropTable;
|
|
|
|
Debug.LogError($"{idx}와 일치하는 아이템이 없습니다.");
|
|
return null;
|
|
}
|
|
}
|
|
} |