public static bool DrawSensorHandle(VertExmotionSensorBase sensor) { bool useHandle = false; Color handleColor = VertExmotionEditor.orange; Handles.color = handleColor; Camera svCam = SceneView.currentDrawingSceneView.camera; float constUnit = (svCam.ViewportToWorldPoint(Vector3.zero) - svCam.ViewportToWorldPoint(Vector3.one)).magnitude; constUnit = HandleUtility.GetHandleSize(sensor.transform.position) * 10f; if (m_settingMode == eSettingsMode.SENSORS) { Handles.DrawSolidDisc(sensor.transform.position, -svCam.transform.forward, (constUnit * .01f)); Handles.DrawWireDisc(sensor.transform.position, -svCam.transform.forward, sensor.m_envelopRadius * VertExmotionBase.GetScaleFactor(sensor.transform)); for (int i = 0; i < 10; ++i) { handleColor.a = (float)(10 - i) / 10f * .5f; float f = (float)i / 11f * (float)i / 11f; Handles.color = handleColor; Handles.DrawWireDisc(sensor.transform.position, -svCam.transform.forward, sensor.m_envelopRadius * VertExmotionBase.GetScaleFactor(sensor.transform) * f); } handleColor = VertExmotionEditor.orange; Handles.color = handleColor; Vector3 lastPos = sensor.transform.position; sensor.transform.position = Handles.FreeMoveHandle(sensor.transform.position, Quaternion.identity, (constUnit * .02f), Vector3.zero, Handles.CircleCap); if (lastPos != sensor.transform.position) { useHandle = true; } float lastRadius = sensor.m_envelopRadius; if (VertExmotionBase.GetScaleFactor(sensor.transform) > 0) { sensor.m_envelopRadius = Vector3.Distance( Handles.FreeMoveHandle(sensor.transform.position + svCam.transform.right * sensor.m_envelopRadius * VertExmotionBase.GetScaleFactor(sensor.transform), Quaternion.identity, (constUnit * .02f), Vector3.zero, Handles.CubeCap) , sensor.transform.position) / VertExmotionBase.GetScaleFactor(sensor.transform); } if (lastRadius != sensor.m_envelopRadius) { useHandle = true; } Handles.color = Color.cyan; //draw direction lastPos = sensor.transform.position + sensor.transform.forward * constUnit * .1f; Handles.DrawLine(sensor.transform.position, lastPos); lastPos = Handles.FreeMoveHandle(lastPos, Quaternion.identity, (constUnit * .01f), Vector3.zero, Handles.CircleCap); if (lastPos != sensor.transform.position + sensor.transform.forward * constUnit * .1f) { sensor.transform.LookAt(lastPos); useHandle = true; } //-------------------------------------------------- //draw sensors limits //-------------------------------------------------- Color col = Color.blue; col.a = .01f; Handles.color = col; Vector3[] limitAxis = new Vector3[4]; limitAxis [0] = sensor.transform.right; limitAxis [1] = -sensor.transform.right; limitAxis [2] = sensor.transform.up; limitAxis [3] = -sensor.transform.up; float sf = VertExmotionBase.GetScaleFactor(sensor.transform); for (int n = 0; n < 4; n++) { col.a = .3f; Handles.color = col; float max = 20f; Vector3[] points = new Vector3[(int)max + 1]; for (float i = 0; i <= max; ++i) { Vector3 p1 = Quaternion.AngleAxis(i / max * 180f, limitAxis[n]) * sensor.transform.forward * Mathf.Max(sensor.m_params.translation.innerMaxDistance, sensor.m_params.translation.outerMaxDistance) * sf; float lerpFactor = (Vector3.Dot(sensor.transform.forward, p1.normalized) + 1f) * .5f; float clampMag = (Mathf.Lerp(sensor.m_params.translation.innerMaxDistance, sensor.m_params.translation.outerMaxDistance, lerpFactor) * sf); p1 = Vector3.ClampMagnitude(p1, clampMag); p1 += sensor.transform.position; if (i % 4 == 0) { Handles.DrawDottedLine(sensor.transform.position, p1, 3f); } points[(int)i] = p1; } col.a = .5f; Handles.color = col; Handles.DrawPolyLine(points); } col.a = .03f; Handles.color = col; Handles.DrawSolidDisc(sensor.transform.position, sensor.transform.forward, (sensor.m_params.translation.innerMaxDistance + sensor.m_params.translation.outerMaxDistance) * .5f * sf); col.a = .5f; Handles.color = col; Handles.DrawWireDisc(sensor.transform.position, sensor.transform.forward, (sensor.m_params.translation.innerMaxDistance + sensor.m_params.translation.outerMaxDistance) * .5f * sf); } //-------------------------------------------------- //draw collider handles //-------------------------------------------------- if (m_settingMode == eSettingsMode.COLLIDERS) { VertExmotionColliderBase vtmCol = sensor.GetComponentInChildren <VertExmotionColliderBase>(); Handles.color = Color.cyan; if (vtmCol != null) { for (int i = 0; i < vtmCol.m_collisionZones.Count; ++i) { Vector3 worldColZonePos = vtmCol.transform.TransformPoint(vtmCol.m_collisionZones[i].positionOffset); float radius = vtmCol.m_collisionZones[i].radius * VertExmotionBase.GetScaleFactor(vtmCol.transform); //Handles.DrawSolidDisc( vtmCol.m_collisionZones[i].positionOffset + sensor.transform.position , -svCam.transform.forward, ( constUnit*.01f ) ); Handles.color = m_collisionZoneAlpha; Handles.DrawSolidDisc(worldColZonePos, -svCam.transform.forward, radius); Handles.color = m_collisionZone; Handles.DrawWireDisc(worldColZonePos, sensor.transform.forward, radius); Handles.DrawWireDisc(worldColZonePos, sensor.transform.up, radius); Handles.DrawWireDisc(worldColZonePos, sensor.transform.right, radius); Handles.DrawSolidDisc(worldColZonePos, -svCam.transform.forward, (constUnit * .01f)); if (VertExmotionBase.GetScaleFactor(vtmCol.transform) > 0) { vtmCol.m_collisionZones[i].radius = Vector3.Distance( Handles.FreeMoveHandle(worldColZonePos + svCam.transform.right * radius, Quaternion.identity, (constUnit * .02f), Vector3.zero, Handles.CubeCap) , worldColZonePos) / VertExmotionBase.GetScaleFactor(vtmCol.transform); } vtmCol.m_collisionZones[i].positionOffset = vtmCol.transform.InverseTransformPoint(Handles.FreeMoveHandle(worldColZonePos, Quaternion.identity, (constUnit * .02f), Vector3.zero, Handles.CircleCap)); } } } if (useHandle) { EditorUtility.SetDirty(sensor); } return(useHandle); }
public static void DrawSensorSettings(VertExmotionSensorBase sensor) { PID pid = new PID(); pid.m_params = new PID.Parameters(sensor.m_pid.m_params); pid.m_params.limits.x = -float.MaxValue; pid.m_params.limits.y = float.MaxValue; //float timeUnit = EditorGUILayout.FloatField ("time unit (s)",m_timeUnit); //timeUnit = Mathf.Clamp ( timeUnit, 0.1f, 30f); GUILayout.Space(10); //if( GUILayout.Button( (m_showSensorSettings?"-":"+") + "Sensor Settings", VertExmotionEditor.m_styleTitle ) ) if (GUILayout.Button((m_settingMode == eSettingsMode.SENSORS?"-":"+") + "Sensor Settings", VertExmotionEditor.m_styleTitle)) { //m_showSensorSettings = !m_showSensorSettings; m_settingMode = m_settingMode == eSettingsMode.SENSORS ? eSettingsMode.NONE : eSettingsMode.SENSORS; //if( m_showSensorSettings ) m_showColliderSettings = false; } //if( m_showSensorSettings ) //if( m_settingMode == eSettingsMode.SENSORS ) if (BeginFadeGroup(eSettingsMode.SENSORS)) { GUILayout.Label("Lock your sensor to a gameobject"); GUILayout.Label("Set a bone for skinnedMesh"); GUILayout.BeginHorizontal(); GUILayout.Label("parent", GUILayout.Width(75f)); sensor.m_parent = EditorGUILayout.ObjectField(sensor.m_parent, typeof(Transform), true) as Transform; GUILayout.EndHorizontal(); GUILayout.Space(5); GUILayout.Label("motion settings : ", VertExmotionEditor.m_styleBold); //sensor.m_params.translation.innerAmplitude = Mathf.Clamp( EditorGUILayout.FloatField( "outer amplitude", sensor.m_params.translation.innerAmplitude ), 0, float.MaxValue ); //sensor.m_params.translation.amplitudeMultiplier = sensor.m_params.translation.amplitude; sensor.m_params.translation.amplitudeMultiplier = Mathf.Clamp(EditorGUILayout.FloatField("Amplitude multiplier", sensor.m_params.translation.amplitudeMultiplier), 0, float.MaxValue); //sensor.m_params.translation.amplitude = sensor.m_params.translation.amplitudeMultiplier; sensor.m_params.translation.outerMaxDistance = Mathf.Clamp(EditorGUILayout.FloatField("Outer max distance", sensor.m_params.translation.outerMaxDistance), 0, float.MaxValue); sensor.m_params.translation.innerMaxDistance = Mathf.Clamp(EditorGUILayout.FloatField("Inner max distance", sensor.m_params.translation.innerMaxDistance), 0, float.MaxValue); sensor.m_params.inflate = EditorGUILayout.FloatField("Inflate", sensor.m_params.inflate); sensor.m_params.damping = Mathf.Clamp(EditorGUILayout.FloatField("Damping", sensor.m_params.damping), 0, 30f); sensor.m_pid.m_params.kp = sensor.m_params.damping; sensor.m_params.bouncing = Mathf.Clamp(EditorGUILayout.FloatField("Bouncing", sensor.m_params.bouncing), 0, 30f); sensor.m_pid.m_params.ki = sensor.m_params.bouncing; //GUILayout.Label( "", GUILayout.Height(50f) ); GUILayout.Box(" ", VertExmotionEditor.m_bgStyle, GUILayout.Height(50f), GUILayout.ExpandWidth(true)); GUIDrawPidResponse(pid, GUILayoutUtility.GetLastRect(), sensor.m_pidTime); sensor.m_pidTime = EditorGUILayout.Slider("t (s)", sensor.m_pidTime, 1f, 10f); EditorGUILayout.EndFadeGroup(); } //----------------------------------------------- //FX settings //----------------------------------------------- GUILayout.Space(10); if (GUILayout.Button((m_settingMode == eSettingsMode.FX?"-":"+") + "FX Settings", VertExmotionEditor.m_styleTitle)) { m_settingMode = m_settingMode == eSettingsMode.FX ? eSettingsMode.NONE : eSettingsMode.FX; } //if( m_settingMode == eSettingsMode.FX ) if (BeginFadeGroup(eSettingsMode.FX)) { sensor.m_params.translation.gravityInOut = EditorGUILayout.Vector2Field("Gravity in/out", sensor.m_params.translation.gravityInOut); sensor.m_params.translation.localOffset = EditorGUILayout.Vector3Field("Local offset", sensor.m_params.translation.localOffset); sensor.m_params.translation.worldOffset = EditorGUILayout.Vector3Field("World offset", sensor.m_params.translation.worldOffset); sensor.m_params.fx.squash = EditorGUILayout.FloatField("Stretch", sensor.m_params.fx.squash); sensor.m_params.fx.stretchMax = EditorGUILayout.FloatField("Stretch max dist", sensor.m_params.fx.stretchMax); sensor.m_params.fx.stretchMinSpeed = EditorGUILayout.FloatField("Stretch min speed", sensor.m_params.fx.stretchMinSpeed); EditorGUILayout.EndFadeGroup(); } //----------------------------------------------- //collider settings //----------------------------------------------- GUILayout.Space(10); if (GUILayout.Button((m_settingMode == eSettingsMode.COLLIDERS?"-":"+") + "Collider Settings", VertExmotionEditor.m_styleTitle)) { m_settingMode = m_settingMode == eSettingsMode.COLLIDERS ? eSettingsMode.NONE : eSettingsMode.COLLIDERS; } //if( m_settingMode == eSettingsMode.COLLIDERS ) if (BeginFadeGroup(eSettingsMode.COLLIDERS)) { VertExmotionColliderBase vtmCol = sensor.GetComponentInChildren <VertExmotionColliderBase>(); if (vtmCol == null) { if (GUILayout.Button("Add collider")) { EditorPrefs.SetInt("VertExmotion_LastMode", (int)VertExmotionEditor.eMode.SENSORS); GameObject go = new GameObject("VMCollider"); go.transform.parent = sensor.transform; go.transform.localScale = Vector3.one; go.transform.localPosition = Vector3.zero; go.transform.localRotation = Quaternion.identity; VertExmotionColliderBase collider = go.AddComponent <VertExmotionColliderBase>(); VertExmotionEditor.ReplaceBaseClass(collider); m_removeCollider = false; } } else { //draw collider GUI string[] options = new string[32]; for (int i = 0; i < 32; ++i) { options[i] = LayerMask.LayerToName(i); } vtmCol.m_layerMask = EditorGUILayout.MaskField("layer mask", vtmCol.m_layerMask, options); //show collision zone param int colZoneToDelete = -1; for (int j = 0; j < vtmCol.m_collisionZones.Count; ++j) { GUILayout.BeginHorizontal(); GUILayout.Label("Zone " + j, VertExmotionEditor.m_styleBold); GUILayout.FlexibleSpace(); if (GUILayout.Button("delete")) { colZoneToDelete = j; } GUILayout.EndHorizontal(); vtmCol.m_collisionZones[j].positionOffset = EditorGUILayout.Vector3Field("position", vtmCol.m_collisionZones[j].positionOffset); vtmCol.m_collisionZones[j].radius = EditorGUILayout.FloatField("radius", vtmCol.m_collisionZones[j].radius); EditorUtility.SetDirty(vtmCol); } if (colZoneToDelete != -1) { vtmCol.m_collisionZones.RemoveAt(colZoneToDelete); } if (GUILayout.Button("Add collision zone")) { vtmCol.m_collisionZones.Add(new VertExmotionColliderBase.CollisionZone()); } GUILayout.Space(10); //remove collider if (!m_removeCollider) { if (GUILayout.Button("Remove collider")) { m_removeCollider = true; } } else { GUILayout.BeginHorizontal(); GUILayout.Label("remove collider?"); if (GUILayout.Button("yes")) { if (Application.isPlaying) { Destroy(vtmCol.gameObject); } else { DestroyImmediate(vtmCol.gameObject); } } if (GUILayout.Button("no")) { m_removeCollider = false; } GUILayout.EndHorizontal(); } } EditorGUILayout.EndFadeGroup(); } EditorUtility.SetDirty(sensor); }