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