Skip to content

Commit 2582b4f

Browse files
Updated Quadtree usage, Fixed in-edtor problems
- Quadtree can now be easily used not only for Unity's GameObjects (with appropriate code hints) - Fixed problems with quadtree not being properly re-initialized after code changes occured
1 parent 84bec44 commit 2582b4f

File tree

9 files changed

+190
-82
lines changed

9 files changed

+190
-82
lines changed

Demo/SampleScene.unity

Lines changed: 50 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Scripts/GameObjectRootNode.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Quadtree.Items;
2+
using UnityEngine;
3+
4+
namespace Quadtree
5+
{
6+
/// <inheritdoc cref="RootNode{TItem}"/>
7+
[ExecuteInEditMode]
8+
[AddComponentMenu("Spatial partitioning/Quadtree/Root node (for GameObjects)")]
9+
public class GameObjectRootNode : RootNode<IGameObjectItem>
10+
{
11+
/// <inheritdoc cref="RootNode{TItem}.Rebuild"/>
12+
[ContextMenu("Rebuild Quadtrees")]
13+
protected new void Rebuild() => base.Rebuild();
14+
}
15+
}

Scripts/GameObjectRootNode.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Scripts/Items/IGameObjectItem.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using UnityEngine;
2+
3+
namespace Quadtree.Items
4+
{
5+
/// <summary>
6+
/// Custom item interface for GameObject quadtree items.
7+
/// </summary>
8+
public interface IGameObjectItem : IItem
9+
{
10+
/// <summary>
11+
/// Returns reference to corresponding game object.
12+
/// </summary>
13+
///
14+
/// <returns>Game object instance.</returns>
15+
GameObject GetGameObject();
16+
}
17+
}

Scripts/Items/IGameObjectItem.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Scripts/Items/IItem.cs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
namespace Quadtree.Items
44
{
55
/// <summary>
6-
///
6+
/// Mandatory interface of any quadtree item.
77
/// </summary>
88
public interface IItem
99
{
@@ -13,12 +13,5 @@ public interface IItem
1313
///
1414
/// <returns>Object box bounds.</returns>
1515
Bounds GetBounds();
16-
17-
/// <summary>
18-
/// Returns reference to corresponding game object.
19-
/// </summary>
20-
///
21-
/// <returns>Game object instance.</returns>
22-
GameObject GetGameObject();
2316
}
2417
}

Scripts/Items/RendererItem.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
namespace Quadtree.Items
44
{
55
/// <summary>
6-
/// Boundaries of this item are determined by present <c>UnityEngine.Renderer</c> component.
6+
/// Boundaries of this quadtree item are determined by present <c>UnityEngine.Renderer</c> component.
77
/// </summary>
8-
[ExecuteAlways]
8+
[ExecuteInEditMode]
99
[DisallowMultipleComponent]
1010
[RequireComponent(typeof(Renderer))]
1111
[AddComponentMenu("Spatial partitioning/Quadtree/Items/Renderer-based Item")]
12-
public class RendererItem : MonoBehaviour, IItem
12+
public class RendererItem : MonoBehaviour, IGameObjectItem
1313
{
1414
//==========================================================================dd==
1515
// MonoBehaviour METHODS
@@ -19,20 +19,34 @@ public class RendererItem : MonoBehaviour, IItem
1919

2020
private void Start()
2121
{
22-
_renderer = GetComponent<Renderer>();
22+
Init();
2323
}
24-
24+
25+
private void OnEnable()
26+
{
27+
if (_renderer == null)
28+
Init();
29+
}
30+
2531
//==========================================================================dd==
2632
// Quadtree ITEM METHODS
2733
//==========================================================================dd==
2834

29-
/// <inheritdoc cref="IItem"/>
35+
/// <summary>
36+
/// Finds and locally stores this <c>GameObject</c>'s <c>Renderer</c> component instance.
37+
/// </summary>
38+
private void Init()
39+
{
40+
_renderer = GetComponent<Renderer>();
41+
}
42+
43+
/// <inheritdoc cref="IGameObjectItem.GetBounds"/>
3044
public Bounds GetBounds()
3145
{
3246
return _renderer.bounds;
3347
}
3448

35-
/// <inheritdoc cref="IItem"/>
49+
/// <inheritdoc cref="IGameObjectItem.GetGameObject"/>
3650
public GameObject GetGameObject()
3751
{
3852
return gameObject;

0 commit comments

Comments
 (0)