示例#1
0
        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);
        }