using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class CoriolisEffect : MonoBehaviour
|
|
{
|
|
|
|
public Vector3 downDir => Vector3.ProjectOnPlane((transform.position - center.transform.position), Vector3.forward);
|
|
|
|
// Start is called before the first frame update
|
|
public GameObject center;
|
|
private Rigidbody rb;
|
|
private const float MAX_GRAVITY = 9.8f;
|
|
public float maxCoriolisForce;
|
|
public float coriolisForceMultiplier = 2f;
|
|
void Start()
|
|
{
|
|
rb = GetComponent<Rigidbody>();
|
|
rb.useGravity = false;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void FixedUpdate()
|
|
{
|
|
if (IsGrounded())
|
|
return;
|
|
|
|
Vector3 direction = downDir.normalized;
|
|
Vector3 coriolisVector = -Vector3.Cross(direction, new Vector3(0,0,1)).normalized;
|
|
Debug.Log(LerpCoriolisForce());
|
|
float force = LerpCoriolisForce();
|
|
|
|
rb.AddForce(coriolisVector * force * coriolisForceMultiplier * Time.deltaTime, ForceMode.Acceleration);
|
|
//rb.AddForce(direction * LerpGravity(), ForceMode.Acceleration);
|
|
Debug.DrawRay(transform.position, coriolisVector * force, Color.red);
|
|
}
|
|
|
|
float LerpGravity()
|
|
{
|
|
return Mathf.Lerp(0, MAX_GRAVITY, Vector3.Distance(gameObject.transform.position, center.transform.position) / 12.75f);
|
|
}
|
|
|
|
float LerpCoriolisForce()
|
|
{
|
|
Debug.Log(Vector3.Distance(gameObject.transform.position, center.transform.position));
|
|
return Mathf.Lerp(maxCoriolisForce, 0, downDir.magnitude / 12.75f);
|
|
}
|
|
|
|
private bool IsGrounded()
|
|
{
|
|
|
|
Ray ray = new Ray(transform.position, downDir.normalized);
|
|
RaycastHit hit;
|
|
|
|
if (Physics.Raycast(ray, out hit, 0.25f))
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
}
|