using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
|
|
[RequireComponent(typeof(Rigidbody))]
|
|
public class ArtificialGravity : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private RotationController Ship;
|
|
|
|
[SerializeField]
|
|
private float m_correlusMultiplier = 1;
|
|
|
|
private Rigidbody rb;
|
|
|
|
private void OnEnable()
|
|
{
|
|
rb = GetComponent<Rigidbody>();
|
|
rb.useGravity = false;
|
|
|
|
if (Ship == null)
|
|
Ship = FindObjectOfType<RotationController>();
|
|
}
|
|
|
|
|
|
private void FixedUpdate()
|
|
{
|
|
ApplyGravity();
|
|
}
|
|
|
|
private void ApplyGravity()
|
|
{
|
|
if (Ship.RotationPeriod <= 0)
|
|
return;
|
|
|
|
Vector3 direction = Ship.getDownDirection(transform.position, false);
|
|
float force = direction.magnitude * Mathf.Pow(2 * Mathf.PI / Ship.RotationPeriod, 2);
|
|
|
|
Debug.DrawRay(transform.position, transform.position + direction);
|
|
|
|
rb.AddForce(direction.normalized * force * Time.fixedDeltaTime, ForceMode.Acceleration);
|
|
|
|
if (!IsGrounded())
|
|
{
|
|
direction = Ship.getPerpendicularDirection(transform.position);
|
|
|
|
rb.AddForce(direction * Ship.CorrelusStrength * m_correlusMultiplier * Time.fixedDeltaTime, ForceMode.Acceleration);
|
|
Debug.DrawRay(transform.position, direction, Color.blue);
|
|
}
|
|
}
|
|
|
|
private bool IsGrounded()
|
|
{
|
|
|
|
Ray ray = new Ray(transform.position, Ship.getDownDirection(transform.position));
|
|
RaycastHit hit;
|
|
|
|
if (Physics.Raycast(ray, out hit, 0.25f)){
|
|
return true;
|
|
}
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|