summaryrefslogtreecommitdiff
path: root/marching/Assets/Scripts/Physics/PhysicsManager.cs
blob: c4e60171f62063421addd658ce1661f0e2d1b14a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
using mh;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

public enum ColliderType
{
    Collider, 
    Hurtbox,
    Hitbox,
}

/// <summary>
/// 四叉树空间划分,优化碰撞检测
/// </summary>
public partial class PhysicsManager : Singleton<PhysicsManager>
{
    #region Quadtrees
    public Vector4 quadtreeCollisionRange { set { m_QuadtreeCollisionRange = value; } }
    private Vector4 m_QuadtreeCollisionRange;
    private Quadtree m_QuadtreeCollision;
    private List<IQuadTreeObject> m_QuadtreeObjColliders = new List<IQuadTreeObject>();

    public Vector4 quadtreeHurtboxRange { set { m_QuadtreeHurtboxRange = value; } }
    private Vector4 m_QuadtreeHurtboxRange;
    private Quadtree m_QuadtreeHurtboxes;
    private List<IQuadTreeObject> m_QuadtreeObjHurtboxes = new List<IQuadTreeObject>();
    #endregion 
    public List<IQuadTreeObject> sharedRetriveResults => m_SharedRetriveResults;
    private List<IQuadTreeObject> m_SharedRetriveResults = new List<IQuadTreeObject>();

    public PhysicsManager() 
    {
        m_QuadtreeCollision = new Quadtree(0, new Vector4(0, 0, 30, 30));
        m_QuadtreeHurtboxes=  new Quadtree(0, new Vector4(0,0, 30, 30));        
    } 

    public void AddCollider(IQuadTreeObject collider)
    {
        m_QuadtreeObjColliders.Add(collider);
    }

    public void RemoveCollider(IQuadTreeObject collider)
    {
        m_QuadtreeObjColliders.Remove(collider);
    }

    public void AddHurtboxes(IQuadTreeObject hurtbox)
    {
        m_QuadtreeObjHurtboxes.Add(hurtbox);
    }

    public void RemoveHurtbox(IQuadTreeObject hurtbox)
    {
        m_QuadtreeObjHurtboxes.Remove(hurtbox);
    }

    public void UpdateQuadtreeCollision()
    {
        m_QuadtreeCollision.Clear(false);
        m_QuadtreeCollision.Rebound(m_QuadtreeCollisionRange);
        for (int i = 0; i < m_QuadtreeObjColliders.Count; i++) 
        { 
            IQuadTreeObject obj = m_QuadtreeObjColliders[i];
            m_QuadtreeCollision.Insert(obj);
        }
    }

    public void UpdateQuadtreeHurtbox()
    {
        m_QuadtreeHurtboxes.Clear(false);
        m_QuadtreeHurtboxes.Rebound(m_QuadtreeHurtboxRange);
        for (int i = 0; i < m_QuadtreeObjHurtboxes.Count; i++)
        {
            IQuadTreeObject obj = m_QuadtreeObjHurtboxes[i];
            m_QuadtreeHurtboxes.Insert(obj);
        }
    }

    public void Update()
    {
        UpdateQuadtreeCollision();
        UpdateQuadtreeHurtbox();
    }

    public void Debug()
    {
        Color c = Gizmos.color;
        Gizmos.color = Color.red;
        m_QuadtreeCollision?.Iterate((t) => {
            Vector3 pos = new Vector3(t.x, t.y, 0);
            Vector3 size = new Vector3(t.w, t.h, 1);
            Gizmos.DrawWireCube(pos, size);
        });
        Gizmos.color = c;
    }

    public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, IQuadTreeObject obj)
    {
        return m_QuadtreeCollision.Retrieve(ref returnObjs, obj);       
    }

    public bool RetriveColliders(ref List<IQuadTreeObject> returnObjs, Vector4 bound)
    {
        return m_QuadtreeCollision.Retrieve(ref returnObjs, bound);
    }

    public bool RetriveHurtboxes(ref List<IQuadTreeObject> returnObjs, Vector4 bound)
    {
        return m_QuadtreeHurtboxes.Retrieve(ref returnObjs, bound);
    }

    public bool RetriveColliders(Vector4 bound)
    {
        m_SharedRetriveResults.Clear();
        return m_QuadtreeCollision.Retrieve(ref m_SharedRetriveResults, bound);
    }

    public bool RetriveHurtboxes(Vector4 bound)
    {
        m_SharedRetriveResults.Clear();
        return m_QuadtreeHurtboxes.Retrieve(ref m_SharedRetriveResults, bound);
    }

    public System.Func<Vector4, bool> GetRetriverByType(ColliderType type)
    {
        if (type == ColliderType.Collider)
            return RetriveColliders;
        else if (type == ColliderType.Hurtbox)
            return RetriveHurtboxes;
        else
            return null;
    }

}