// Copyright (c) 2010 Bob Berkebile // Please direct any bugs/comments/suggestions to http://www.pixelplacement.com // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. using UnityEngine; using UnityEditor; using System.Collections; [CustomEditor( typeof( iTweenPathEX ) )] public class iTweenPathEXEditor : Editor { iTweenPathEX _target; GUIStyle style = new GUIStyle(); public static int count = 0; void OnEnable() { //i like bold handle labels since I'm getting old: style.fontStyle = FontStyle.Bold; style.normal.textColor = Color.white; _target = (iTweenPathEX)target; //lock in a default path name: if(!_target.initialized) { _target.initialized = true; _target.pathName = "New Path " + ++count; _target.initialName = _target.pathName; } } public override void OnInspectorGUI() { //set curve time EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel( "Play Time" ); _target.totalePlayTime = EditorGUILayout.FloatField( _target.totalePlayTime ); EditorGUILayout.EndHorizontal(); //set camera dir opt EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel( "Auto Camera Dir" ); _target.adjustViewDirAuto = EditorGUILayout.Toggle( _target.adjustViewDirAuto ); EditorGUILayout.EndHorizontal(); //draw the path? EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel( "Path Visible" ); _target.pathVisible = EditorGUILayout.Toggle( _target.pathVisible ); EditorGUILayout.EndHorizontal(); //path name: EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel( "Path Name" ); _target.pathName = EditorGUILayout.TextField( _target.pathName ); EditorGUILayout.EndHorizontal(); if(_target.pathName == "") { _target.pathName = _target.initialName; } //path color: EditorGUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel( "Path Color" ); _target.pathColor = EditorGUILayout.ColorField( _target.pathColor ); EditorGUILayout.EndHorizontal(); //exploration segment count control: EditorGUILayout.BeginHorizontal(); //EditorGUILayout.PrefixLabel("Node Count"); _target.nodeCount = Mathf.Max( 2, EditorGUILayout.IntField( "Node Count", _target.nodeCount ) ); //_target.nodeCount = Mathf.Clamp(EditorGUILayout.IntSlider(_target.nodeCount, 0, 10), 2,100); EditorGUILayout.EndHorizontal(); //add node? if(_target.nodeCount > _target.nodes.Count) { for(int i = 0; i < _target.nodeCount - _target.nodes.Count; i++) { _target.nodes.Add( Vector3.zero ); } } //remove node? if(_target.nodeCount < _target.nodes.Count) { if(EditorUtility.DisplayDialog( "Remove path node?", "Shortening the node list will permantently destory parts of your path. This operation cannot be undone.", "OK", "Cancel" )) { int removeCount = _target.nodes.Count - _target.nodeCount; _target.nodes.RemoveRange( _target.nodes.Count - removeCount, removeCount ); } else { _target.nodeCount = _target.nodes.Count; } } //node display: EditorGUI.indentLevel = 4; for(int i = 0; i < _target.nodes.Count; i++) { _target.nodes[i] = EditorGUILayout.Vector3Field( "Node " + ( i + 1 ), _target.nodes[i] ); } //update and redraw: if(GUI.changed) { EditorUtility.SetDirty( _target ); } } void OnSceneGUI() { if(_target.pathVisible) { if(_target.nodes.Count > 0) { //allow path adjustment undo: Undo.RecordObject( _target, "Adjust iTween Path" ); //path begin and end labels: Handles.Label( _target.nodes[0], "'" + _target.pathName + "' Begin", style ); Handles.Label( _target.nodes[_target.nodes.Count - 1], "'" + _target.pathName + "' End", style ); //node handle display: for(int i = 0; i < _target.nodes.Count; i++) { _target.nodes[i] = Handles.PositionHandle( _target.nodes[i], Quaternion.identity ); } } } } }