summaryrefslogtreecommitdiffhomepage
path: root/Assets/Scripts/GravityTypes/GravitySphere.cs
blob: 43212d4bed7f005612c3e71925404fdd927ee9ca (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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GravitySphere : GravitySource
{
	[SerializeField]
	float gravity = 0.981f;

	[SerializeField, Min(0f)]
	float outerRadius = 10f;
	[SerializeField, Min(0f)]
	float outerFalloffRadius = 15f;
	float outerFalloffFactor;

	[SerializeField, Min(0f)]
	float innerFalloffRadius = 1f;
	[SerializeField, Min(0f)]
	float innerRadius = 5f;
	float innerFalloffFactor;

	public override Vector3 GetGravity(Vector3 position)
	{
		Vector3 vector = transform.position - position;
		float distance = vector.magnitude;
		if(distance > outerFalloffRadius || distance < innerFalloffRadius)
		{
			return Vector3.zero;
		}
		float g = gravity / distance;
		if(distance > outerRadius)
		{
			g *= 1f - (distance - outerRadius) * outerFalloffFactor;
		}
		else if(distance < innerRadius)
		{
			g *= 1f - (distance - innerRadius) * innerFalloffFactor;
		}
		return g * vector;
	}

	void OnDrawGizmos()
	{
		Vector3 p = transform.position;
		if((innerFalloffRadius > 0f) && (innerFalloffRadius < innerRadius))
		{
			Gizmos.color = Color.cyan;
			Gizmos.DrawWireSphere(p, innerFalloffRadius);
		}
		Gizmos.color = Color.yellow;
		if(innerRadius > 0f && innerRadius < outerRadius)
		{
			Gizmos.DrawWireSphere(p, innerRadius);
		}
		Gizmos.DrawWireSphere(p, outerRadius);
		if(outerFalloffRadius > outerRadius)
		{
			Gizmos.color = Color.cyan;
			Gizmos.DrawWireSphere(p, outerFalloffRadius);
		}
	}

	void Awake()
	{
		OnValidate();
	}

	void OnValidate()
	{
		innerRadius = Mathf.Max(innerRadius, innerFalloffRadius);
		innerFalloffRadius = Mathf.Max(innerFalloffRadius, 0f);
		outerRadius = Mathf.Max(outerRadius, innerRadius);
		outerFalloffRadius = Mathf.Max(outerFalloffRadius, outerRadius);

		innerFalloffFactor = 1f / (innerRadius - innerFalloffRadius);
		outerFalloffFactor = 1f / (outerFalloffRadius - outerRadius);
	}

}