using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using KTGMGemClient;
|
using Protobuf;
|
using System;
|
using Core.Utilities;
|
|
/**
|
* 无尽模式掉落管理器
|
* @Author: chenxin
|
* @Date: 2020-10-20 15:37:08
|
*/
|
namespace TowerDefense.Level
|
{
|
public class EndlessDropManager : Singleton<EndlessDropManager>
|
{
|
/// <summary>
|
/// 获得掉落事件
|
/// </summary>
|
public event Action<EndlessDrop> ObtainDropEvent;
|
|
/// <summary>
|
/// 所有掉落列表,其中包括已获得的还有未拾取的掉落
|
/// </summary>
|
public List<EndlessDrop> AllDropList;
|
|
/// <summary>
|
/// 掉落的唯一id
|
/// </summary>
|
private int dropId;
|
|
/// <summary>
|
/// 所有掉落在场景内的物体字典,使用唯一id索引方便查找
|
/// </summary>
|
private Dictionary<int, GameObject> DropObjDic;
|
|
private string dropPath = "UI/Props/EndlessDropEffect";
|
|
/// <summary>
|
/// 自动拾取时间,先统一处理
|
/// </summary>
|
public float AutoPickupTime = 5f;
|
|
/// <summary>
|
/// 掉落半径
|
/// </summary>
|
public float DropRadius { get; set; } = 5f;
|
|
public Canvas canvas;
|
|
// Start is called before the first frame update
|
private void Start()
|
{
|
AllDropList = new List<EndlessDrop>();
|
DropObjDic = new Dictionary<int, GameObject>();
|
allIconLis = new List<FlyImage>();
|
}
|
|
// Update is called once per frame
|
private void Update()
|
{
|
for (int i = 0; i < AllDropList.Count; ++i)
|
{
|
if (AllDropList[i].IsPickupCompleted) continue;
|
|
AllDropList[i].ElapsedTime += Time.deltaTime;
|
|
if (AllDropList[i].ElapsedTime >= AllDropList[i].AutoPickupTime)
|
{
|
EndlessDropReward dropReward = DropObjDic[AllDropList[i].Id].GetComponent<EndlessDropReward>();
|
// dropReward?.OnClick();
|
|
//AllDropList[i].IsPickupCompleted = true;
|
//SafelyCallObtainDrop(AllDropList[i]);
|
//RemoveDrop(AllDropList[i].Id);
|
}
|
}
|
}
|
|
/// <summary>
|
/// 获取一个唯一的掉落id
|
/// </summary>
|
private int GetDropId()
|
{
|
return dropId++;
|
}
|
|
/// <summary>
|
/// 手动拾取了掉落
|
/// </summary>
|
/// <param name="data"></param>
|
public void OnClickDrop(EndlessDrop data)
|
{
|
data.IsPickupCompleted = true;
|
SafelyCallObtainDrop(data);
|
RemoveDrop(data.Id);
|
}
|
|
/// <summary>
|
/// 获得一些掉落
|
/// </summary>
|
/// <param name="list"></param>
|
/// <param name="pos">小怪的世界坐标</param>
|
public void AddDrop(List<reward> list, Vector3 pos)
|
{
|
// for (int i = 0; i < list.Count; ++i)
|
// {
|
// EndlessDrop drop = new EndlessDrop();
|
// drop.Reward = list[i];
|
// drop.Id = GetDropId();
|
// drop.AutoPickupTime = AutoPickupTime;
|
// CreateDrop(drop, pos, list.Count > 0);
|
// AllDropList.Add(drop);
|
// }
|
}
|
|
/// <summary>
|
/// 根据唯一id移除掉落
|
/// </summary>
|
/// <param name="id"></param>
|
private void RemoveDrop(int id)
|
{
|
if (DropObjDic.ContainsKey(id))
|
{
|
Destroy(DropObjDic[id]);
|
DropObjDic.Remove(id);
|
}
|
}
|
|
/// <summary>
|
/// 在场景中创建掉落的icon
|
/// </summary>
|
/// <param name="drop"></param>
|
/// <param name="worldPos">世界坐标</param>
|
/// <param name="isRandom">是否需要随机位置</param>
|
private void CreateDrop(EndlessDrop drop, Vector3 worldPos, bool isRandom = false)
|
{
|
GameObject prefabObj = Resources.Load<GameObject>(dropPath);
|
GameObject obj = Instantiate(prefabObj);
|
EndlessDropReward dropReward = obj.GetComponent<EndlessDropReward>();
|
|
dropReward.DropData = drop;
|
dropReward.SetIcon();
|
|
GameObject mainUI = GameObject.Find("BottomUI");
|
|
Transform mainUITransform = mainUI.transform;
|
obj.transform.SetParent(mainUITransform, false);
|
|
// Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);
|
// Vector2 pos;
|
// RectTransformUtility.ScreenPointToLocalPointInRectangle(mainUITransform as RectTransform, screenPos, Camera.main, out pos);
|
// (obj.transform as RectTransform).anchoredPosition = pos;
|
|
obj.GetComponent<Transform>().SetParent(mainUITransform, true);
|
|
obj.transform.position = worldPos;
|
|
Vector3 offect = obj.GetComponent<RectTransform>().anchoredPosition3D;
|
offect.z = 0;
|
obj.GetComponent<RectTransform>().anchoredPosition3D = offect;
|
// obj.transform.localRotation = Quaternion.identity;
|
// obj.transform.localScale = Vector3.one;
|
|
// if (isRandom)
|
// {
|
// Vector2 p = UnityEngine.Random.insideUnitCircle * DropRadius;
|
// Vector3 pos1 = p.normalized * p.magnitude;
|
// Vector3 objPos = obj.transform.position;
|
// objPos.x += pos1.x;
|
// objPos.z += pos1.y;
|
// obj.transform.position = objPos;
|
// }
|
|
dropReward.PlayParticle();
|
DropObjDic.Add(drop.Id, obj);
|
}
|
|
|
List<FlyImage> allIconLis;
|
public GameObject drapIcon;
|
|
public FlyImage CreateIcon(Transform ts)
|
{
|
for (int i = 0; i < allIconLis.Count; i++)
|
{
|
if (!allIconLis[i].gameObject.activeSelf)
|
{
|
allIconLis[i].gameObject.SetActive(true);
|
return allIconLis[i];
|
}
|
}
|
|
GameObject obj = Instantiate(drapIcon, ts);
|
FlyImage fly = obj.GetComponent<FlyImage>();
|
allIconLis.Add(fly);
|
return fly;
|
|
}
|
|
public void FlyIcon(Transform ts, Sprite sp, Vector3 startP, Vector3 endP, bool useBezier)
|
{
|
StartCoroutine(CreateIcon(ts, sp, startP, endP, useBezier));
|
}
|
|
IEnumerator CreateIcon(Transform ts, Sprite sp, Vector3 startP, Vector3 endP, bool useBezier)
|
{
|
FlyImage fly;
|
|
// for (int i = 0; i < 5; i++)
|
// {
|
// fly = CreateIcon(ts);
|
// fly.SetDestination(sp, startP, endP, useBezier);
|
// }
|
// yield return new WaitForSeconds(0.2f);
|
|
for (int i = 0; i < 15; i++)
|
{
|
fly = CreateIcon(ts);
|
fly.SetDestination(sp, startP, endP, useBezier);
|
yield return new WaitForSeconds(0.01f);
|
|
}
|
|
yield break;
|
}
|
|
/// <summary>
|
/// 调用掉落获得事件
|
/// </summary>
|
/// <param name="data"></param>
|
private void SafelyCallObtainDrop(EndlessDrop data)
|
{
|
if (ObtainDropEvent != null)
|
ObtainDropEvent(data);
|
}
|
|
/// <summary>
|
/// 获得所有已经拾取的掉落
|
/// </summary>
|
public List<EndlessDrop> GetAllObtainedDrop()
|
{
|
List<EndlessDrop> ret = new List<EndlessDrop>();
|
|
for (int i = 0; i < AllDropList.Count; ++i)
|
{
|
if (AllDropList[i].IsPickupCompleted)
|
ret.Add(AllDropList[i]);
|
}
|
|
return ret;
|
}
|
|
/// <summary>
|
/// 检查是否所有的掉落都被拾取
|
/// </summary>
|
public bool CheckAllDropPicked()
|
{
|
for (int i = 0; i < AllDropList.Count; ++i)
|
{
|
if (!AllDropList[i].IsPickupCompleted) return false;
|
}
|
|
return true;
|
}
|
|
/// <summary>
|
/// 拾取所有还未拾取的掉落
|
/// </summary>
|
public void PickUpAllDrop()
|
{
|
for (int i = 0; i < AllDropList.Count; ++i)
|
{
|
if (AllDropList[i].IsPickupCompleted) continue;
|
|
AllDropList[i].IsPickupCompleted = true;
|
SafelyCallObtainDrop(AllDropList[i]);
|
RemoveDrop(AllDropList[i].Id);
|
}
|
}
|
}
|
}
|