Project_WL/Assets/Script/Info/DropItemInfo.cs

88 lines
2.8 KiB
C#

using System.Collections.Generic;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine;
public class DropItemInfo : MonoBehaviourSingletonTemplate<DropItemInfo>
{
Dictionary<int, List<DropItem>> dic_dropitem = new Dictionary<int, List<DropItem>>();
Dictionary<int, AsyncOperationHandle<GameObject>> dic_Handle = new Dictionary<int, AsyncOperationHandle<GameObject>>();
Dictionary<int, string> dic_addrPath = new Dictionary<int, string>
{
{ 2, "Assets/Res_Addr/Obj/DropItem_Coin.prefab" },
};
List<DropItem> list_dropitems = new List<DropItem>();
private void Start()
{
AddrResourceMgr.Ins.LoadObject<GameObject>(dic_addrPath[2], handle =>
{
if (handle.IsDone && handle.Status == AsyncOperationStatus.Succeeded)
{
dic_Handle.Add(2, handle);
dic_dropitem.Add(2, new List<DropItem> { DSUtil.Get_Clone<DropItem>(dic_Handle[2].Result, transform) });
for (int i = 0; i < 29; i++)
Make_DropItem(2);
}
});
}
DropItem Make_DropItem(int id)
{
var dropitem = DSUtil.Get_Clone<DropItem>(dic_Handle[id].Result, transform);
dropitem.gameObject.SetActive(false);
dic_dropitem[id].Add(dropitem);
return dropitem;
}
public void Drop_DropItem(int itemid, int amount, Vector3 startpos)
{
if (dic_dropitem.ContainsKey(itemid))
{
for (int i = 0; i < dic_dropitem[itemid].Count; i++)
{
var temp = dic_dropitem[itemid][i];
if (!temp.gameObject.activeInHierarchy)
{
temp.Set(itemid, amount, startpos);
break;
}
}
}
else
{
var dropitem = Make_DropItem(itemid);
dropitem.Set(itemid, amount, startpos);
}
}
public List<DropItem> Get_DropItems()
{
list_dropitems.Clear();
foreach (var itemList in dic_dropitem.Values)
{
list_dropitems.AddRange(itemList.FindAll(item => item.gameObject.activeInHierarchy));
}
return list_dropitems;
}
public DropItem Get_NearestDropItem(Vector3 _pos)
{
var items = Get_DropItems();
if (items.Count == 0)
return null;
DropItem nearestItem = items[0];
float minDistance = Vector3.Distance(_pos, nearestItem.transform.position);
foreach (var item in items)
{
float distance = Vector3.Distance(_pos, item.transform.position);
if (distance < minDistance)
{
minDistance = distance;
nearestItem = item;
}
}
return nearestItem;
}
}