using UnityEngine; namespace MoreMountains.Tools { /// /// Add this component to an object and it'll let you display a gizmo for its position or collider, and an optional text /// public class MMGizmo : MonoBehaviour { /// /// the possible types of gizmos to display /// public enum GizmoTypes { None, Collider, Position } /// /// whether to display gizmos always or only when the object is selected /// public enum DisplayModes { Always, OnlyWhenSelected } /// /// the shape of the gizmo to display the position of the object /// public enum PositionModes { Point, Cube, WireCube, Sphere, WireSphere, Texture, Arrows, RightArrow, UpArrow, ForwardArrow, Lines, RightLine, UpLine, ForwardLine } /// /// what to display as text for that gizmo /// public enum TextModes { GameObjectName, CustomText, Position, Rotation, Scale, Property } /// /// when displaying a collider, whether to display a full or wire gizmo /// public enum ColliderRenderTypes { Full, Wire } [Header("Modes")] /// if this is true, gizmos will be displayed, if this is false, gizmos won't be displayed [Tooltip("if this is true, gizmos will be displayed, if this is false, gizmos won't be displayed")] public bool DisplayGizmo = true; /// what the gizmos should represent. Collider will show the bounds of the associated collider, Position will show the position of the object [Tooltip("what the gizmos should represent. Collider will show the bounds of the associated collider, Position will show the position of the object")] public GizmoTypes GizmoType = GizmoTypes.Position; /// whether gizmos should always be displayed, or only when selected [Tooltip("whether gizmos should always be displayed, or only when selected")] public DisplayModes DisplayMode = DisplayModes.Always; [Header("Settings")] /// the color of the collider or position gizmo [Tooltip("the color of the collider or position gizmo")] public Color GizmoColor = MMColors.ReunoYellow; /// the shape of the gizmo when in position mode [Tooltip("the shape of the gizmo when in position mode")] [MMEnumCondition("GizmoType", (int)GizmoTypes.Position)] public PositionModes PositionMode = PositionModes.Point; /// the texture to display as a gizmo when in position & texture mode [Tooltip("the texture to display as a gizmo when in position & texture mode")] [MMEnumCondition("PositionMode", (int)PositionModes.Texture)] public Texture PositionTexture; /// the size of the texture to display as a gizmo [Tooltip("the size of the texture to display as a gizmo")] [MMEnumCondition("PositionMode", (int)PositionModes.Texture)] public Vector2 TextureSize = new Vector2(50f,50f); /// the size of the gizmo when in position mode [Tooltip("the size of the gizmo when in position mode")] [MMEnumCondition("GizmoType", (int)GizmoTypes.Position)] public float PositionSize = 0.2f; /// whether to display the collider gizmo as a wire or a full mesh [Tooltip("whether to display the collider gizmo as a wire or a full mesh")] [MMEnumCondition("GizmoType", (int)GizmoTypes.Collider)] public ColliderRenderTypes ColliderRenderType = ColliderRenderTypes.Full; /// the distance from the scene view camera beyond which the gizmo won't be displayed [Tooltip("the distance from the scene view camera beyond which the gizmo won't be displayed")] public float ViewDistance = 20f; [Header("Offsets")] /// an offset to apply when drawing a collider or position gizmo [Tooltip("an offset to apply when drawing a collider or position gizmo")] public Vector3 GizmoOffset = Vector3.zero; /// whether or not to lock the position of the gizmo on the x axis, regardless of the position of the object [Tooltip("whether or not to lock the position of the gizmo on the x axis, regardless of the position of the object")] public bool LockX = false; /// the position at which to put the gizmo when locked on the x axis [Tooltip("the position at which to put the gizmo when locked on the x axis")] [MMCondition("LockX", true)] public float LockedX = 0f; /// whether or not to lock the position of the gizmo on the y axis, regardless of the position of the object [Tooltip("whether or not to lock the position of the gizmo on the y axis, regardless of the position of the object")] public bool LockY = false; /// the position at which to put the gizmo when locked on the y axis [Tooltip("the position at which to put the gizmo when locked on the y axis")] [MMCondition("LockY", true)] public float LockedY = 0f; /// whether or not to lock the position of the gizmo on the z axis, regardless of the position of the object [Tooltip("whether or not to lock the position of the gizmo on the z axis, regardless of the position of the object")] public bool LockZ = false; /// the position at which to put the gizmo when locked on the z axis [Tooltip("the position at which to put the gizmo when locked on the z axis")] [MMCondition("LockZ", true)] public float LockedZ = 0f; [Header("Text")] /// whether or not to display text on that gizmo [Tooltip("whether or not to display text on that gizmo")] public bool DisplayText = false; /// what to display as text for that gizmo (some custom text, the object's name, position, rotation, scale, or a target property) [Tooltip("what to display as text for that gizmo (some custom text, the object's name, position, rotation, scale, or a target property)")] [MMCondition("DisplayText", true)] public TextModes TextMode; /// when in CustomText mode, the text to display on that gizmo [Tooltip("when in CustomText mode, the text to display on that gizmo")] [MMEnumCondition("TextMode", (int)TextModes.CustomText)] public string TextToDisplay = "Some Text"; /// the offset to apply to the text [Tooltip("the offset to apply to the text")] [MMCondition("DisplayText", true)] public Vector3 TextOffset = new Vector3(0f, 0.5f, 0f); /// what style to use for the text's font [Tooltip("what style to use for the text's font")] [MMCondition("DisplayText", true)] public FontStyle TextFontStyle = FontStyle.Normal; /// the size of the text's font [Tooltip("the size of the text's font")] [MMCondition("DisplayText", true)] public int TextSize = 12; /// the color in which to display the gizmo's text [Tooltip("the color in which to display the gizmo's text")] [MMCondition("DisplayText", true)] public Color TextColor = MMColors.ReunoYellow; /// the color of the background behind the text [Tooltip("the color of the background behind the text")] [MMCondition("DisplayText", true)] public Color TextBackgroundColor = new Color(0,0,0,0.3f); /// the padding to apply to the text's background [Tooltip("the padding to apply to the text's background")] [MMCondition("DisplayText", true)] public Vector4 TextPadding = new Vector4(5,0,5,0); /// the distance from the scene view camera beyond which the gizmo text won't be displayed [Tooltip("the distance from the scene view camera beyond which the gizmo text won't be displayed")] [MMCondition("DisplayText", true)] public float TextMaxDistance = 14f; /// when in Property mode, the property whose value to display on the gizmo [Tooltip("when in Property mode, the property whose value to display on the gizmo")] public MMPropertyPicker TargetProperty; public bool Initialized { get; set; } public SphereCollider _sphereCollider { get; set; } public BoxCollider _boxCollider { get; set; } public MeshCollider _meshCollider { get; set; } public CircleCollider2D _circleCollider2D { get; set; } public BoxCollider2D _boxCollider2D { get; set; } public Vector3 _vector3Zero { get; set; } public Vector3 _newPosition { get; set; } public Vector2 _worldToGUIPosition { get; set; } public Rect _textureRect { get; set; } public GUIStyle _textGUIStyle { get; set; } public string _textToDisplay { get; set; } public bool _sphereColliderNotNull { get; set; } public bool _boxColliderNotNull { get; set; } public bool _meshColliderNotNull { get; set; } public bool _circleCollider2DNotNull { get; set; } public bool _boxCollider2DNotNull { get; set; } public bool _positionTextureNotNull { get; set; } #if UNITY_EDITOR /// /// On awake we initialize our property /// protected virtual void Awake() { TargetProperty.Initialization(this.gameObject); } #else /// /// If we're not in editor, we disable ourselves /// protected virtual void Awake() { this.enabled = false; } #endif } }