Boat Attack使用了Universal RP的许多新图形功能,可以用于探索 Universal RP 的使用方式和技巧。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

168 行
6.6 KiB

using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using Cinemachine.Utility;
using System.IO;
namespace Cinemachine.Editor
{
[CustomEditor(typeof(CinemachineBrain))]
internal sealed class CinemachineBrainEditor : BaseEditor<CinemachineBrain>
{
EmbeddeAssetEditor<CinemachineBlenderSettings> m_BlendsEditor;
bool mEventsExpanded = false;
protected override List<string> GetExcludedPropertiesInInspector()
{
List<string> excluded = base.GetExcludedPropertiesInInspector();
excluded.Add(FieldPath(x => x.m_CameraCutEvent));
excluded.Add(FieldPath(x => x.m_CameraActivatedEvent));
excluded.Add(FieldPath(x => x.m_CustomBlends));
return excluded;
}
private void OnEnable()
{
m_BlendsEditor = new EmbeddeAssetEditor<CinemachineBlenderSettings>(
FieldPath(x => x.m_CustomBlends), this);
m_BlendsEditor.OnChanged = (CinemachineBlenderSettings b) =>
{
UnityEditorInternal.InternalEditorUtility.RepaintAllViews();
};
}
private void OnDisable()
{
if (m_BlendsEditor != null)
m_BlendsEditor.OnDisable();
}
public override void OnInspectorGUI()
{
BeginInspector();
// Show the active camera and blend
GUI.enabled = false;
ICinemachineCamera vcam = Target.ActiveVirtualCamera;
Transform activeCam = (vcam != null && vcam.VirtualCameraGameObject != null)
? vcam.VirtualCameraGameObject.transform : null;
EditorGUILayout.ObjectField("Live Camera", activeCam, typeof(Transform), true);
EditorGUILayout.DelayedTextField(
"Live Blend", Target.ActiveBlend != null
? Target.ActiveBlend.Description : string.Empty);
GUI.enabled = true;
// Normal properties
DrawRemainingPropertiesInInspector();
// Blender
m_BlendsEditor.DrawEditorCombo(
"Create New Blender Asset",
Target.gameObject.name + " Blends", "asset", string.Empty,
"Custom Blends", false);
mEventsExpanded = EditorGUILayout.Foldout(mEventsExpanded, "Events");
if (mEventsExpanded)
{
EditorGUILayout.PropertyField(FindProperty(x => x.m_CameraCutEvent));
EditorGUILayout.PropertyField(FindProperty(x => x.m_CameraActivatedEvent));
}
serializedObject.ApplyModifiedProperties();
}
[DrawGizmo(GizmoType.Selected | GizmoType.NonSelected, typeof(CinemachineBrain))]
private static void DrawBrainGizmos(CinemachineBrain brain, GizmoType drawType)
{
if (brain.OutputCamera != null && brain.m_ShowCameraFrustum)
{
DrawCameraFrustumGizmo(
brain, LensSettings.FromCamera(brain.OutputCamera),
brain.transform.localToWorldMatrix,
Color.white); // GML why is this color hardcoded?
}
}
internal static void DrawCameraFrustumGizmo(
CinemachineBrain brain, LensSettings lens,
Matrix4x4 transform, Color color)
{
float aspect = 1;
bool ortho = false;
if (brain != null)
{
aspect = brain.OutputCamera.aspect;
ortho = brain.OutputCamera.orthographic;
}
Matrix4x4 originalMatrix = Gizmos.matrix;
Color originalGizmoColour = Gizmos.color;
Gizmos.color = color;
Gizmos.matrix = transform;
if (ortho)
{
Vector3 size = new Vector3(
aspect * lens.OrthographicSize * 2,
lens.OrthographicSize * 2,
lens.NearClipPlane + lens.FarClipPlane);
Gizmos.DrawWireCube(
new Vector3(0, 0, (size.z / 2) + lens.NearClipPlane), size);
}
else
{
Gizmos.DrawFrustum(
Vector3.zero, lens.FieldOfView,
lens.FarClipPlane, lens.NearClipPlane, aspect);
}
Gizmos.matrix = originalMatrix;
Gizmos.color = originalGizmoColour;
}
[DrawGizmo(GizmoType.Active | GizmoType.InSelectionHierarchy | GizmoType.Pickable, typeof(CinemachineVirtualCameraBase))]
internal static void DrawVirtualCameraBaseGizmos(CinemachineVirtualCameraBase vcam, GizmoType selectionType)
{
// Don't draw gizmos on hidden stuff
if ((vcam.VirtualCameraGameObject.hideFlags & (HideFlags.HideInHierarchy | HideFlags.HideInInspector)) != 0)
return;
if (vcam.ParentCamera != null && (selectionType & GizmoType.Active) == 0)
return;
CameraState state = vcam.State;
Gizmos.DrawIcon(state.FinalPosition, kGizmoFileName, true);
DrawCameraFrustumGizmo(
CinemachineCore.Instance.FindPotentialTargetBrain(vcam),
state.Lens,
Matrix4x4.TRS(
state.FinalPosition,
UnityQuaternionExtensions.Normalized(state.FinalOrientation), Vector3.one),
CinemachineCore.Instance.IsLive(vcam)
? CinemachineSettings.CinemachineCoreSettings.ActiveGizmoColour
: CinemachineSettings.CinemachineCoreSettings.InactiveGizmoColour);
}
static string kGizmoFileName = "Cinemachine/cm_logo_lg.png";
[InitializeOnLoad]
static class InstallGizmos
{
static InstallGizmos()
{
string srcFile = ScriptableObjectUtility.CinemachineInstallPath + "/Gizmos/" + kGizmoFileName;
if (File.Exists(srcFile))
{
string dstFile = Application.dataPath + "/Gizmos";
if (!Directory.Exists(dstFile))
Directory.CreateDirectory(dstFile);
dstFile += "/" + kGizmoFileName;
if (!File.Exists(dstFile)
|| File.GetCreationTime(dstFile) < File.GetCreationTime(srcFile))
{
if (!Directory.Exists(Path.GetDirectoryName(dstFile)))
Directory.CreateDirectory(Path.GetDirectoryName(dstFile));
File.Copy(srcFile, dstFile, true);
}
}
}
}
}
}