using System.Collections; using System.Collections.Generic; using System.Runtime.InteropServices; using UnityEngine; using VRTK; public class CoriolisDisplay : MonoBehaviour { [Header("References")] [SerializeField] private RotationController m_ship; [SerializeField] private GameObject m_segmentPrefab; [SerializeField] private Transform m_tip; [Header("settings")] [SerializeField] private int m_segmentCount = 20; [SerializeField] private float m_segmentSpacing = 0.5f; [SerializeField] private float m_coriolisMultiplier = 1; private VRTK_InteractableObject m_interactable; private List m_segments = new List(); private void Awake() { if (m_ship == null) m_ship = FindObjectOfType(); m_interactable = GetComponent(); } private void OnEnable() { RegisterEvents(true); } private void OnDisable() { RegisterEvents(false); DestroySegments(); } private void Update() { UpdateSegments(); } private void GenerateSegments() { for (int i = 0; i < m_segmentCount; i++) { GameObject segment = Instantiate(m_segmentPrefab); segment.transform.position = transform.position; m_segments.Add(segment); } } private void DestroySegments() { foreach (GameObject segment in m_segments) { Destroy(segment); } m_segments.Clear(); } private void UpdateSegments() { if (m_segments == null || m_segments.Count == 0) return; Vector3 position = m_tip.position; Vector3 direction = m_tip.forward; Vector3 shipDirection = m_ship.RotationAxis; foreach(GameObject segment in m_segments) { Vector3 force = 2 * Vector3.Cross(direction, m_ship.RotationAxis) * (2 * Mathf.PI / m_ship.RotationPeriod); direction = (direction + force * m_coriolisMultiplier).normalized * m_segmentSpacing; position = position + direction; segment.transform.position = position; segment.transform.forward = direction; } } private void OnGrab(object sender, InteractableObjectEventArgs args) { GenerateSegments(); } private void OnDrop(object sender, InteractableObjectEventArgs args) { DestroySegments(); } private void RegisterEvents(bool value) { if (value) { m_interactable.InteractableObjectGrabbed += OnGrab; m_interactable.InteractableObjectUngrabbed += OnDrop; } else { m_interactable.InteractableObjectGrabbed -= OnGrab; m_interactable.InteractableObjectUngrabbed -= OnDrop; } } }