From 7b2e8fc55e50b9f1f94364426e71288b32edd15f Mon Sep 17 00:00:00 2001
From: client_Hale <339726288@qq.com>
Date: 星期一, 15 四月 2019 15:29:29 +0800
Subject: [PATCH] 382 客户端掉落逻辑
---
Fight/ClientDropItemUtility.cs | 141 ++++++++++++++++++++++++++++++++++++++---------
1 files changed, 114 insertions(+), 27 deletions(-)
diff --git a/Fight/ClientDropItemUtility.cs b/Fight/ClientDropItemUtility.cs
index d3051bc..d415362 100644
--- a/Fight/ClientDropItemUtility.cs
+++ b/Fight/ClientDropItemUtility.cs
@@ -4,46 +4,133 @@
public class ClientDropItemUtility : Singleton<ClientDropItemUtility>
{
- public void Drop(int[] itemIds)
+ public static UnityEngine.Events.UnityAction<int> OnItemPickup;
+ private const float OFFSET = 1;
+ private int m_TotalDropCount;
+ private int m_DropedCount;
+ private Vector3 m_DropPos;
+ private Vector3 m_Dir;
+ private List<int> m_IndexList = new List<int>();
+
+ private List<DropItem> m_DropItemList = new List<DropItem>();
+
+ public void Update()
{
- var _center = PlayerDatas.Instance.hero.Pos;
- int _count = itemIds.Length;
- int _column = (int)Mathf.Sqrt(_count);
- int _i = 0;
- int _j = 0;
- var _start = _center - Vector3.one * .5f * _column * .5f;
- int _dropCount = 0;
- while (_dropCount < _count)
+ var _hero = PlayerDatas.Instance.hero;
+ if (_hero == null)
{
- var _dropPos = _start + new Vector3(_j * .5f, 0, _i * .5f);
- RaycastHit _hit;
+ return;
+ }
- if (!Physics.Raycast(_dropPos + new Vector3(0, 50, 0), Vector3.down, out _hit, 80, LayerUtility.WalkbleMask))
+ float _dis;
+ DropItem _item;
+ for (int i = m_DropItemList.Count - 1; i >= 0; --i)
+ {
+ _item = m_DropItemList[i];
+ _dis = MathUtility.DistanceSqrtXZ(_item.transform.position, _hero.Pos);
+ if (_dis < .25f)
{
- continue;
- }
+ if (OnItemPickup != null)
+ {
+ OnItemPickup(_item.itemId);
+ }
- DropItem _item = DropItem.Drop(itemIds[_dropCount], _hit.point, CameraController.Instance.CameraObject);
- _dropCount += 1;
- if (_j < _column - 1)
- {
- _j = _j + 1;
- }
- else
- {
- _j = 0;
- _i = _i + 1;
+ Release(_item);
}
}
}
- public void Drop(int itemID, Vector3 position)
+ public void ReleaseAll()
{
-
+ for (int i = m_DropItemList.Count - 1; i >= 0; --i)
+ {
+ Release(m_DropItemList[i]);
+ }
}
- private class ClientDropItem
+ public void Release(DropItem item)
{
+ DropItem.Reycle(item);
+ m_DropItemList.Remove(item);
+ }
+ public void Drop(Vector3 center, int[] itemIds)
+ {
+ if (itemIds == null || itemIds.Length == 0)
+ {
+ return;
+ }
+
+ RaycastHit _hit;
+ if (!Physics.Raycast(center + new Vector3(0, 50, 0),
+ Vector3.down,
+ out _hit,
+ 80,
+ LayerUtility.WalkbleMask))
+ {
+ return;
+ }
+
+ m_IndexList.Clear();
+ m_DropPos = center;
+ m_DropedCount = 0;
+ m_TotalDropCount = itemIds.Length;
+ m_Dir = Vector3.forward;
+
+ DropItem _item = DropItem.Drop(itemIds[m_DropedCount],
+ _hit.point,
+ CameraController.Instance.CameraObject);
+ m_DropItemList.Add(_item);
+ m_DropedCount += 1;
+
+ int _x = Mathf.CeilToInt(m_DropPos.x * 100000);
+ int _z = Mathf.CeilToInt(m_DropPos.z * 10);
+ m_IndexList.Add(_x + _z);
+
+ DropNext(itemIds);
+ }
+
+ public void DropNext(int[] itemIds)
+ {
+ if (m_DropedCount < m_TotalDropCount)
+ {
+ var _nextDir = MathUtility.Rotate90_XZ_CW(m_Dir);
+ var _nextPos = m_DropPos + _nextDir * OFFSET;
+ int _x = Mathf.CeilToInt(_nextPos.x * 100000);
+ int _z = Mathf.CeilToInt(_nextPos.z * 10);
+ int _index = _x + _z;
+
+ if (m_IndexList.Contains(_index))
+ {
+ m_DropPos = m_DropPos + m_Dir * OFFSET;
+
+ _x = Mathf.CeilToInt(m_DropPos.x * 100000);
+ _z = Mathf.CeilToInt(m_DropPos.z * 10);
+ _index = _x + _z;
+ }
+ else
+ {
+ m_Dir = _nextDir;
+ m_DropPos = _nextPos;
+ }
+
+ m_IndexList.Add(_index);
+
+ RaycastHit _hit;
+ if (Physics.Raycast(m_DropPos + new Vector3(0, 50, 0),
+ Vector3.down,
+ out _hit,
+ 80,
+ LayerUtility.WalkbleMask))
+ {
+ DropItem _item = DropItem.Drop(itemIds[m_DropedCount],
+ _hit.point,
+ CameraController.Instance.CameraObject);
+ m_DropItemList.Add(_item);
+ m_DropedCount += 1;
+ }
+
+ DropNext(itemIds);
+ }
}
}
--
Gitblit v1.8.0