feat: Levitation system
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -4,7 +4,9 @@ public class LevitationManager : MonoBehaviour
|
|||||||
{
|
{
|
||||||
public static LevitationManager Instance { get; private set; }
|
public static LevitationManager Instance { get; private set; }
|
||||||
|
|
||||||
[Range(0, 1)] public float Levitation;
|
[SerializeField, Range(0, 1)] private float _levitation;
|
||||||
|
|
||||||
|
public float Levitation => _levitation;
|
||||||
|
|
||||||
void OnEnable()
|
void OnEnable()
|
||||||
{
|
{
|
||||||
@@ -16,4 +18,9 @@ public class LevitationManager : MonoBehaviour
|
|||||||
if (Instance == this)
|
if (Instance == this)
|
||||||
Instance = null;
|
Instance = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SetLevitation(float levitation)
|
||||||
|
{
|
||||||
|
_levitation = levitation;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ public class LevitationObject : MonoBehaviour
|
|||||||
[System.Serializable]
|
[System.Serializable]
|
||||||
public class Settings
|
public class Settings
|
||||||
{
|
{
|
||||||
[Range(0, 99)] public int Seed = -1;
|
[Range(-1, 99)] public int Seed = -1;
|
||||||
public Vector3 Offset = new Vector3(0, 3, 0);
|
public Vector3 Offset = new Vector3(0, 3, 0);
|
||||||
public Vector3 DivergeanceMin = new Vector3(1, 1, 1);
|
public Vector3 DivergeanceMin = new Vector3(-1, -2, -1);
|
||||||
public Vector3 DivergeanceMax = new Vector3(-1, -1, -1);
|
public Vector3 DivergeanceMax = new Vector3(1, 2, 1);
|
||||||
public Vector3 Amplitude = new Vector3(.1f, .5f, .1f);
|
public Vector3 Amplitude = new Vector3(.1f, .5f, .1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,47 +28,72 @@ public class LevitationObject : MonoBehaviour
|
|||||||
[SerializeField] private Settings _settings;
|
[SerializeField] private Settings _settings;
|
||||||
[SerializeField] private State _state;
|
[SerializeField] private State _state;
|
||||||
|
|
||||||
private Vector3 _originPos;
|
|
||||||
private Vector3 _randomAxis;
|
private Vector3 _randomAxis;
|
||||||
|
private Vector3 _originPos;
|
||||||
|
private Quaternion _originRot;
|
||||||
|
|
||||||
|
void OnDrawGizmosSelected()
|
||||||
|
//void OnDrawGizmos()
|
||||||
|
{
|
||||||
|
Gizmos.color = Color.cyan;
|
||||||
|
|
||||||
|
Vector3 originPos = Application.isPlaying ? _originPos : transform.position;
|
||||||
|
Vector3 targetCenter = GetTargetCenter();
|
||||||
|
|
||||||
|
Gizmos.DrawLine(transform.position, originPos + targetCenter);
|
||||||
|
Gizmos.DrawWireSphere(originPos + targetCenter, .05f);
|
||||||
|
}
|
||||||
|
|
||||||
void OnValidate()
|
void OnValidate()
|
||||||
{
|
{
|
||||||
if (!_references.Rigidbody)
|
if (!_references.Rigidbody)
|
||||||
_references.Rigidbody = GetComponent<Rigidbody>();
|
_references.Rigidbody = GetComponent<Rigidbody>();
|
||||||
|
|
||||||
|
if (_settings.Seed == -1)
|
||||||
|
_settings.Seed = Random.Range(0, 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Awake()
|
void Awake()
|
||||||
{
|
{
|
||||||
|
_randomAxis = new Vector3(Mathf.Cos(_settings.Seed * 3.41f), Mathf.Cos(_settings.Seed * 9.23f), Mathf.Sin(_settings.Seed * 5.22f)).normalized;
|
||||||
_originPos = transform.position;
|
_originPos = transform.position;
|
||||||
_randomAxis = new Vector3(Random.Range(-1f, 1f), Random.Range(-1f, 1f), Random.Range(-1f, 1f)).normalized;
|
_originRot = transform.rotation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
if (!LevitationManager.Instance || LevitationManager.Instance.Levitation <= 0)
|
if (!LevitationManager.Instance)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_references.Rigidbody.isKinematic = true;
|
_references.Rigidbody.isKinematic = true;
|
||||||
_references.Rigidbody.useGravity = false;
|
_references.Rigidbody.useGravity = false;
|
||||||
|
|
||||||
float t = Time.timeSinceLevelLoad;
|
float t = Time.timeSinceLevelLoad;
|
||||||
t+= (transform.GetSiblingIndex() + (transform.parent ? transform.parent.GetSiblingIndex() : 0)) * 7.63f;
|
t += _settings.Seed * 7.63f;
|
||||||
|
|
||||||
float cosT0 = Mathf.Cos(t * .3f);
|
float cosT0 = Mathf.Cos(t * .3f);
|
||||||
float cosT1 = Mathf.Cos(t);
|
float cosT1 = Mathf.Cos(t);
|
||||||
float sinT0 = Mathf.Sin(t * .3f);
|
float sinT0 = Mathf.Sin(t * .3f);
|
||||||
|
|
||||||
Vector3 offset = _settings.Offset;
|
Vector3 offset = GetTargetCenter();
|
||||||
offset.x += _settings.DivergeanceMin.x * cosT0 + _settings.DivergeanceMax.x * sinT0 * _settings.Amplitude.x;
|
offset.x += _settings.Amplitude.x * cosT0;
|
||||||
offset.y += _settings.DivergeanceMin.y * cosT1 + _settings.DivergeanceMax.y * cosT1 * _settings.Amplitude.y;
|
offset.y += _settings.Amplitude.y * cosT1;
|
||||||
offset.z += _settings.DivergeanceMin.z * sinT0 + _settings.DivergeanceMax.z * cosT0 * _settings.Amplitude.z;
|
offset.z += _settings.Amplitude.z * sinT0;
|
||||||
|
|
||||||
Vector3 targetPos = _originPos + offset;
|
Vector3 targetPos = _originPos + offset;
|
||||||
targetPos = Vector3.Lerp(transform.position, targetPos, t / Mathf.Max(Vector3.Distance(transform.position, targetPos) * 4f, 1));
|
|
||||||
targetPos = Vector3.Slerp(_originPos, targetPos, LevitationManager.Instance.Levitation);
|
targetPos = Vector3.Slerp(_originPos, targetPos, LevitationManager.Instance.Levitation);
|
||||||
|
targetPos = Vector3.Lerp(transform.position, targetPos, t / Mathf.Max(Vector3.Distance(transform.position, targetPos), 1) * .0002f);
|
||||||
|
|
||||||
Quaternion targetRot = Quaternion.AngleAxis(t * 10, _randomAxis);
|
Quaternion targetRot = Quaternion.AngleAxis(t * 10, _randomAxis);
|
||||||
|
targetRot = Quaternion.Lerp(_originRot, targetRot, LevitationManager.Instance.Levitation);
|
||||||
|
|
||||||
_references.Rigidbody.Move(targetPos, targetRot);
|
_references.Rigidbody.Move(targetPos, targetRot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector3 GetTargetCenter()
|
||||||
|
{
|
||||||
|
Vector3 divergeance = Vector3.Lerp(_settings.DivergeanceMin, _settings.DivergeanceMax, (_settings.Seed * 6.72f) % 1);
|
||||||
|
|
||||||
|
return _settings.Offset + divergeance;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user