237 lines
7.9 KiB
C#
237 lines
7.9 KiB
C#
#if UNITY_EDITOR
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
|
|
namespace JordanCassady
|
|
{
|
|
public class CameraComposition : EditorWindow
|
|
{
|
|
#region PROPERTIES
|
|
private GameObject compositionObject;
|
|
private GUIStyle guiStyle;
|
|
private int tabIndex;
|
|
private GameObject targetCamera;
|
|
private Vector3 revertCameraPosition;
|
|
private Quaternion revertCameraRotation;
|
|
#endregion
|
|
|
|
private readonly string[] tabNames = { "Rule of Thirds", "Diagonal", "Golden Ratio", "Golden Spiral" };
|
|
private Color greyColor = new Color(56f / 255f, 56f / 255f, 56f / 255f, 1f);
|
|
|
|
[MenuItem("Tools/Camera Composition")]
|
|
public static void ShowWindow()
|
|
{
|
|
var window = GetWindow<CameraComposition>("Camera Composition");
|
|
window.minSize = new Vector2(370, 186);
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
InitGUIStyle();
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (compositionObject != null)
|
|
{
|
|
DestroyImmediate(compositionObject);
|
|
}
|
|
}
|
|
|
|
private void OnGUI()
|
|
{
|
|
if (compositionObject == null)
|
|
{
|
|
compositionObject = Instantiate(Resources.Load<GameObject>("Prefabs/Camera Composition"));
|
|
}
|
|
|
|
DrawTabSection();
|
|
DrawOverrideSection();
|
|
DrawCameraSection();
|
|
}
|
|
|
|
private void InitGUIStyle()
|
|
{
|
|
guiStyle = new GUIStyle
|
|
{
|
|
fontSize = 12,
|
|
fontStyle = FontStyle.Bold,
|
|
normal = { textColor = Color.white }
|
|
};
|
|
}
|
|
|
|
private void DrawTabSection()
|
|
{
|
|
tabIndex = GUILayout.Toolbar(tabIndex, tabNames);
|
|
GUILayout.Space(10);
|
|
|
|
if (compositionObject == null) return;
|
|
|
|
GameObject overlayObject = compositionObject.transform.GetChild(tabIndex).gameObject;
|
|
|
|
DrawGridSection(overlayObject);
|
|
DrawColorSection(overlayObject);
|
|
DrawOpacitySection(overlayObject);
|
|
|
|
if (tabIndex == 3) // Golden Spiral만 회전 지원
|
|
{
|
|
DrawRotationSection(overlayObject);
|
|
}
|
|
}
|
|
|
|
private void DrawGridSection(GameObject overlayObject)
|
|
{
|
|
GUILayout.Label("Grid", guiStyle);
|
|
GUILayout.BeginHorizontal();
|
|
|
|
if (GUILayout.Button("On", GUILayout.Height(20)))
|
|
overlayObject.GetComponent<CompositionOverlay>().Activate(true);
|
|
|
|
if (GUILayout.Button("Off", GUILayout.Height(20)))
|
|
overlayObject.GetComponent<CompositionOverlay>().Activate(false);
|
|
|
|
GUILayout.EndHorizontal();
|
|
GUILayout.Space(10);
|
|
}
|
|
|
|
private void DrawRotationSection(GameObject overlayObject)
|
|
{
|
|
GUILayout.Label("Rotation", guiStyle);
|
|
GUILayout.BeginHorizontal();
|
|
|
|
if (GUILayout.Button("↶ Top Left", GUILayout.Height(30)))
|
|
{
|
|
overlayObject.GetComponent<CompositionOverlay>().Position("Top Left");
|
|
ToggleGrid(overlayObject);
|
|
}
|
|
|
|
if (GUILayout.Button("↷ Top Right", GUILayout.Height(30)))
|
|
{
|
|
overlayObject.GetComponent<CompositionOverlay>().Position("Top Right");
|
|
ToggleGrid(overlayObject);
|
|
}
|
|
|
|
GUILayout.EndHorizontal();
|
|
GUILayout.BeginHorizontal();
|
|
|
|
if (GUILayout.Button("↶ Bottom Left", GUILayout.Height(30)))
|
|
{
|
|
overlayObject.GetComponent<CompositionOverlay>().Position("Bottom Left");
|
|
ToggleGrid(overlayObject);
|
|
}
|
|
|
|
if (GUILayout.Button("↷ Bottom Right", GUILayout.Height(30)))
|
|
{
|
|
overlayObject.GetComponent<CompositionOverlay>().Position("Bottom Right");
|
|
ToggleGrid(overlayObject);
|
|
}
|
|
|
|
GUILayout.EndHorizontal();
|
|
GUILayout.Space(10);
|
|
}
|
|
|
|
private void DrawColorSection(GameObject overlayObject)
|
|
{
|
|
GUILayout.Label("Color", guiStyle);
|
|
GUILayout.BeginHorizontal();
|
|
|
|
if (GUILayout.Button("White", GUILayout.Height(20)))
|
|
{
|
|
overlayObject.GetComponent<CompositionOverlay>().InvertLineColor(false);
|
|
ToggleGrid(overlayObject);
|
|
}
|
|
|
|
if (GUILayout.Button("Black", GUILayout.Height(20)))
|
|
{
|
|
overlayObject.GetComponent<CompositionOverlay>().InvertLineColor(true);
|
|
ToggleGrid(overlayObject);
|
|
}
|
|
|
|
GUILayout.EndHorizontal();
|
|
GUILayout.Space(10);
|
|
}
|
|
|
|
private void DrawOpacitySection(GameObject overlayObject)
|
|
{
|
|
GUILayout.Label("Opacity", guiStyle);
|
|
|
|
var opacity = overlayObject.GetComponent<CompositionOverlay>().Opacity;
|
|
opacity = EditorGUILayout.Slider(opacity, 0f, 1f);
|
|
overlayObject.GetComponent<CompositionOverlay>().UpdateOpacity(opacity);
|
|
ToggleGrid(overlayObject);
|
|
|
|
GUILayout.Space(10);
|
|
}
|
|
|
|
private void DrawOverrideSection()
|
|
{
|
|
GUILayout.Label("Overrides", guiStyle);
|
|
|
|
if (GUILayout.Button("Turn Off All Grids", GUILayout.Height(20)))
|
|
{
|
|
if (compositionObject != null)
|
|
{
|
|
foreach (Transform overlayObject in compositionObject.transform)
|
|
{
|
|
overlayObject.gameObject.GetComponent<CompositionOverlay>().Activate(false);
|
|
}
|
|
}
|
|
}
|
|
GUILayout.Space(10);
|
|
}
|
|
|
|
private void DrawCameraSection()
|
|
{
|
|
GUILayout.Label("Target Camera", guiStyle);
|
|
targetCamera = (GameObject)EditorGUILayout.ObjectField(targetCamera, typeof(GameObject), true);
|
|
|
|
if (targetCamera == null)
|
|
{
|
|
EditorGUILayout.HelpBox("Select a target camera to adjust position & rotation.", MessageType.Info);
|
|
return;
|
|
}
|
|
|
|
GUILayout.Space(10);
|
|
GUILayout.Label("Position", guiStyle);
|
|
Undo.RecordObject(targetCamera.transform, "Camera Position Change");
|
|
targetCamera.transform.position = EditorGUILayout.Vector3Field("", targetCamera.transform.position);
|
|
|
|
GUILayout.Label("Rotation", guiStyle);
|
|
Undo.RecordObject(targetCamera.transform, "Camera Rotation Change");
|
|
Vector3 rotationVector = EditorGUILayout.Vector3Field("", targetCamera.transform.rotation.eulerAngles);
|
|
targetCamera.transform.rotation = Quaternion.Euler(rotationVector);
|
|
|
|
GUILayout.Space(10);
|
|
GUILayout.BeginHorizontal();
|
|
|
|
if (GUILayout.Button("Align Camera With Scene View", GUILayout.Height(25)))
|
|
{
|
|
revertCameraPosition = targetCamera.transform.position;
|
|
revertCameraRotation = targetCamera.transform.rotation;
|
|
|
|
SceneView sceneView = SceneView.lastActiveSceneView;
|
|
targetCamera.transform.position = sceneView.camera.transform.position;
|
|
targetCamera.transform.rotation = sceneView.camera.transform.rotation;
|
|
}
|
|
|
|
if (GUILayout.Button("Revert", GUILayout.Height(25)))
|
|
{
|
|
targetCamera.transform.position = revertCameraPosition;
|
|
targetCamera.transform.rotation = revertCameraRotation;
|
|
}
|
|
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
private void ToggleGrid(GameObject overlayObject)
|
|
{
|
|
if (overlayObject.GetComponent<CompositionOverlay>().IsActive)
|
|
{
|
|
overlayObject.GetComponent<CompositionOverlay>().Activate(false);
|
|
overlayObject.GetComponent<CompositionOverlay>().Activate(true);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|