using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
public class ShipPhysicsEditor : EditorWindow
|
|
{
|
|
|
|
private float m_GravityStrength = 9.8f;
|
|
private Vector3 m_Point;
|
|
private RotationController m_Ship;
|
|
private float m_radius = 0;
|
|
private float m_oldRadius = 0;
|
|
|
|
// Add menu named "My Window" to the Window menu
|
|
[MenuItem("Tools/Ship Physics")]
|
|
static void Init()
|
|
{
|
|
// Get existing open window or if none, make a new one:
|
|
ShipPhysicsEditor window = (ShipPhysicsEditor)EditorWindow.GetWindow(typeof(ShipPhysicsEditor));
|
|
|
|
window.m_Ship = FindObjectOfType<RotationController>();
|
|
window.m_Point = window?.m_Ship.Position ?? Vector3.zero;
|
|
window.RegisterSceneGUI(true);
|
|
window.Show();
|
|
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
RegisterSceneGUI(false);
|
|
}
|
|
|
|
|
|
public void OnGUI()
|
|
{
|
|
GUILayout.Label("Base Settings", EditorStyles.boldLabel);
|
|
|
|
m_Ship = EditorGUILayout.ObjectField(m_Ship, typeof(RotationController), true) as RotationController;
|
|
|
|
m_GravityStrength = EditorGUILayout.FloatField("Gravity", m_GravityStrength);
|
|
m_radius = EditorGUILayout.FloatField("Radius", m_radius);
|
|
|
|
if (m_oldRadius != m_radius)
|
|
{
|
|
Vector3 direction;
|
|
if (m_Point == m_Ship.Position)
|
|
direction = Vector3.Cross(m_Ship.RotationAxis, (m_Ship.RotationAxis != Vector3.right) ? Vector3.left : Vector3.up);
|
|
else
|
|
direction = m_Ship.getDownDirection(m_Point);
|
|
|
|
m_Point = m_Ship.Position + direction * m_radius;
|
|
|
|
m_oldRadius = m_radius;
|
|
SceneView.RepaintAll();
|
|
}
|
|
|
|
|
|
if (GUILayout.Button("Set Rotation"))
|
|
m_Ship.SetGravityAtRadius(m_GravityStrength, m_radius);
|
|
}
|
|
|
|
|
|
void OnSceneGUI(SceneView sceneView)
|
|
{
|
|
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
m_Point = Handles.PositionHandle(m_Point, m_Ship.getUpRotation(m_Point));
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
m_Point = Vector3.ProjectOnPlane(m_Point, m_Ship.RotationAxis) + Vector3.Project(m_Ship.Position, m_Ship.RotationAxis);
|
|
m_radius = m_Ship.getDownDirection(m_Point, false).magnitude;
|
|
m_oldRadius = m_radius;
|
|
Repaint();
|
|
}
|
|
|
|
Handles.color = Color.red;
|
|
Handles.DrawLine(m_Point, m_Ship.Position);
|
|
|
|
|
|
Handles.BeginGUI();
|
|
// Do your drawing here using GUI.
|
|
Handles.EndGUI();
|
|
}
|
|
|
|
|
|
private void RegisterSceneGUI(bool value)
|
|
{
|
|
if (value)
|
|
SceneView.duringSceneGui += this.OnSceneGUI;
|
|
|
|
else
|
|
SceneView.duringSceneGui -= this.OnSceneGUI;
|
|
|
|
SceneView.RepaintAll();
|
|
}
|
|
|
|
|
|
|
|
}
|