Skip to content

Commit a238540

Browse files
committed
Spawn area now aligns with ground, effects scale and rotation
1 parent 5bf92a3 commit a238540

File tree

11 files changed

+169
-51
lines changed

11 files changed

+169
-51
lines changed

unity-packages/polyform/Runtime/Scripts/Variants/SpawnAreas/AggregateSpawnArea.cs

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ private void Awake()
1515
areas = spawnAreas.List();
1616
}
1717

18-
protected override Vector3 GenerateSpawn()
18+
public override SpawnTransform SpawnPoint()
1919
{
2020
if (areas.Count == 0)
2121
{
@@ -24,18 +24,5 @@ protected override Vector3 GenerateSpawn()
2424

2525
return areas.Next().SpawnPoint();
2626
}
27-
28-
public override bool InsideArea(Vector3 p)
29-
{
30-
foreach (var area in areas)
31-
{
32-
if (area.InsideArea(p))
33-
{
34-
return true;
35-
}
36-
}
37-
38-
return false;
39-
}
4027
}
4128
}

unity-packages/polyform/Runtime/Scripts/Variants/SpawnAreas/BoxSpawnArea.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
namespace EliCDavis.Polyform.Variants.SpawnAreas
44
{
55
[AddComponentMenu("Polyform/Variant/Spawn Area/Box Spawn Area")]
6-
public class BoxSpawnArea : SpawnArea
6+
public class BoxSpawnArea : VolumeSpawnArea
77
{
88
private bool InRange(float v, float min, float max)
99
{
1010
return v >= min && v <= max;
1111
}
1212

13-
protected override Vector3 GenerateSpawn()
13+
public override Vector3 GenerateSpawn()
1414
{
1515
return transform.TransformPoint(new Vector3(
1616
Random.Range(-0.5f, 0.5f),
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using UnityEngine;
3+
4+
namespace EliCDavis.Polyform.Variants.SpawnAreas
5+
{
6+
[Serializable]
7+
public class GroundSettings
8+
{
9+
private const int MaxGroundTrys = 100;
10+
11+
[SerializeField] private bool clampToGround;
12+
13+
[SerializeField] private float groundInset;
14+
15+
[SerializeField] private bool alignToGroundNormal;
16+
17+
public SpawnTransform ModifySpawn(VolumeSpawnArea spawnArea, SpawnTransform spawn)
18+
{
19+
if (!clampToGround)
20+
{
21+
return spawn;
22+
}
23+
24+
var p = spawn.Position;
25+
var r = spawn.Rotation;
26+
for (var i = 0; i < MaxGroundTrys; i++)
27+
{
28+
if (Physics.Raycast(p, Vector3.down, out var hit))
29+
{
30+
if (spawnArea.InsideArea(hit.point))
31+
{
32+
p = hit.point - new Vector3(0, groundInset, 0);
33+
34+
if (alignToGroundNormal)
35+
{
36+
Quaternion targetRotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
37+
r = targetRotation * r;
38+
}
39+
40+
break;
41+
}
42+
}
43+
44+
p = spawnArea.GenerateSpawn();
45+
}
46+
47+
return new SpawnTransform(
48+
p,
49+
r,
50+
spawn.Scale
51+
);
52+
}
53+
}
54+
}

unity-packages/polyform/Runtime/Scripts/Variants/SpawnAreas/GroundSettings.cs.meta

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

unity-packages/polyform/Runtime/Scripts/Variants/SpawnAreas/SpawnArea.cs

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,37 +4,6 @@ namespace EliCDavis.Polyform.Variants.SpawnAreas
44
{
55
public abstract class SpawnArea : MonoBehaviour
66
{
7-
[SerializeField] private bool clampToGround;
8-
9-
[SerializeField] private float groundInset;
10-
11-
protected Color GizmoColor = new Color(1, 0, 0, 0.2f);
12-
13-
public Vector3 SpawnPoint()
14-
{
15-
var p = GenerateSpawn();
16-
if (!clampToGround)
17-
{
18-
return p;
19-
}
20-
21-
for (int i = 0; i < 100; i++)
22-
{
23-
if (Physics.Raycast(p, Vector3.down, out var hit))
24-
{
25-
if (InsideArea(hit.point))
26-
{
27-
return hit.point - new Vector3(0, groundInset, 0);
28-
}
29-
}
30-
p = GenerateSpawn();
31-
}
32-
33-
return p;
34-
}
35-
36-
protected abstract Vector3 GenerateSpawn();
37-
38-
public abstract bool InsideArea(Vector3 p);
7+
public abstract SpawnTransform SpawnPoint();
398
}
409
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
using UnityEngine;
2+
3+
namespace EliCDavis.Polyform.Variants.SpawnAreas
4+
{
5+
[System.Serializable]
6+
public class SpawnTransform
7+
{
8+
9+
public SpawnTransform(Vector3 position)
10+
{
11+
this.position = position;
12+
13+
rotation = Quaternion.identity;
14+
scale = Vector3.one;
15+
}
16+
17+
public SpawnTransform(Vector3 position, Quaternion rotation, Vector3 scale)
18+
{
19+
this.position = position;
20+
this.rotation = rotation;
21+
this.scale = scale;
22+
}
23+
24+
public void Set(Transform transform)
25+
{
26+
transform.position = position;
27+
transform.rotation = rotation;
28+
transform.localScale = scale;
29+
}
30+
31+
public Vector3 Position => position;
32+
33+
public Quaternion Rotation => rotation;
34+
35+
public Vector3 Scale => scale;
36+
37+
[SerializeField]
38+
private Vector3 position;
39+
40+
[SerializeField]
41+
private Quaternion rotation;
42+
43+
[SerializeField]
44+
private Vector3 scale;
45+
46+
}
47+
}

unity-packages/polyform/Runtime/Scripts/Variants/SpawnAreas/SpawnTransform.cs.meta

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

unity-packages/polyform/Runtime/Scripts/Variants/SpawnAreas/SphereSpawnArea.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
namespace EliCDavis.Polyform.Variants.SpawnAreas
44
{
55
[AddComponentMenu("Polyform/Variant/Spawn Area/Sphere Spawn Area")]
6-
public class SphereSpawnArea : SpawnArea
6+
public class SphereSpawnArea : VolumeSpawnArea
77
{
88
[SerializeField] private float radius;
99

10-
protected override Vector3 GenerateSpawn()
10+
public override Vector3 GenerateSpawn()
1111
{
1212
return transform.position + (Random.insideUnitSphere * radius);
1313
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
using UnityEngine;
2+
3+
namespace EliCDavis.Polyform.Variants.SpawnAreas
4+
{
5+
public abstract class VolumeSpawnArea : SpawnArea
6+
{
7+
[SerializeField] private GroundSettings groundSettings;
8+
9+
[SerializeField] private Vector3 minScale = Vector3.one;
10+
11+
[SerializeField] private Vector3 maxScale = Vector3.one;
12+
13+
[SerializeField] private Vector3 minRotation = Vector3.zero;
14+
15+
[SerializeField] private Vector3 maxRotation = Vector3.zero;
16+
17+
protected Color GizmoColor = new Color(1, 0, 0, 0.2f);
18+
19+
private Vector3 Random(Vector3 min, Vector3 max)
20+
{
21+
var range = max - min;
22+
return min + new Vector3(
23+
UnityEngine.Random.value * range.x,
24+
UnityEngine.Random.value * range.y,
25+
UnityEngine.Random.value * range.z
26+
);
27+
}
28+
29+
public override SpawnTransform SpawnPoint()
30+
{
31+
var p = GenerateSpawn();
32+
var r = Quaternion.Euler(Random(minRotation, maxRotation));
33+
var s = Random(minScale, maxScale);
34+
var spawn = new SpawnTransform(p, r, s);
35+
36+
if (groundSettings == null)
37+
{
38+
return spawn;
39+
}
40+
41+
42+
return groundSettings.ModifySpawn(this, spawn);
43+
}
44+
45+
public abstract Vector3 GenerateSpawn();
46+
47+
public abstract bool InsideArea(Vector3 p);
48+
}
49+
}

unity-packages/polyform/Runtime/Scripts/Variants/SpawnAreas/VolumeSpawnArea.cs.meta

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

0 commit comments

Comments
 (0)