Exemple #1
0
 public override void OnInspectorGUI()
 {
     base.OnInspectorGUI();
     serializedObject.Update();
     stateMaskProperty.intValue = (int)(EGameState)EditorGUILayout.EnumMaskPopup("Active states", (EGameState)stateMaskProperty.intValue);
     serializedObject.ApplyModifiedProperties();
 }
Exemple #2
0
    public override void OnInspectorGUI()
    {
        BPhysicsWorld pw = (BPhysicsWorld)target;

        pw.DoDebugDraw   = EditorGUILayout.Toggle(gcDoDebugDraw, pw.DoDebugDraw);
        pw.DebugDrawMode = (BulletSharp.DebugDrawModes)EditorGUILayout.EnumMaskPopup(DebugDrawMode, pw.DebugDrawMode);

        pw.worldType = (BPhysicsWorld.WorldType)EditorGUILayout.EnumPopup("World Type", pw.worldType);
        EditorGUILayout.Separator();
        pw.gravity = EditorGUILayout.Vector3Field("Gravity", pw.gravity);
        EditorGUILayout.Separator();

        pw.collisionType = (BPhysicsWorld.CollisionConfType)EditorGUILayout.EnumPopup("Collision Type", pw.collisionType);


        pw.broadphaseType          = (BPhysicsWorld.BroadphaseType)EditorGUILayout.EnumPopup("Broadphase Algorithm", pw.broadphaseType);
        pw.axis3SweepBroadphaseMin = EditorGUILayout.Vector3Field("Broadphase Axis 3 Sweep Min", pw.axis3SweepBroadphaseMin);
        pw.axis3SweepBroadphaseMax = EditorGUILayout.Vector3Field("Broadphase Axis 3 Sweep Max", pw.axis3SweepBroadphaseMax);

        pw.debugType = EditorInterface.DrawDebug(pw.debugType, pw);

        if (GUI.changed)
        {
            EditorUtility.SetDirty(pw);
            EditorSceneManager.MarkSceneDirty(EditorSceneManager.GetActiveScene());
            Undo.RecordObject(pw, "Undo Physics World");
        }
    }
    private void DrawEnemyThreshold(int idx)
    {
        //EditorGUILayout.BeginVertical();
        // Activation Day
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.BeginVertical();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.PrefixLabel("Activation Day:");
        qParamTarget.enemyThresholds[idx].DayMarker = EditorGUILayout.IntField(qParamTarget.enemyThresholds[idx].DayMarker);
        EditorGUILayout.EndHorizontal();

        //// Activation Rep
        //EditorGUILayout.BeginHorizontal();
        //EditorGUILayout.PrefixLabel("Activation Rep:");
        //qParamTarget.enemyThresholds[idx].RepMarker = EditorGUILayout.IntField(qParamTarget.enemyThresholds[idx].RepMarker);
        //EditorGUILayout.EndHorizontal();

        // Type and button
        qParamTarget.enemyThresholds[idx].AvailableEnemies = (EnemyTypes)EditorGUILayout.EnumMaskPopup(new GUIContent(), qParamTarget.enemyThresholds[idx].AvailableEnemies);
        EditorGUILayout.EndVertical();
        if (GUILayout.Button("-"))
        {
            qParamTarget.enemyThresholds.RemoveAt(idx);
        }
        EditorGUILayout.EndHorizontal();

        //EditorGUILayout.EndVertical();
    }
Exemple #4
0
 protected override bool DrawWizardGUI()
 {
     EditorGUILayout.LabelField(new GUIContent("Stash Message:"));
     stashMessage   = EditorGUILayout.TextArea(stashMessage, GUILayout.Height(EditorGUIUtility.singleLineHeight * 6));
     stashModifiers = (StashModifiers)EditorGUILayout.EnumMaskPopup("Stash Modifiers", stashModifiers);
     return(false);
 }
Exemple #5
0
    void OnGUI()
    {
        EditorGUILayout.BeginHorizontal();

        EditorGUILayout.BeginVertical();
        tex0       = (Texture2D)EditorGUILayout.ObjectField(tex0, typeof(Texture2D), false);
        tex0invert = EditorGUILayout.Toggle("Invert", tex0invert);
        tex0r      = (Channel)EditorGUILayout.EnumMaskPopup("R channel map", tex0r);
        tex0g      = (Channel)EditorGUILayout.EnumMaskPopup("G channel map", tex0g);
        tex0b      = (Channel)EditorGUILayout.EnumMaskPopup("B channel map", tex0b);
        tex0a      = (Channel)EditorGUILayout.EnumMaskPopup("A channel map", tex0a);
        EditorGUILayout.EndVertical();

        EditorGUILayout.Space();

        EditorGUILayout.BeginVertical();
        tex1       = (Texture2D)EditorGUILayout.ObjectField(tex1, typeof(Texture2D), false);
        tex1invert = EditorGUILayout.Toggle("Invert", tex1invert);
        tex1r      = (Channel)EditorGUILayout.EnumMaskPopup("R channel map", tex1r);
        tex1g      = (Channel)EditorGUILayout.EnumMaskPopup("G channel map", tex1g);
        tex1b      = (Channel)EditorGUILayout.EnumMaskPopup("B channel map", tex1b);
        tex1a      = (Channel)EditorGUILayout.EnumMaskPopup("A channel map", tex1a);
        EditorGUILayout.EndVertical();

        EditorGUILayout.EndHorizontal();

        EditorGUILayout.Space();

        if (GUILayout.Button("Create"))
        {
            Create();
            Close();
        }
    }
Exemple #6
0
        void OnGUI()
        {
            GUILayout.BeginVertical();
            GUILayout.BeginHorizontal();
            if (string.IsNullOrEmpty(m_bundlePath))
            {
                m_bundlePath = EditorUserBuildSettings.GetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath");
            }
            var bp = GUILayout.TextField(m_bundlePath);

            if (bp != m_bundlePath)
            {
                EditorUserBuildSettings.SetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath", m_bundlePath = bp);
            }
            if (GUILayout.Button("Browse"))
            {
                BrowseForFolder();
            }
            GUILayout.EndHorizontal();

            m_ForceRebuild = GUILayout.Toggle(m_ForceRebuild, "Force Rebuild/Clear Bundle Folder");
            m_buildTarget  = (BuildTarget)EditorGUILayout.EnumPopup("Target", m_buildTarget);
            m_options      = (BuildAssetBundleOptions)EditorGUILayout.EnumMaskPopup("Options", m_options);

            if (GUILayout.Button("Build"))
            {
                if (string.IsNullOrEmpty(m_bundlePath))
                {
                    BrowseForFolder();
                }

                if (m_ForceRebuild)
                {
                    if (EditorUtility.DisplayDialog("File delete confirmation", "Do you want to delete all files in the directory " + m_bundlePath + "?", "Yes", "No"))
                    {
                        try
                        {
                            if (Directory.Exists(m_bundlePath))
                            {
                                Directory.Delete(m_bundlePath, true);
                            }
                        }
                        catch (System.Exception e)
                        {
                            Debug.LogException(e);
                        }
                    }
                }
                if (!Directory.Exists(m_bundlePath))
                {
                    Directory.CreateDirectory(m_bundlePath);
                }
                BuildPipeline.BuildAssetBundles(m_bundlePath, m_options, m_buildTarget);
                AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                // m_showSummary = true;
            }
            GUILayout.EndVertical();
        }
Exemple #7
0
        void OnGUI()
        {
            GUILayout.Space(5);

            if (buildingEditor == null) // close the window if we dont have a reference to our building editor window, can happens due to unity compiling scripts.
            {
                Close();
            }

            GUILayout.BeginVertical("Property Creator Editor Window", boxStyle);

            GUILayout.Space(20);

            propertyName   = EditorGUILayout.TextField(new GUIContent("Name :", "What is the name of this property ?, can be used for knowing what that property is being used for."), propertyName);
            positionAnchor = (SocketPositionAnchor)EditorGUILayout.EnumPopup(new GUIContent("Starting Position Anchor :", "Where will it spawn the object in the building local position ? use this to help you position your property faster, it doesnt influence any further features."), positionAnchor);

            if (creatingType == ModifierType.Socket)
            {
                previewGameObject = (GameObject)EditorGUILayout.ObjectField(new GUIContent("Socket Gizmos Preview GameObject :", "This GameObject will be used for preview on gizmos, it will grab the parameters from it into the collider to hlep you easily get your scale right."), previewGameObject, typeof(GameObject), false);
                receivesBuildings = (BuildingType)EditorGUILayout.EnumMaskPopup(new GUIContent("Receive Buildings :", "What building will be snapped into this socket ?"), receivesBuildings);
                socketPlacingType = (PlacingRestrictionType)EditorGUILayout.EnumMaskPopup(new GUIContent("Placing Type :", "What the placing method will be on this socket ?"), socketPlacingType);
            }
            else if (creatingType == ModifierType.Condition)
            {
                condition = EditorGUILayout.ObjectField(new GUIContent("Condition Script :", "What condition script will this condition use ? you can always edit it later. if you leave this blank it will use the BaseCondition script. "), condition, typeof(MonoScript), false) as MonoScript;

                if (condition != null && !condition.GetClass().BaseType.Equals(typeof(BaseCondition))) // reset condition if its type isnt what we need ( a condition ).
                {
                    condition = null;
                }
            }
            else // snap points
            {
                targetType = (BuildingType)EditorGUILayout.EnumMaskField("Target type :", targetType);
            }

            if (GUILayout.Button("Create " + creatingType.ToString()))
            {
                if (creatingType == ModifierType.Socket)
                {
                    buildingEditor.script.CreateSocket(propertyName, positionAnchor, previewGameObject, receivesBuildings, socketPlacingType);
                }
                else if (creatingType == ModifierType.Condition)
                {
                    buildingEditor.script.CreateCondition(propertyName, positionAnchor, condition == null ? typeof(BaseCondition) : condition.GetClass());
                }
                else if (creatingType == ModifierType.SnapPoint)
                {
                    buildingEditor.script.CreateSnapPoint(propertyName, positionAnchor, targetType);
                }

                Close();
            }
            else
            {
                EditorGUILayout.EndVertical();
            }
        }
Exemple #8
0
        private void OnGUI()
        {
            EditorGUILayout.BeginHorizontal();
            {
                EditorGUILayout.LabelField("Bundle Folder: ", GUILayout.MaxWidth(100));
                EditorPrefs.SetString("SimpleBundlerBundleDir", EditorGUILayout.TextField(EditorPrefs.GetString("SimpleBundlerBundleDir", defaultAssetBundleDirectory)));
                if (GUILayout.Button("...", GUILayout.Width(30)))
                {
                    EditorPrefs.SetString("SimpleBundlerBundleDir", (EditorUtility.OpenFolderPanel("Select an Asset Bundle Directory", EditorPrefs.GetString("SimpleBundlerBundleDir", defaultAssetBundleDirectory), "").Remove(0, Directory.GetCurrentDirectory().Length + 1)));
                }
            }
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            {
                EditorGUILayout.LabelField("Output Folder: ", GUILayout.MaxWidth(100));
                EditorPrefs.SetString("SimpleBundlerOutputDir", EditorGUILayout.TextField(EditorPrefs.GetString("SimpleBundlerOutputDir", defaultOutputDirectory)));
                if (GUILayout.Button("...", GUILayout.Width(30)))
                {
                    EditorPrefs.SetString("SimpleBundlerOutputDir", (EditorUtility.OpenFolderPanel("Select an Output Directory", EditorPrefs.GetString("SimpleBundlerOutputDir", defaultAssetBundleDirectory), "").Remove(0, Directory.GetCurrentDirectory().Length + 1)));
                }
            }
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            {
                EditorGUILayout.LabelField("Clear Output Folder on Build:", GUILayout.MaxWidth(200));
                EditorPrefs.SetBool("SimpleBundlerClearOnBuild", EditorGUILayout.Toggle(EditorPrefs.GetBool("SimpleBundlerClearOnBuild", true)));
            }
            EditorGUILayout.EndHorizontal();

            buildOptions = (BuildAssetBundleOptions)EditorGUILayout.EnumMaskPopup("Build Options: ", buildOptions);

            if (GUILayout.Button("Build AssetBundles"))
            {
                var buildInfo = BuildAllAssetBundles(buildOptions);
                cachedInfo = new List <CachedBuildInfo>();
                for (var i = 0; i < buildInfo.Count; i++)
                {
                    var info = new CachedBuildInfo();
                    info.BundlePaths = new List <string>();
                    info.LocalPaths  = new List <string>();
                    info.BuildName   = buildInfo[i].assetBundleName;
                    info.Variant     = buildInfo[i].assetBundleVariant;
                    for (var j = 0; j < buildInfo[i].addressableNames.Length; j++)
                    {
                        info.BundlePaths.Add(buildInfo[i].addressableNames[j]);
                        info.LocalPaths.Add(buildInfo[i].assetNames[j]);
                    }
                    cachedInfo.Add(info);
                }
            }

            DisplayResults();
        }
        public void OnGUI(Rect pos)
        {
            //options
            EditorGUILayout.Space();
            GUILayout.BeginVertical();
            m_buildTarget     = (ValidBuildTarget)EditorGUILayout.EnumPopup("Target", m_buildTarget);
            m_options         = (BuildAssetBundleOptions)EditorGUILayout.EnumMaskPopup("Options", m_options);
            m_ForceRebuild    = GUILayout.Toggle(m_ForceRebuild, "Clear all build folders on build");
            m_CopyToStreaming = GUILayout.Toggle(m_CopyToStreaming, "Copy bundles to " + m_streamingPath);


            //output path
            EditorGUILayout.Space();
            m_UseDefaultPath = GUILayout.Toggle(m_UseDefaultPath, "Use default output directory.");
            GUILayout.BeginHorizontal();
            if (string.IsNullOrEmpty(m_outputPath))
            {
                m_outputPath = EditorUserBuildSettings.GetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath");
            }

            var origPath = m_outputPath;

            if (m_UseDefaultPath)
            {
                m_outputPath  = "AssetBundles/";
                m_outputPath += m_buildTarget.ToString();
                GUILayout.Label("Output Directory:  ");
                GUILayout.Label(m_outputPath);
            }
            else
            {
                GUILayout.Label("Output Directory:  ");
                m_outputPath = GUILayout.TextArea(m_outputPath);
            }
            if (m_outputPath != origPath)
            {
                EditorUserBuildSettings.SetPlatformSettings(EditorUserBuildSettings.activeBuildTarget.ToString(), "AssetBundleOutputPath", m_outputPath);
            }
            GUILayout.EndHorizontal();
            EditorGUILayout.Space();



            // build.
            EditorGUILayout.Space();
            if (GUILayout.Button("Build"))
            {
                ExecuteBuild();
            }
            GUILayout.EndVertical();
        }
Exemple #10
0
        void OnGUI()
        {
            GUILayout.BeginVertical();
            GUILayout.BeginHorizontal();
            m_bundlePath = GUILayout.TextField(m_bundlePath);
            if (GUILayout.Button("Browse"))
            {
                BrowseForFolder();
            }
            GUILayout.EndHorizontal();

            m_ForceRebuild = GUILayout.Toggle(m_ForceRebuild, "Force Rebuild/Clear Bundle Folder");
            m_buildTarget  = (BuildTarget)EditorGUILayout.EnumPopup("Target", m_buildTarget);
            m_options      = (BuildAssetBundleOptions)EditorGUILayout.EnumMaskPopup("Options", m_options);

            if (GUILayout.Button("Build"))
            {
                if (string.IsNullOrEmpty(m_bundlePath))
                {
                    BrowseForFolder();
                }

                if (!Directory.Exists(m_bundlePath))
                {
                    Debug.Log("Invalid bundle path " + m_bundlePath);
                }
                else
                {
                    if (m_ForceRebuild)
                    {
                        if (EditorUtility.DisplayDialog("File delete confirmation", "Do you want to delete all files in the directory " + m_bundlePath + "?", "Yes", "No"))
                        {
                            Directory.Delete(m_bundlePath, true);
                            Directory.CreateDirectory(m_bundlePath);
                        }
                    }
                    BuildPipeline.BuildAssetBundles(m_bundlePath, BuildAssetBundleOptions.None, m_buildTarget);
                    AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
                    m_showSummary = true;
                }
            }
            GUILayout.EndVertical();
        }
    private void DrawDifficultyDefinition(int idx)
    {
        if (qParamTarget.difficultyDefinitions[idx] == null)
        {
            qParamTarget.difficultyDefinitions[idx] = new DifficultyDefinition();
        }

        var newDefinition = qParamTarget.difficultyDefinitions[idx];

        diffDefIsToggled[idx] = EditorGUILayout.Foldout(
            diffDefIsToggled[idx],
            string.Format("Difficulty Definition ({0})", DifficultyFromInt(idx))
            );

        if (diffDefIsToggled[idx])
        {
            EditorGUI.indentLevel++;
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Min/Max Non-suicide:");
            newDefinition.minNonSuicide = EditorGUILayout.IntField(newDefinition.minNonSuicide);
            newDefinition.maxNonSuicide = EditorGUILayout.IntField(newDefinition.maxNonSuicide);
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Min/Max Suicide:");
            newDefinition.minSuicide = EditorGUILayout.IntField(newDefinition.minSuicide);
            newDefinition.maxSuicide = EditorGUILayout.IntField(newDefinition.maxSuicide);
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("Min/Max Friendlies (Obsolete):");
            newDefinition.minFriendlies = EditorGUILayout.IntField(newDefinition.minFriendlies);
            newDefinition.maxFriendlies = EditorGUILayout.IntField(newDefinition.maxFriendlies);
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("House Status:");
            newDefinition.houseStatus = (HouseStatus)EditorGUILayout.EnumMaskPopup(new GUIContent(), newDefinition.houseStatus);
            EditorGUILayout.EndHorizontal();
            EditorGUI.indentLevel--;
        }
    }
        public override void DrawFeatureGUI(Material mat)
        {
            detailNoise       = EditorGUILayout.Toggle(CDetailNoise, detailNoise);
            distanceNoise     = EditorGUILayout.Toggle(CDistanceNoise, distanceNoise);
            noiseChannelCount = (NormalNoiseChannels)EditorGUILayout.EnumPopup(CNormalNoise, noiseChannelCount);

#if __MICROSPLAT_TRIPLANAR__
            if (detailNoise || distanceNoise || noiseChannelCount != NormalNoiseChannels.Off)
            {
                EditorGUI.indentLevel++;
                antiTileTriplanar = EditorGUILayout.Toggle(CTriplanarControls, antiTileTriplanar);
                EditorGUI.indentLevel--;
            }
#endif

            distanceResample = (DistanceResampleMode)EditorGUILayout.EnumPopup(CDistanceResample, distanceResample);
#if __MICROSPLAT_TEXTURECLUSTERS__
            if (distanceResample != DistanceResampleMode.None)
            {
                EditorGUI.indentLevel++;
                resampleClusters = EditorGUILayout.Toggle(CResampleClusters, resampleClusters);
                EditorGUI.indentLevel--;
            }
#endif

            if (distanceResample != DistanceResampleMode.None)
            {
                EditorGUI.indentLevel++;
                distanceResampleHeightBlend = EditorGUILayout.Toggle(CDistanceResampleHeightBlend, distanceResampleHeightBlend);
                distanceResampleFade        = (DistanceResampleFade)EditorGUILayout.EnumPopup(CDistanceResampleFade, distanceResampleFade);
                EditorGUI.indentLevel--;
            }

#if UNITY_2017_3_OR_NEWER
            antiTileOptions = (AntiTileOptions)EditorGUILayout.EnumFlagsField(CAntiTileOptions, antiTileOptions);
#else
            antiTileOptions = (AntiTileOptions)EditorGUILayout.EnumMaskPopup(CAntiTileOptions, antiTileOptions);
#endif
        }
    public void BakingGUI(MicroSplatTerrain t)
    {
        if (needsBake && Event.current.type == EventType.Repaint)
        {
            needsBake = false;
            Bake(t);
        }
        if (MicroSplatUtilities.DrawRollup("Render Baking", false))
        {
            res = (BakingResolutions)EditorGUILayout.EnumPopup(new GUIContent("Resolution"), res);

         #if UNITY_2017_3_OR_NEWER
            passes = (BakingPasses)EditorGUILayout.EnumFlagsField(new GUIContent("Features"), passes);
         #else
            passes = (BakingPasses)EditorGUILayout.EnumMaskPopup(new GUIContent("Features"), passes);
         #endif

            if (GUILayout.Button("Export Selected"))
            {
                needsBake = true;
            }
        }
    }
Exemple #14
0
        protected override void RenderContent(UnityEngine.Object undoRecordObject)
        {
            int newInt; string newString; bool newBool;

            var content = new GUIContent();

            content.text    = "Object types";
            content.tooltip = "The types of objects that can participate in the conversion operation. Applies to both scene objects and prefabs.";
            newInt          = (int)((GameObjectType)EditorGUILayout.EnumMaskPopup(content, (GameObjectType)_convertableObjectTypes));
            if (newInt != (int)_convertableObjectTypes)
            {
                EditorUndoEx.Record(undoRecordObject);
                _convertableObjectTypes = (GameObjectType)newInt;
            }

            content.text    = "Prefab folder";
            content.tooltip = "Allows you to specify a folder which contains prefabs that need to be converted. You can either write the path manually or " +
                              "simply drag and drop a folder onto the text field to have the path automatically extracted for you.";
            newString = EditorGUILayout.TextField(content, PrefabFolder);
            if (newString != PrefabFolder)
            {
                EditorUndoEx.Record(undoRecordObject);
                PrefabFolder = newString;
            }
            _prefabFolderDropRect = GUILayoutUtility.GetLastRect();

            content.text    = "Process prefab subfolders";
            content.tooltip = "If this is checked, the conversion utility will also convert prefabs which reside in any subfolders that reside in the specified folder. Otherwise, " +
                              "subfolders are ignored.";
            newBool = EditorGUILayout.ToggleLeft(content, ProcessPrefabSubfolders);
            if (newBool != ProcessPrefabSubfolders)
            {
                EditorUndoEx.Record(undoRecordObject);
                ProcessPrefabSubfolders = newBool;
            }
        }
Exemple #15
0
        private static void Preferences()
        {
            using (EditorGUI.ChangeCheckScope changeCheckScope = new EditorGUI.ChangeCheckScope())
            {
                EditorGUILayout.LabelField("All", EditorStyles.helpBox);
                                #if UNITY_2017_3_OR_NEWER
                zoomToCursor = (ZoomToCursor)EditorGUILayout.EnumFlagsField("Zoom To Cursor", zoomToCursor);
                                #else
                zoomToCursor = (ZoomToCursor)EditorGUILayout.EnumMaskPopup("Zoom To Cursor", zoomToCursor);
                                #endif
                if (changeCheckScope.changed)
                {
                    EditorPrefs.SetInt("vertxCameraZoomToCursor", (int)zoomToCursor);
                }
            }

            using (EditorGUI.ChangeCheckScope changeCheckScope = new EditorGUI.ChangeCheckScope())
            {
                zoomToCursorIgnoresBackfaces = EditorGUILayout.Toggle("Zoom To Cursor Ignores Backfaces", zoomToCursorIgnoresBackfaces);

                if (changeCheckScope.changed)
                {
                    EditorPrefs.SetBool("vertxZoomToCursorIgnoresBackfaces", zoomToCursorIgnoresBackfaces);
                }
            }

            using (EditorGUI.ChangeCheckScope changeCheckScope = new EditorGUI.ChangeCheckScope())
            {
                EditorGUILayout.LabelField("Six Axis", EditorStyles.helpBox);
                alignCameraAutomatically = EditorGUILayout.Toggle("Align Camera Automatically", alignCameraAutomatically);
                if (changeCheckScope.changed)
                {
                    EditorPrefs.SetBool("vertxAlignCameraAutomatically", alignCameraAutomatically);
                }
            }
        }
Exemple #16
0
        public override void OnInspectorGUI()
        {
            //return;

            //base.OnInspectorGUI();
            apPortrait targetPortrait = target as apPortrait;

            if (targetPortrait != _targetPortrait)
            {
                _targetPortrait = targetPortrait;
                Init();
            }
            if (_targetPortrait == null)
            {
                //Profiler.EndSample();
                return;
            }

            //Profiler.BeginSample("anyPortrait Inspector GUI");


            //return;
            if (apEditor.IsOpen())
            {
                //에디터가 작동중에는 안보이도록 하자
                EditorGUILayout.LabelField("Editor is opened");

                //Profiler.EndSample();

                return;
            }

            try
            {
                bool          prevImportant         = _targetPortrait._isImportant;
                MonoBehaviour prevAnimEventListener = _targetPortrait._optAnimEventListener;
                int           prevSortingLayerID    = _targetPortrait._sortingLayerID;
                int           prevSortingOrder      = _targetPortrait._sortingOrder;

                _targetPortrait._isImportant          = EditorGUILayout.Toggle("Is Important", _targetPortrait._isImportant);
                _targetPortrait._optAnimEventListener = (MonoBehaviour)EditorGUILayout.ObjectField("Event Listener", _targetPortrait._optAnimEventListener, typeof(MonoBehaviour), true);


                GUILayout.Space(5);
                //추가3.22
                //Sorting Layer
                string[] sortingLayerName = new string[SortingLayer.layers.Length];
                int      layerIndex       = -1;
                for (int i = 0; i < SortingLayer.layers.Length; i++)
                {
                    sortingLayerName[i] = SortingLayer.layers[i].name;
                    if (SortingLayer.layers[i].id == _targetPortrait._sortingLayerID)
                    {
                        layerIndex = i;
                    }
                }
                int nextLayerIndex = EditorGUILayout.Popup("Sorting Layer", layerIndex, sortingLayerName);
                int nextLayerOrder = EditorGUILayout.IntField("Sorting Order", _targetPortrait._sortingOrder);

                if (nextLayerIndex != layerIndex)
                {
                    //Sorting Layer를 바꾸자
                    if (nextLayerIndex >= 0 && nextLayerIndex < SortingLayer.layers.Length)
                    {
                        string nextLayerName = SortingLayer.layers[nextLayerIndex].name;
                        _targetPortrait.SetSortingLayer(nextLayerName);
                    }
                }
                if (nextLayerOrder != _targetPortrait._sortingOrder)
                {
                    _targetPortrait.SetSortingOrder(nextLayerOrder);
                }


                if (prevImportant != _targetPortrait._isImportant ||
                    prevAnimEventListener != _targetPortrait._optAnimEventListener ||
                    prevSortingLayerID != _targetPortrait._sortingLayerID ||
                    prevSortingOrder != _targetPortrait._sortingOrder)
                {
                    apEditorUtil.SetEditorDirty();
                }

                GUILayout.Space(5);

                _isFold_RootPortraits = EditorGUILayout.Foldout(_isFold_RootPortraits, "Root Portraits");
                if (_isFold_RootPortraits)
                {
                    string strRootPortrait = "";
                    if (_targetPortrait._optRootUnitList.Count == 0)
                    {
                        strRootPortrait = "No Baked Portrait";
                    }
                    else if (_targetPortrait._optRootUnitList.Count == 1)
                    {
                        strRootPortrait = "1 Baked Portrait";
                    }
                    else
                    {
                        strRootPortrait = _targetPortrait._optRootUnitList.Count + " Baked Portraits";
                    }
                    EditorGUILayout.LabelField(strRootPortrait);
                    GUILayout.Space(5);
                    for (int i = 0; i < _targetPortrait._optRootUnitList.Count; i++)
                    {
                        apOptRootUnit rootUnit = _targetPortrait._optRootUnitList[i];
                        EditorGUILayout.ObjectField("[" + i + "]", rootUnit, typeof(apOptRootUnit), true);
                    }

                    GUILayout.Space(20);
                }



                _isFold_AnimationClips = EditorGUILayout.Foldout(_isFold_AnimationClips, "Animation Clips");
                if (_isFold_AnimationClips)
                {
                    string strAnimClips = "";
                    if (_targetPortrait._animClips.Count == 0)
                    {
                        strAnimClips = "No Animation Clip";
                    }
                    else if (_targetPortrait._animClips.Count == 1)
                    {
                        strAnimClips = "1 Animation Clip";
                    }
                    else
                    {
                        strAnimClips = _targetPortrait._animClips.Count + " Animation Clips";
                    }
                    EditorGUILayout.LabelField(strAnimClips);
                    GUILayout.Space(5);
                    for (int i = 0; i < _targetPortrait._animClips.Count; i++)
                    {
                        apAnimClip animClip = _targetPortrait._animClips[i];
                        if (animClip._uniqueID == _targetPortrait._autoPlayAnimClipID)
                        {
                            EditorGUILayout.TextField("[" + i + "] (Auto Play)", animClip._name);
                        }
                        else
                        {
                            EditorGUILayout.TextField("[" + i + "]", animClip._name);
                        }
                    }

                    GUILayout.Space(20);
                }


                bool isChanged = false;

                _isFold_ConrolParameters = EditorGUILayout.Foldout(_isFold_ConrolParameters, "Control Parameters");
                if (_isFold_ConrolParameters)
                {
#if UNITY_2017_3_OR_NEWER
                    _curControlCategory = (apControlParam.CATEGORY)EditorGUILayout.EnumFlagsField(new GUIContent("Category"), _curControlCategory);
#else
                    _curControlCategory = (apControlParam.CATEGORY)EditorGUILayout.EnumMaskPopup(new GUIContent("Category"), _curControlCategory);
#endif

                    EditorGUILayout.Space();
                    //1. 컨르롤러를 제어할 수 있도록 하자

                    if (_controlParams != null)
                    {
                        for (int i = 0; i < _controlParams.Count; i++)
                        {
                            if ((int)(_controlParams[i]._category & _curControlCategory) != 0)
                            {
                                if (GUI_ControlParam(_controlParams[i]))
                                {
                                    isChanged = true;
                                }
                            }
                        }
                    }

                    GUILayout.Space(20);
                }


                GUILayout.Space(10);

                //2. 토글 버튼을 두어서 기본 Inspector 출력 여부를 결정하자.
                string strBaseButton = "Show All Properties";
                if (_showBaseInspector)
                {
                    strBaseButton = "Hide Properties";
                }

                if (GUILayout.Button(strBaseButton, GUILayout.Height(20)))
                {
                    _showBaseInspector = !_showBaseInspector;
                }

                if (_showBaseInspector)
                {
                    base.OnInspectorGUI();
                }


                if (!Application.isPlaying && isChanged)
                {
                    //플레이 중이라면 자동으로 업데이트 될 것이다.
                    _targetPortrait.UpdateForce();
                }
            }
            catch (Exception ex)
            {
                Debug.LogError("apInspector_Portrait Exception : " + ex);
            }

            //Profiler.EndSample();
        }
        private void OnGUI()
        {
            //Unable to use a named GUIStyle without a current skin.
            //Most likely you need to move your GUIStyle initialization code to OnGUI
            //GUI风格元素需要在OnGUI方法里初始化,否则会报以上错误,界面也会发生显示错误
            if (checkStyle == null)
            {
                checkStyle = new CheckStyle();
            }

            GUILayout.BeginHorizontal(checkStyle.ToolBar, new GUILayoutOption[] { GUILayout.Width(this.position.width) });
            {
                EditorGUI.BeginChangeCheck();

                checkTypeMix = (CheckEnumType)EditorGUILayout.EnumMaskPopup(new GUIContent(titleStr), checkTypeMix, checkStyle.TE_ToolBarBtn, new GUILayoutOption[] { GUILayout.Width(600) });

                if (EditorGUI.EndChangeCheck())
                {
                    //检查类型分类
                    OnCheckTypeSelect(checkTypeMix);
                }

                EditorGUI.BeginChangeCheck();

                if (GUILayout.Button(string.Format("当前目录{0}", filePath), checkStyle.TE_ToolBarBtn))
                {
                    filePath = EditorUtility.OpenFolderPanel("选择筛选目录{0}", Application.dataPath, string.Empty);

                    var currentDir = BuildUtils.GetUnityPath(Path.GetFullPath(Directory.GetCurrentDirectory()));

                    filePath = filePath.Replace(string.Format("{0}/", currentDir), "");
                }
                if (EditorGUI.EndChangeCheck())
                {
                    checkManager.SetFilePath(filePath);

                    Debug.Log(string.Format("当前选择目录:{0}", filePath));
                }
            }
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            {
                if (GUILayout.Button("Check"))
                {
                    //检查
                    if (checkManager.GetPathListByFilePath())
                    {
                        checkManager.OnCheck();
                    }
                }

                if (GUILayout.Button("Format"))
                {
                    //处理
                    checkManager.OnFormat();
                }
            }
            GUILayout.EndHorizontal();

            #region 表格GUI绘制
            //表格 GUI 绘制
            Rect viewRect = new Rect(border * 2 + this.position.width * percet, offset * 2, this.position.width * (1 - percet) - border * 3, this.position.height - offset * 2 - border);

            if (table != null)
            {
                table.Draw(viewRect);
            }
            #endregion

            #region 检查项GUI绘制

            //检查项 itemlist 绘制
            Rect itemViewRect = new Rect(border, offset * 2, this.position.width * percet, this.position.height - offset * 2 - border);

            GUILayout.BeginArea(itemViewRect, checkStyle.WindowBackground);

            scrollview = GUILayout.BeginScrollView(scrollview, GUIStyle.none, GUI.skin.verticalScrollbar);

            DrawItemWind(itemViewRect);

            GUILayout.EndScrollView();

            GUILayout.EndArea();

            #endregion
        }
        public override void OnInspectorGUI()
        {
            //return;

            //base.OnInspectorGUI();
            apPortrait targetPortrait = target as apPortrait;

            if (targetPortrait != _targetPortrait)
            {
                _targetPortrait = targetPortrait;
                Init();
            }
            if (_targetPortrait == null)
            {
                //Profiler.EndSample();
                return;
            }

            Profiler.BeginSample("anyPortrait Inspector GUI");


            //return;
            if (apEditor.IsOpen())
            {
                //에디터가 작동중에는 안보이도록 하자
                EditorGUILayout.LabelField("Editor is opened");

                Profiler.EndSample();

                return;
            }

            try
            {
                EditorGUILayout.LabelField("Control Parameters");
                _curControlCategory = (apControlParam.CATEGORY)EditorGUILayout.EnumMaskPopup(new GUIContent("Category"), _curControlCategory);

                EditorGUILayout.Space();
                //1. 컨르롤러를 제어할 수 있도록 하자
                bool isChanged = false;
                if (_controlParams != null)
                {
                    for (int i = 0; i < _controlParams.Count; i++)
                    {
                        if ((int)(_controlParams[i]._category & _curControlCategory) != 0)
                        {
                            if (GUI_ControlParam(_controlParams[i]))
                            {
                                isChanged = true;
                            }
                        }
                    }
                }

                GUILayout.Space(30);

                //2. 토글 버튼을 두어서 기본 Inspector 출력 여부를 결정하자.
                string strBaseButton = "Show All Properties";
                if (_showBaseInspector)
                {
                    strBaseButton = "Hide Properties";
                }

                if (GUILayout.Button(strBaseButton, GUILayout.Height(20)))
                {
                    _showBaseInspector = !_showBaseInspector;
                }

                if (_showBaseInspector)
                {
                    base.OnInspectorGUI();
                }


                if (!Application.isPlaying && isChanged)
                {
                    //플레이 중이라면 자동으로 업데이트 될 것이다.
                    _targetPortrait.UpdateForce();
                }
            }
            catch (Exception ex)
            {
                Debug.LogError("apInspector_Portrait Exception : " + ex);
            }

            Profiler.EndSample();
        }
        ///Draws an Editor field for object of type directly
        public static object DrawEditorFieldDirect(GUIContent content, object value, Type t, FieldInfo field = null, object context = null, object[] attributes = null)
        {
            if (typeof(UnityObject).IsAssignableFrom(t) == false && t != typeof(Type))
            {
                //Check abstract
                if ((value != null && value.GetType().IsAbstract) || (value == null && t.IsAbstract))
                {
                    EditorGUILayout.LabelField(content, new GUIContent(string.Format("Abstract ({0})", t.FriendlyName())));
                    return(value);
                }

                if (t != typeof(object) && !t.IsAbstract && !t.IsInterface)
                {
                    if (t.GetConstructor(Type.EmptyTypes) != null || t.IsArray || t.RTIsValueType())
                    {
                        if (value == null)
                        {
                            GUILayout.BeginHorizontal();
                            EditorGUILayout.PrefixLabel(content, (GUIStyle)"button");
                            if (GUILayout.Button("(null) Create", GUILayout.Height(16)))
                            {
                                if (t.IsArray)
                                {
                                    value = Array.CreateInstance(t.GetElementType(), 0);
                                }
                                else
                                {
                                    value = Activator.CreateInstance(t);
                                }
                            }
                            GUILayout.EndHorizontal();
                            return(value);
                        }
                    }
                }

                // //Auto create instance for some types
                // if ( value == null && t != typeof(object) && !t.IsAbstract && !t.IsInterface ) {
                //     if ( t.GetConstructor(Type.EmptyTypes) != null || t.IsArray || t.RTIsValueType() ) {
                //         if ( t.IsArray ) { value = Array.CreateInstance(t.GetElementType(), 0); } else { value = Activator.CreateInstance(t); }
                //     }
                // }
            }

            //Check the type
            if (typeof(UnityObject).IsAssignableFrom(t))
            {
                if (t == typeof(Component) && (value is Component))
                {
                    return(ComponentField(content, (Component)value, typeof(Component)));
                }
                return(EditorGUILayout.ObjectField(content, (UnityObject)value, t, true));
            }

            if (t == typeof(Type))
            {
                return(Popup <Type>(content, (Type)value, TypePrefs.GetPreferedTypesList(true)));
            }

            if (t == typeof(string))
            {
                return(EditorGUILayout.TextField(content, (string)value));
            }

            if (t == typeof(char))
            {
                var c = (char)value;
                var s = c.ToString();
                s = EditorGUILayout.TextField(content, s);
                return(string.IsNullOrEmpty(s) ? (char)c : (char)s[0]);
            }

            if (t == typeof(bool))
            {
                return(EditorGUILayout.Toggle(content, (bool)value));
            }

            if (t == typeof(int))
            {
                return(EditorGUILayout.IntField(content, (int)value));
            }

            if (t == typeof(float))
            {
                return(EditorGUILayout.FloatField(content, (float)value));
            }

            if (t == typeof(byte))
            {
                return(Convert.ToByte(Mathf.Clamp(EditorGUILayout.IntField(content, (byte)value), 0, 255)));
            }

            if (t == typeof(long))
            {
                return(EditorGUILayout.LongField(content, (long)value));
            }

            if (t == typeof(double))
            {
                return(EditorGUILayout.DoubleField(content, (double)value));
            }

            if (t == typeof(Vector2))
            {
                return(EditorGUILayout.Vector2Field(content, (Vector2)value));
            }

            if (t == typeof(Vector3))
            {
                return(EditorGUILayout.Vector3Field(content, (Vector3)value));
            }

            if (t == typeof(Vector4))
            {
                return(EditorGUILayout.Vector4Field(content, (Vector4)value));
            }

            if (t == typeof(Quaternion))
            {
                var quat = (Quaternion)value;
                var vec4 = new Vector4(quat.x, quat.y, quat.z, quat.w);
                vec4 = EditorGUILayout.Vector4Field(content, vec4);
                return(new Quaternion(vec4.x, vec4.y, vec4.z, vec4.w));
            }

            if (t == typeof(Color))
            {
                return(EditorGUILayout.ColorField(content, (Color)value));
            }

            if (t == typeof(Rect))
            {
                return(EditorGUILayout.RectField(content, (Rect)value));
            }

            if (t == typeof(AnimationCurve))
            {
                return(EditorGUILayout.CurveField(content, (AnimationCurve)value));
            }

            if (t == typeof(Bounds))
            {
                return(EditorGUILayout.BoundsField(content, (Bounds)value));
            }

            if (t == typeof(LayerMask))
            {
                return(LayerMaskField(content, (LayerMask)value));
            }

            if (t.IsSubclassOf(typeof(System.Enum)))
            {
                if (t.IsDefined(typeof(FlagsAttribute), true))
                {
#if UNITY_2017_3_OR_NEWER
                    return(EditorGUILayout.EnumFlagsField(content, (System.Enum)value));
#else
                    return(EditorGUILayout.EnumMaskPopup(content, (System.Enum)value));
#endif
                }
                return(EditorGUILayout.EnumPopup(content, (System.Enum)value));
            }

            if (typeof(IList).IsAssignableFrom(t))
            {
                return(ListEditor(content, (IList)value, t, field, context, attributes));
            }

            if (typeof(IDictionary).IsAssignableFrom(t))
            {
                return(DictionaryEditor(content, (IDictionary)value, t, field, context, attributes));
            }

            //show nested class members recursively
            if (value != null && (t.IsClass || t.IsValueType))
            {
                if (EditorGUI.indentLevel <= 8)
                {
                    GUILayout.BeginVertical();
                    EditorGUILayout.LabelField(content, new GUIContent(string.Format("({0})", t.FriendlyName())));
                    EditorGUI.indentLevel++;
                    ReflectedObjectInspector(value);
                    EditorGUI.indentLevel--;
                    GUILayout.EndVertical();
                }
            }
            else
            {
                EditorGUILayout.LabelField(content, new GUIContent(string.Format("NonInspectable ({0})", t.FriendlyName())));
            }

            return(value);
        }
    public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] props)
    {
        FindProperties(props);

        materialEditor.TextureProperty(this.mainTexProperty, "MainTex");

        EditorGUI.BeginChangeCheck();
        SetupBlendMode();

        this.preMulAlphaProperty.floatValue = EditorGUILayout.Toggle("PreMulAlpha", this.preMulAlphaProperty.floatValue != 0) ? 1 : 0;
        if (this.preMulAlphaProperty.floatValue != 1 && blendPreset == BlendPreset.PreMulBlend)
        {
            EditorGUILayout.HelpBox("PreMulBlend模式下建议开启PreMulAlpha,否则不会淡出,并且不支持雾", MessageType.Warning);
        }

        this.revVertColorProperty.floatValue = EditorGUILayout.Toggle("RevVertColor", this.revVertColorProperty.floatValue != 0) ? 1 : 0;
        if (this.revVertColorProperty.floatValue != 1 && blendOp == BlendOp.ReverseSubtract)
        {
            EditorGUILayout.HelpBox("ReverseSubtract模式下建议开启RevVertColor", MessageType.Warning);
        }

        this.revTexColorProperty.floatValue     = EditorGUILayout.Toggle("RevTexColor", this.revTexColorProperty.floatValue != 0) ? 1 : 0;
        this.alphaFromLengthProperty.floatValue = EditorGUILayout.Toggle("AlphaFromLength", this.alphaFromLengthProperty.floatValue != 0) ? 1 : 0;
        if (this.alphaFromLengthProperty.floatValue == 1)
        {
            materialEditor.RangeProperty(alphaIntensityProperty, "AlphaIntensity");
        }


        materialEditor.RangeProperty(this.intensityProperty, "Intensity");
        materialEditor.ColorProperty(this.colorPorperty, "Color");

//		showOther = EditorGUILayout.Foldout(showOther, "Others");
//		if (showOther) {
        EditorGUI.indentLevel = EditorGUI.indentLevel + 1;
        uvMove = new Vector2(this.uvMovePorperty.vectorValue.x, this.uvMovePorperty.vectorValue.y);
        uvMove = EditorGUILayout.Vector2Field("UVMove", uvMove);

        zTest = this.zTestProperty.floatValue == 0f ? false : true;
        zTest = EditorGUILayout.Toggle("ZTest", zTest);

        cullMode = (CullMode)this.cullPorperty.floatValue;
        cullMode = (CullMode)EditorGUILayout.EnumPopup("Cull", cullMode);

        fogEnable = this.fogEnablePorperty.floatValue == 1 ? true : false;
        fogEnable = EditorGUILayout.Toggle("Fog", fogEnable);
        if (fogEnable)
        {
            fogColorEnable = this.fogColorEnablePorperty.floatValue == 1 ? true : false;
            fogColorEnable = EditorGUILayout.Toggle("FogColor", fogColorEnable);
            if (fogColorEnable)
            {
                materialEditor.ColorProperty(this.fogColorPorperty, "FogColor");
            }
        }


        colorWriteMask = (ColorWriteMask)EditorGUILayout.EnumMaskPopup(new GUIContent("ColorMask"), colorWriteMask);
        materialEditor.RangeProperty(this.InvFadePorperty, "Soft Particles Factor");

        stencilComp = (CompareFunction)this.stencilCompPorperty.floatValue;
        stencilComp = (CompareFunction)EditorGUILayout.EnumPopup("_StencilComp", stencilComp);
        if (stencilComp != CompareFunction.Disabled)                  //disabled will turn off stencil
        {
            materialEditor.FloatProperty(this.stencilRefPorperty, "_StencilRef");
            stencilOp = (StencilOp)EditorGUILayout.EnumPopup("_StencilOp", stencilOp);
            materialEditor.FloatProperty(stencilWriteMaskPorperty, "Stencil Write");
            materialEditor.FloatProperty(stencilReadMaskPorperty, "Stencil Read");
        }
//		}


        if (EditorGUI.EndChangeCheck())
        {
            materialEditor.RegisterPropertyChangeUndo("Change Particle Materail");
            ApplyChange(materialEditor);
        }
    }
        protected override void RenderContent(UnityEngine.Object undoRecordObject)
        {
            bool newBool; int newInt;
            MultiSelectOverlapMode newMultiSelectOverlapMode;

            // Can click select
            var content = new GUIContent();

            content.text    = "Can click select";
            content.tooltip = "Allows you to specify if objects can be selected via mouse clicks.";
            newBool         = EditorGUILayout.ToggleLeft(content, CanClickSelect);
            if (newBool != CanClickSelect)
            {
                EditorUndoEx.Record(undoRecordObject);
                CanClickSelect = newBool;
            }

            // Can cyclical click select
            content.text    = "Enable cyclical click select";
            content.tooltip = "If this is checked, each successive click will select an object which lies behind the previously selected one. Useful especially when dealing with overlapping sprites.";
            newBool         = EditorGUILayout.ToggleLeft(content, EnableCyclicalClickSelect);
            if (newBool != EnableCyclicalClickSelect)
            {
                EditorUndoEx.Record(undoRecordObject);
                EnableCyclicalClickSelect = newBool;
            }

            // Can multi select
            content.text    = "Can multi-select";
            content.tooltip = "Allows you to specify if objects can be selected using the multi-select shape.";
            newBool         = EditorGUILayout.ToggleLeft(content, CanMultiSelect);
            if (newBool != CanMultiSelect)
            {
                EditorUndoEx.Record(undoRecordObject);
                CanMultiSelect = newBool;
            }

            content.text              = "Multi-select overlap mode";
            content.tooltip           = "Allows you to specify the way in which objects are selected via the multi-select shape.";
            newMultiSelectOverlapMode = (MultiSelectOverlapMode)EditorGUILayout.EnumPopup(content, MultiSelectOverlapMode);
            if (newMultiSelectOverlapMode != MultiSelectOverlapMode)
            {
                EditorUndoEx.Record(undoRecordObject);
                MultiSelectOverlapMode = newMultiSelectOverlapMode;
            }

            // Selectable object types
            content.text    = "Selectable object types";
            content.tooltip = "Allows you to specify which object types can be selected.";
            newInt          = (int)((GameObjectType)EditorGUILayout.EnumMaskPopup(content, (GameObjectType)_selectableObjectTypes));
            if (newInt != (int)_selectableObjectTypes)
            {
                EditorUndoEx.Record(undoRecordObject);
                _selectableObjectTypes = (GameObjectType)newInt;
            }

            // Selectable layers
            content.text    = "Selectable layers";
            content.tooltip = "Allows you to specify which layers can be selected.";
            newInt          = EditorGUILayoutEx.LayerMaskField(content, _selectableLayers);
            if (newInt != _selectableLayers)
            {
                EditorUndoEx.Record(undoRecordObject);
                _selectableLayers = newInt;
            }

            // Duplicatable layers
            content.text    = "Duplicatable layers";
            content.tooltip = "Allows you to specify which layers can be duplicated.";
            newInt          = EditorGUILayoutEx.LayerMaskField(content, _duplicatableLayers);
            if (newInt != _duplicatableLayers)
            {
                EditorUndoEx.Record(undoRecordObject);
                _duplicatableLayers = newInt;
            }

            // Deletable layers
            content.text    = "Deletable layers";
            content.tooltip = "Allows you to specify which layers can be deleted.";
            newInt          = EditorGUILayoutEx.LayerMaskField(content, _deletableLayers);
            if (newInt != _deletableLayers)
            {
                EditorUndoEx.Record(undoRecordObject);
                _deletableLayers = newInt;
            }

            // Multi-select shape
            content.text    = "Min multi-select size";
            content.tooltip = "The minimum size (width and height) the multi-select shape must have to be able to overlap objects. The value is expressed in pixels.";
            newInt          = EditorGUILayout.IntField(content, MinMultiSelectSize);
            if (newInt != MinMultiSelectSize)
            {
                EditorUndoEx.Record(undoRecordObject);
                MinMultiSelectSize = newInt;
            }
        }
Exemple #22
0
    public void BakingGUI(MicroSplatTerrain t)
    {
        if (needsBake && Event.current.type == EventType.Repaint)
        {
            needsBake = false;
            Bake(t);
        }
#if __MICROSPLAT_PROCTEX__
        if (bakeSplats && Event.current.type == EventType.Repaint)
        {
            bakeSplats = false;

            int alphaLayerCount = t.terrain.terrainData.alphamapLayers;
            int splatRes        = t.terrain.terrainData.alphamapResolution;
            int splatCount      = t.terrain.terrainData.terrainLayers.Length;
            float[,,] splats = new float[splatRes, splatRes, splatCount];

            // World/normals are used in texturing, so we have to make them match.
            Texture2D worldPos, worldNormal;
            GenerateWorldData(t.terrain, out worldNormal, out worldPos, splatRes);


            for (int i = 0; i < alphaLayerCount; i = i + 4)
            {
                Texture2D tex   = Texture2D.blackTexture;
                Texture2D alpha = Texture2D.blackTexture;

                if (i == 0)
                {
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput0, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput0A, splatRes, worldPos, worldNormal);
                }
                if (i == 4)
                {
                    DestroyTex(tex);
                    DestroyTex(alpha);
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput1, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput1A, splatRes, worldPos, worldNormal);
                }
                else if (i == 8)
                {
                    DestroyTex(tex);
                    DestroyTex(alpha);
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput2, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput2A, splatRes, worldPos, worldNormal);
                }
                else if (i == 12)
                {
                    DestroyTex(tex);
                    DestroyTex(alpha);
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput3, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput3A, splatRes, worldPos, worldNormal);
                }
                else if (i == 16)
                {
                    DestroyTex(tex);
                    DestroyTex(alpha);
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput4, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput4A, splatRes, worldPos, worldNormal);
                }
                else if (i == 20)
                {
                    DestroyTex(tex);
                    DestroyTex(alpha);
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput5, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput5A, splatRes, worldPos, worldNormal);
                }
                else if (i == 24)
                {
                    DestroyTex(tex);
                    DestroyTex(alpha);
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput6, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput6A, splatRes, worldPos, worldNormal);
                }
                else if (i == 28)
                {
                    DestroyTex(tex);
                    DestroyTex(alpha);
                    tex   = Bake(t, BakingPasses.ProceduralSplatOutput7, splatRes, worldPos, worldNormal);
                    alpha = Bake(t, BakingPasses.ProceduralSplatOutput7A, splatRes, worldPos, worldNormal);
                }

                for (int x = 0; x < splatRes; ++x)
                {
                    for (int y = 0; y < splatRes; ++y)
                    {
                        Color c = tex.GetPixel(x, y);
                        Color a = alpha.GetPixel(x, y);
                        if (i < splatCount)
                        {
                            splats[y, x, i] = c.r;
                        }
                        if (i + 1 < splatCount)
                        {
                            splats[y, x, i + 1] = c.g;
                        }
                        if (i + 2 < splatCount)
                        {
                            splats[y, x, i + 2] = c.b;
                        }
                        if (i + 3 < splatCount)
                        {
                            splats[y, x, i + 3] = a.g;
                        }
                    }
                }
            }
            DestroyImmediate(worldPos);
            DestroyImmediate(worldNormal);
            t.terrain.terrainData.SetAlphamaps(0, 0, splats);
            EditorUtility.SetDirty(t.terrain.terrainData);
        }
#endif

        if (MicroSplatUtilities.DrawRollup("Render Baking", false))
        {
            res = (BakingResolutions)EditorGUILayout.EnumPopup(new GUIContent("Resolution"), res);

         #if UNITY_2017_3_OR_NEWER
            passes = (BakingPasses)EditorGUILayout.EnumFlagsField(new GUIContent("Features"), passes);
         #else
            passes = (BakingPasses)EditorGUILayout.EnumMaskPopup(new GUIContent("Features"), passes);
         #endif

            if (GUILayout.Button("Export Selected"))
            {
                needsBake = true;
            }
        }
#if __MICROSPLAT_PROCTEX__
        if (t.templateMaterial != null && t.keywordSO != null && t.keywordSO.IsKeywordEnabled("_PROCEDURALTEXTURE"))
        {
            if (MicroSplatUtilities.DrawRollup("Procedural Baking", false))
            {
                EditorGUILayout.Space();
                if (GUILayout.Button("Bake Procedural to Terrain"))
                {
                    bakeSplats = true;
                }
                EditorGUILayout.Space();
            }
        }
#endif
        MicroSplatCompressor.DrawGUI(t, compressOptions);
    }
        private bool EditCocoStoreItem(int pIndex)
        {
            if (GlobalSettingData.Instance == null)
            {
                return(false);
            }

            var pIsRemoveData = false;

            var pPlatformItem = GlobalSettingData.Instance.allPlatformItems [pIndex];

            var box = EditorGUILayout.BeginVertical(GUI.skin.box);

            var pRect = new Rect(box.xMax - 50, box.yMin + 2, 50, 15);

            if (GUI.Button(pRect, "X"))
            {
                pIsRemoveData = true;
            }

            pRect = new Rect(box.xMax - 180, box.yMin + 2, 100, 15);
            if (GUI.Button(pRect, "选择平台"))
            {
                SwitchPlatformByItem(pPlatformItem);
            }

            pPlatformItem.foldout = EditorGUILayout.Foldout(pPlatformItem.foldout, pPlatformItem.curPlatform.ToString());
            GUILayout.Space(8);

            if (pPlatformItem.foldout)
            {
                if (pPlatformItem.isSelected)
                {
                    EditorGUILayout.Toggle("已选择", pPlatformItem.isSelected);
                }

                pPlatformItem.curPlatform   = (MultiPlatformType)EditorGUILayout.EnumPopup("curPlatform (平台类型): ", pPlatformItem.curPlatform);
                pPlatformItem.bundleId      = EditorGUILayout.TextField("bundleId: ", pPlatformItem.bundleId);
                pPlatformItem.bundleVersion = EditorGUILayout.TextField("bundleVersion(版本号): ", pPlatformItem.bundleVersion);

                pPlatformItem.iconFolder = EditorGUILayout.TextField("IconFolder(图标文件夹): ", pPlatformItem.iconFolder);

                pPlatformItem.allowOrientations =
                    (MultiPlatformItem.Orientation)EditorGUILayout.EnumMaskPopup("orientations(允许屏幕方向)", pPlatformItem.allowOrientations);

                switch (pPlatformItem.curPlatform)
                {
                case MultiPlatformType.iOS:

                    break;

                case MultiPlatformType.GooglePlay:
                case MultiPlatformType.Amazon:
                    pPlatformItem.bundleVersionCode = EditorGUILayout.IntField("bundleVersionCode: ", pPlatformItem.bundleVersionCode);

                    pPlatformItem.keystoreName = EditorGUILayout.TextField("keystoreName: ", pPlatformItem.keystoreName);
                    pPlatformItem.keystorePass = EditorGUILayout.TextField("keystorePass: "******"keyaliasName: ", pPlatformItem.keyaliasName);
                    pPlatformItem.keyaliasPass = EditorGUILayout.TextField("keyaliasPass: "******"scriptingDefs(宏定义): ", pPlatformItem.scriptingDefs);

                pPlatformItem.splitBinary = EditorGUILayout.Toggle("splitBinary(分包): ", pPlatformItem.splitBinary);
            }

            GlobalSettingData.Instance.allPlatformItems [pIndex] = pPlatformItem;

            EditorGUILayout.EndVertical();

            return(pIsRemoveData);
        }
   public void BakingGUI(MicroSplatTerrain t)
   {
      if (needsBake && Event.current.type == EventType.Repaint)
      {
         needsBake = false;
         Bake(t);
      }
#if __MICROSPLAT_PROCTEX__


      if (bakeSplats && Event.current.type == EventType.Repaint)
      {
         bakeSplats = false;
         
         int alphaLayerCount = t.terrain.terrainData.alphamapLayers;
         int splatRes = t.terrain.terrainData.alphamapResolution;
      #if UNITY_2019_3_OR_NEWER
         int splatCount = t.terrain.terrainData.terrainLayers.Length;
      #else
         int splatCount = t.terrain.terrainData.splatPrototypes.Length;
      #endif
         float[,,] splats = new float[splatRes, splatRes, splatCount];

         // World/normals are used in texturing, so we have to make them match.
         Texture2D worldPos = new Texture2D(splatRes, splatRes, TextureFormat.RGBAFloat, true, true);
         Texture2D worldNormal = new Texture2D(splatRes, splatRes, TextureFormat.RGBAFloat, true, true);
         t.terrain.transform.rotation = Quaternion.identity;
         for (int x = 0; x < splatRes; ++x)
         {
            float u = (float)x / (float)splatRes;
            for (int y = 0; y < splatRes; ++y)
            {
               float v = (float)y / (float)splatRes;
               float h = t.terrain.terrainData.GetInterpolatedHeight(u, v);
               Vector3 n = t.terrain.terrainData.GetInterpolatedNormal(u, v);

               Vector3 wp = t.terrain.transform.localToWorldMatrix.MultiplyPoint(new Vector3(u * t.terrain.terrainData.size.x, h, v * t.terrain.terrainData.size.z));
               worldPos.SetPixel(x, y, new Color(wp.x, wp.y, wp.z));
               worldNormal.SetPixel(x, y, new Color(n.x, n.y, n.z));
            }
         }
         worldPos.Apply();
         worldNormal.Apply();

         for (int i = 0; i < alphaLayerCount; i=i+4)
         {
            Texture2D tex = Texture2D.blackTexture;
            Texture2D alpha = Texture2D.blackTexture;

            if (i == 0)
            {
               tex = Bake(t, BakingPasses.ProceduralSplatOutput0, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput0A, splatRes, worldPos, worldNormal);
            }
            if (i == 4)
            {
               DestroyImmediate(tex);
               DestroyImmediate(alpha);
               tex = Bake(t, BakingPasses.ProceduralSplatOutput1, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput1A, splatRes, worldPos, worldNormal);
            }
            else if (i == 8)
            {
               DestroyImmediate(tex);
               DestroyImmediate(alpha);
               tex = Bake(t, BakingPasses.ProceduralSplatOutput2, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput2A, splatRes, worldPos, worldNormal);
            }
            else if (i == 12)
            {
               DestroyImmediate(tex);
               DestroyImmediate(alpha);
               tex = Bake(t, BakingPasses.ProceduralSplatOutput3, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput3A, splatRes, worldPos, worldNormal);
            }
            else if (i == 16)
            {
               DestroyImmediate(tex);
               DestroyImmediate(alpha);
               tex = Bake(t, BakingPasses.ProceduralSplatOutput4, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput4A, splatRes, worldPos, worldNormal);
            }
            else if (i == 20)
            {
               DestroyImmediate(tex);
               DestroyImmediate(alpha);
               tex = Bake(t, BakingPasses.ProceduralSplatOutput5, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput5A, splatRes, worldPos, worldNormal);
            }
            else if (i == 24)
            {
               DestroyImmediate(tex);
               DestroyImmediate(alpha);
               tex = Bake(t, BakingPasses.ProceduralSplatOutput6, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput6A, splatRes, worldPos, worldNormal);
            }
            else if (i == 28)
            {
               DestroyImmediate(tex);
               DestroyImmediate(alpha);
               tex = Bake(t, BakingPasses.ProceduralSplatOutput7, splatRes, worldPos, worldNormal);
               alpha = Bake(t, BakingPasses.ProceduralSplatOutput7A, splatRes, worldPos, worldNormal);
            }

            for (int x = 0; x < splatRes; ++x)
            {
               for (int y = 0; y < splatRes; ++y)
               {
                  Color c = tex.GetPixel(x, y);
                  Color a = alpha.GetPixel(x, y);
                  if (i < splatCount)
                  {
                     splats[y, x, i] = c.r;
                  }
                  if (i + 1 < splatCount)
                  {
                     splats[y, x, i + 1] = c.g;
                  }
                  if (i + 2 < splatCount)
                  {
                     splats[y, x, i + 2] = c.b;
                  }
                  if (i + 3 < splatCount)
                  {
                     splats[y, x, i + 3] = a.g;
                  }
               }
            }
         }
         DestroyImmediate(worldPos);
         DestroyImmediate(worldNormal);
         t.terrain.terrainData.SetAlphamaps(0, 0, splats);
         EditorUtility.SetDirty(t.terrain.terrainData);

      }
#endif

      if (MicroSplatUtilities.DrawRollup("Render Baking", false))
      {
         res = (BakingResolutions)EditorGUILayout.EnumPopup(new GUIContent("Resolution"), res);

         #if UNITY_2017_3_OR_NEWER
            passes = (BakingPasses)EditorGUILayout.EnumFlagsField(new GUIContent("Features"), passes);
         #else
            passes = (BakingPasses)EditorGUILayout.EnumMaskPopup(new GUIContent("Features"), passes);
         #endif

         if (GUILayout.Button("Export Selected"))
         {
            needsBake = true;
         }

#if __MICROSPLAT_PROCTEX__
         if (t.templateMaterial != null && t.keywordSO != null && t.keywordSO.IsKeywordEnabled("_PROCEDURALTEXTURE"))
         {
            EditorGUILayout.Space();
            EditorGUILayout.Space();
            if (GUILayout.Button("Bake Procedural to Terrain"))
            {
               bakeSplats = true;
            }
            EditorGUILayout.Space();
            EditorGUILayout.Space();
         }
#endif

      }
   }
Exemple #25
0
        public override void OnInspectorGUI()
        {
            //return;

            //base.OnInspectorGUI();
            apPortrait targetPortrait = target as apPortrait;

            if (targetPortrait != _targetPortrait)
            {
                _targetPortrait = targetPortrait;
                Init();
            }
            if (_targetPortrait == null)
            {
                //Profiler.EndSample();
                return;
            }

            //Profiler.BeginSample("anyPortrait Inspector GUI");


            //return;
            if (apEditor.IsOpen())
            {
                //에디터가 작동중에는 안보이도록 하자
                EditorGUILayout.LabelField("Editor is opened");

                //Profiler.EndSample();

                return;
            }

            try
            {
                bool          request_OpenEditor    = false;
                bool          request_QuickBake     = false;
                bool          request_RefreshMeshes = false;
                bool          prevImportant         = _targetPortrait._isImportant;
                MonoBehaviour prevAnimEventListener = _targetPortrait._optAnimEventListener;
                int           prevSortingLayerID    = _targetPortrait._sortingLayerID;
                int           prevSortingOrder      = _targetPortrait._sortingOrder;

                if (!EditorApplication.isPlaying)
                {
                    if (!_targetPortrait._isOptimizedPortrait)
                    {
                        GUILayout.Space(10);
                        if (GUILayout.Button("Open Editor and Select", GUILayout.Height(30)))
                        {
                            request_OpenEditor = true;
                        }
                        if (GUILayout.Button("Quick Bake", GUILayout.Height(25)))
                        {
                            request_QuickBake = true;
                        }
                    }
                    else
                    {
                        GUILayout.Space(10);
                        if (GUILayout.Button("Open Editor (Not Selectable)", GUILayout.Height(30)))
                        {
                            //열기만 하고 선택은 못함
                            request_OpenEditor = true;
                        }
                    }
                    //추가 12.18 : Mesh를 리프레시 하자
                    if (GUILayout.Button("Refresh Meshes", GUILayout.Height(25)))
                    {
                        request_RefreshMeshes = true;
                    }
                }

                GUILayout.Space(10);

                _targetPortrait._isImportant          = EditorGUILayout.Toggle("Is Important", _targetPortrait._isImportant);
                _targetPortrait._optAnimEventListener = (MonoBehaviour)EditorGUILayout.ObjectField("Event Listener", _targetPortrait._optAnimEventListener, typeof(MonoBehaviour), true);


                GUILayout.Space(5);
                //추가3.22
                //Sorting Layer
                string[] sortingLayerName = new string[SortingLayer.layers.Length];
                int      layerIndex       = -1;
                for (int i = 0; i < SortingLayer.layers.Length; i++)
                {
                    sortingLayerName[i] = SortingLayer.layers[i].name;
                    if (SortingLayer.layers[i].id == _targetPortrait._sortingLayerID)
                    {
                        layerIndex = i;
                    }
                }
                int nextLayerIndex = EditorGUILayout.Popup("Sorting Layer", layerIndex, sortingLayerName);
                int nextLayerOrder = EditorGUILayout.IntField("Sorting Order", _targetPortrait._sortingOrder);

                if (nextLayerIndex != layerIndex)
                {
                    //Sorting Layer를 바꾸자
                    if (nextLayerIndex >= 0 && nextLayerIndex < SortingLayer.layers.Length)
                    {
                        string nextLayerName = SortingLayer.layers[nextLayerIndex].name;
                        _targetPortrait.SetSortingLayer(nextLayerName);
                    }
                }
                if (nextLayerOrder != _targetPortrait._sortingOrder)
                {
                    _targetPortrait.SetSortingOrder(nextLayerOrder);
                }


                if (prevImportant != _targetPortrait._isImportant ||
                    prevAnimEventListener != _targetPortrait._optAnimEventListener ||
                    prevSortingLayerID != _targetPortrait._sortingLayerID ||
                    prevSortingOrder != _targetPortrait._sortingOrder)
                {
                    apEditorUtil.SetEditorDirty();
                }


                GUILayout.Space(5);

                //빌보드
                apPortrait.BILLBOARD_TYPE nextBillboard = (apPortrait.BILLBOARD_TYPE)EditorGUILayout.EnumPopup("Billboard Type", _targetPortrait._billboardType);
                if (nextBillboard != _targetPortrait._billboardType)
                {
                    _targetPortrait._billboardType = nextBillboard;
                    apEditorUtil.SetEditorDirty();
                }

                GUILayout.Space(5);

                _isFold_RootPortraits = EditorGUILayout.Foldout(_isFold_RootPortraits, "Root Portraits");
                if (_isFold_RootPortraits)
                {
                    string strRootPortrait = "";
                    if (_targetPortrait._optRootUnitList.Count == 0)
                    {
                        strRootPortrait = "No Baked Portrait";
                    }
                    else if (_targetPortrait._optRootUnitList.Count == 1)
                    {
                        strRootPortrait = "1 Baked Portrait";
                    }
                    else
                    {
                        strRootPortrait = _targetPortrait._optRootUnitList.Count + " Baked Portraits";
                    }
                    EditorGUILayout.LabelField(strRootPortrait);
                    GUILayout.Space(5);
                    for (int i = 0; i < _targetPortrait._optRootUnitList.Count; i++)
                    {
                        apOptRootUnit rootUnit = _targetPortrait._optRootUnitList[i];
                        EditorGUILayout.ObjectField("[" + i + "]", rootUnit, typeof(apOptRootUnit), true);
                    }

                    GUILayout.Space(20);
                }



                _isFold_AnimationClips = EditorGUILayout.Foldout(_isFold_AnimationClips, "Animation Settings");
                if (_isFold_AnimationClips)
                {
                    EditorGUILayout.LabelField("Animation Clips");
                    string strAnimClips = "";
                    if (_targetPortrait._animClips.Count == 0)
                    {
                        strAnimClips = "No Animation Clip";
                    }
                    else if (_targetPortrait._animClips.Count == 1)
                    {
                        strAnimClips = "1 Animation Clip";
                    }
                    else
                    {
                        strAnimClips = _targetPortrait._animClips.Count + " Animation Clips";
                    }
                    EditorGUILayout.LabelField(strAnimClips);
                    GUILayout.Space(5);


                    for (int i = 0; i < _targetPortrait._animClips.Count; i++)
                    {
                        EditorGUILayout.BeginHorizontal();
                        GUILayout.Space(5);
                        apAnimClip animClip = _targetPortrait._animClips[i];
                        if (animClip._uniqueID == _targetPortrait._autoPlayAnimClipID)
                        {
                            EditorGUILayout.LabelField("[" + i + "] (Auto)", GUILayout.Width(80));
                        }
                        else
                        {
                            EditorGUILayout.LabelField("[" + i + "]", GUILayout.Width(80));
                        }
                        EditorGUILayout.TextField(animClip._name);
                        try
                        {
                            AnimationClip nextAnimationClip = EditorGUILayout.ObjectField(animClip._animationClipForMecanim, typeof(AnimationClip), false) as AnimationClip;
                            if (nextAnimationClip != animClip._animationClipForMecanim)
                            {
                                UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty();
                                Undo.IncrementCurrentGroup();
                                Undo.RegisterCompleteObjectUndo(_targetPortrait, "Animation Changed");

                                animClip._animationClipForMecanim = nextAnimationClip;
                            }
                        }
                        catch (Exception)
                        { }

                        EditorGUILayout.EndHorizontal();
                    }
                    GUILayout.Space(10);
                    AnimationClip nextEmptyAnimClip = EditorGUILayout.ObjectField("Empty Animation Clip", _targetPortrait._emptyAnimClipForMecanim, typeof(AnimationClip), false) as AnimationClip;
                    if (nextEmptyAnimClip != _targetPortrait._emptyAnimClipForMecanim)
                    {
                        UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty();
                        Undo.IncrementCurrentGroup();
                        Undo.RegisterCompleteObjectUndo(_targetPortrait, "Animation Changed");

                        _targetPortrait._emptyAnimClipForMecanim = nextEmptyAnimClip;
                    }

                    GUILayout.Space(10);
                    EditorGUILayout.LabelField("Mecanim Settings");
                    bool isNextUsingMecanim = EditorGUILayout.Toggle("Use Mecanim", _targetPortrait._isUsingMecanim);
                    if (_targetPortrait._isUsingMecanim != isNextUsingMecanim)
                    {
                        UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty();
                        Undo.IncrementCurrentGroup();
                        Undo.RegisterCompleteObjectUndo(_targetPortrait, "Mecanim Setting Changed");

                        _targetPortrait._isUsingMecanim = isNextUsingMecanim;
                    }


                    if (_targetPortrait._isUsingMecanim)
                    {
                        GUILayout.Space(10);
                        try
                        {
                            Animator nextAnimator = EditorGUILayout.ObjectField("Animator", _targetPortrait._animator, typeof(Animator), true) as Animator;
                            if (nextAnimator != _targetPortrait._animator)
                            {
                                //하위에 있는 Component일 때에만 변동 가능
                                if (nextAnimator == null)
                                {
                                    _targetPortrait._animator = null;
                                }
                                else
                                {
                                    if (nextAnimator == _targetPortrait.GetComponent <Animator>())
                                    {
                                        _targetPortrait._animator = nextAnimator;
                                    }
                                    else
                                    {
                                        EditorUtility.DisplayDialog("Invalid Animator", "Invalid Animator. Only the Animator, which is its own component, is valid.", "Okay");
                                    }
                                }
                            }
                        }
                        catch (Exception)
                        {
                        }
                        if (_targetPortrait._animator == null)
                        {
                            //1. Animator가 없다면
                            // > 생성하기
                            // > 생성되어 있다면 다시 링크
                            GUIStyle guiStyle_WarningText = new GUIStyle(GUI.skin.label);
                            guiStyle_WarningText.normal.textColor = Color.red;
                            EditorGUILayout.LabelField("Warning : No Animator!", guiStyle_WarningText);
                            GUILayout.Space(5);

                            if (GUILayout.Button("Add / Check Animator", GUILayout.Height(25)))
                            {
                                UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty();
                                Undo.IncrementCurrentGroup();
                                Undo.RegisterCompleteObjectUndo(_targetPortrait, "Mecanim Setting Changed");

                                Animator animator = _targetPortrait.gameObject.GetComponent <Animator>();
                                if (animator == null)
                                {
                                    animator = _targetPortrait.gameObject.AddComponent <Animator>();
                                }
                                _targetPortrait._animator = animator;
                            }
                        }
                        else
                        {
                            //2. Animator가 있다면
                            if (GUILayout.Button("Refresh Layers", GUILayout.Height(25)))
                            {
                                UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty();
                                Undo.IncrementCurrentGroup();
                                Undo.RegisterCompleteObjectUndo(_targetPortrait, "Mecanim Setting Changed");

                                //Animator의 Controller가 있는지 체크해야한다.

                                if (_targetPortrait._animator.runtimeAnimatorController == null)
                                {
                                    //AnimatorController가 없다면 Layer는 초기화
                                    _targetPortrait._animatorLayerBakedData.Clear();
                                }
                                else
                                {
                                    //AnimatorController가 있다면 레이어에 맞게 설정
                                    _targetPortrait._animatorLayerBakedData.Clear();
                                    UnityEditor.Animations.AnimatorController animatorController = _targetPortrait._animator.runtimeAnimatorController as UnityEditor.Animations.AnimatorController;

                                    if (animatorController != null && animatorController.layers.Length > 0)
                                    {
                                        for (int iLayer = 0; iLayer < animatorController.layers.Length; iLayer++)
                                        {
                                            apAnimMecanimData_Layer newLayerData = new apAnimMecanimData_Layer();
                                            newLayerData._layerIndex = iLayer;
                                            newLayerData._layerName  = animatorController.layers[iLayer].name;
                                            newLayerData._blendType  = apAnimMecanimData_Layer.MecanimLayerBlendType.Unknown;
                                            switch (animatorController.layers[iLayer].blendingMode)
                                            {
                                            case UnityEditor.Animations.AnimatorLayerBlendingMode.Override:
                                                newLayerData._blendType = apAnimMecanimData_Layer.MecanimLayerBlendType.Override;
                                                break;

                                            case UnityEditor.Animations.AnimatorLayerBlendingMode.Additive:
                                                newLayerData._blendType = apAnimMecanimData_Layer.MecanimLayerBlendType.Additive;
                                                break;
                                            }

                                            _targetPortrait._animatorLayerBakedData.Add(newLayerData);
                                        }
                                    }
                                }
                            }
                            GUILayout.Space(5);
                            EditorGUILayout.LabelField("Animator Controller Layers");
                            for (int i = 0; i < _targetPortrait._animatorLayerBakedData.Count; i++)
                            {
                                apAnimMecanimData_Layer layer = _targetPortrait._animatorLayerBakedData[i];
                                EditorGUILayout.BeginHorizontal();
                                GUILayout.Space(5);
                                EditorGUILayout.LabelField("[" + layer._layerIndex + "]", GUILayout.Width(50));
                                EditorGUILayout.TextField(layer._layerName);
                                apAnimMecanimData_Layer.MecanimLayerBlendType nextBlendType = (apAnimMecanimData_Layer.MecanimLayerBlendType)EditorGUILayout.EnumPopup(layer._blendType);
                                EditorGUILayout.EndHorizontal();

                                if (nextBlendType != layer._blendType)
                                {
                                    UnityEditor.SceneManagement.EditorSceneManager.MarkAllScenesDirty();
                                    Undo.IncrementCurrentGroup();
                                    Undo.RegisterCompleteObjectUndo(_targetPortrait, "Mecanim Setting Changed");

                                    _targetPortrait._animatorLayerBakedData[i]._blendType = nextBlendType;
                                }
                            }
                        }
                    }


                    GUILayout.Space(20);
                }


                bool isChanged = false;

                _isFold_ConrolParameters = EditorGUILayout.Foldout(_isFold_ConrolParameters, "Control Parameters");
                if (_isFold_ConrolParameters)
                {
#if UNITY_2017_3_OR_NEWER
                    _curControlCategory = (apControlParam.CATEGORY)EditorGUILayout.EnumFlagsField(new GUIContent("Category"), _curControlCategory);
#else
                    _curControlCategory = (apControlParam.CATEGORY)EditorGUILayout.EnumMaskPopup(new GUIContent("Category"), _curControlCategory);
#endif

                    EditorGUILayout.Space();
                    //1. 컨르롤러를 제어할 수 있도록 하자

                    if (_controlParams != null)
                    {
                        for (int i = 0; i < _controlParams.Count; i++)
                        {
                            if ((int)(_controlParams[i]._category & _curControlCategory) != 0)
                            {
                                if (GUI_ControlParam(_controlParams[i]))
                                {
                                    isChanged = true;
                                }
                            }
                        }
                    }

                    GUILayout.Space(20);
                }


                GUILayout.Space(10);

                //2. 토글 버튼을 두어서 기본 Inspector 출력 여부를 결정하자.
                string strBaseButton = "Show All Properties";
                if (_showBaseInspector)
                {
                    strBaseButton = "Hide Properties";
                }

                if (GUILayout.Button(strBaseButton, GUILayout.Height(20)))
                {
                    _showBaseInspector = !_showBaseInspector;
                }

                if (_showBaseInspector)
                {
                    base.OnInspectorGUI();
                }


                if (!Application.isPlaying && isChanged)
                {
                    //플레이 중이라면 자동으로 업데이트 될 것이다.
                    _targetPortrait.UpdateForce();
                }

                if (_targetPortrait != null)
                {
                    if (request_OpenEditor)
                    {
                        if (_targetPortrait._isOptimizedPortrait)
                        {
                            RequestDelayedOpenEditor(_targetPortrait, REQUEST_TYPE.Open);
                        }
                        else
                        {
                            RequestDelayedOpenEditor(_targetPortrait, REQUEST_TYPE.OpenAndSet);
                        }
                        //apEditor anyPortraitEditor = apEditor.ShowWindow();
                        //if (anyPortraitEditor != null && !_targetPortrait._isOptimizedPortrait)
                        //{
                        //	anyPortraitEditor.SetPortraitByInspector(_targetPortrait, false);
                        //}
                    }
                    else if (request_QuickBake)
                    {
                        RequestDelayedOpenEditor(_targetPortrait, REQUEST_TYPE.QuickBake);
                        //apEditor anyPortraitEditor = apEditor.ShowWindow();
                        //if (anyPortraitEditor != null)
                        //{
                        //	anyPortraitEditor.SetPortraitByInspector(_targetPortrait, true);

                        //	Selection.activeObject = _targetPortrait.gameObject;
                        //}
                    }
                    else if (request_RefreshMeshes)
                    {
                        _targetPortrait.OnMeshResetInEditor();
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.LogError("apInspector_Portrait Exception : " + ex);
            }

            //Profiler.EndSample();
        }
        //For generic automatic editors. Passing a MemberInfo will also check for attributes
        public static object GenericField(string name, object value, Type t, MemberInfo member = null, object context = null)
        {
            if (t == null)
            {
                GUILayout.Label("NO TYPE PROVIDED!");
                return(value);
            }

            //Preliminary Hides
            if (typeof(Delegate).IsAssignableFrom(t))
            {
                return(value);
            }
            //

            IEnumerable <Attribute> attributes = new Attribute[0];

            if (member != null)
            {
                //Hide class?
                if (t.GetCustomAttributes(typeof(HideInInspector), true).FirstOrDefault() != null)
                {
                    return(value);
                }

                attributes = member.GetCustomAttributes(true).Cast <Attribute>();

                //Hide field?
                if (attributes.Any(a => a is HideInInspector))
                {
                    return(value);
                }
            }


            //Then check UnityObjects
            if (typeof(UnityObject).IsAssignableFrom(t))
            {
                if (t == typeof(Component) && (Component)value != null)
                {
                    return(ComponentField(name, (Component)value, typeof(Component)));
                }
                return(EditorGUILayout.ObjectField(name, (UnityObject)value, t, typeof(Component).IsAssignableFrom(t) || t == typeof(GameObject)));
            }


            //Check abstract
            if ((value != null && value.GetType().IsAbstract) || (value == null && t.IsAbstract))
            {
                EditorGUILayout.LabelField(name, string.Format("Abstract ({0})", t.Name));
                return(value);
            }

            //Create instance for some types
            if (value == null && !t.IsAbstract && !t.IsInterface && (t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null || t.IsArray))
            {
                if (t.IsArray)
                {
                    value = Array.CreateInstance(t.GetElementType(), 0);
                }
                else
                {
                    value = Activator.CreateInstance(t);
                }
            }



            //Check the rest
            //..............
            if (t == typeof(string))
            {
                return(EditorGUILayout.TextField(name, (string)value));
            }

            if (t == typeof(bool))
            {
                return(EditorGUILayout.Toggle(name, (bool)value));
            }

            if (t == typeof(int))
            {
                return(EditorGUILayout.IntField(name, (int)value));
            }

            if (t == typeof(float))
            {
                return(EditorGUILayout.FloatField(name, (float)value));
            }

            if (t == typeof(byte))
            {
                return(Convert.ToByte(Mathf.Clamp(EditorGUILayout.IntField(name, (byte)value), 0, 255)));
            }

            if (t == typeof(Vector2))
            {
                return(EditorGUILayout.Vector2Field(name, (Vector2)value));
            }

            if (t == typeof(Vector3))
            {
                return(EditorGUILayout.Vector3Field(name, (Vector3)value));
            }

            if (t == typeof(Vector4))
            {
                return(EditorGUILayout.Vector4Field(name, (Vector4)value));
            }

            if (t == typeof(Quaternion))
            {
                var quat = (Quaternion)value;
                var vec4 = new Vector4(quat.x, quat.y, quat.z, quat.w);
                vec4 = EditorGUILayout.Vector4Field(name, vec4);
                return(new Quaternion(vec4.x, vec4.y, vec4.z, vec4.w));
            }

            if (t == typeof(Color))
            {
                return(EditorGUILayout.ColorField(name, (Color)value));
            }

            if (t == typeof(Rect))
            {
                return(EditorGUILayout.RectField(name, (Rect)value));
            }

            if (t == typeof(AnimationCurve))
            {
                return(EditorGUILayout.CurveField(name, (AnimationCurve)value));
            }

            if (t == typeof(Bounds))
            {
                return(EditorGUILayout.BoundsField(name, (Bounds)value));
            }

            if (t == typeof(LayerMask))
            {
                return(LayerMaskField(name, (LayerMask)value));
            }

            if (t.IsSubclassOf(typeof(System.Enum)))
            {
#if UNITY_5
                if (t.GetCustomAttributes(typeof(FlagsAttribute), true).FirstOrDefault() != null)
                {
                    return(EditorGUILayout.EnumMaskPopup(new GUIContent(name), (System.Enum)value));
                }
#endif
                return(EditorGUILayout.EnumPopup(name, (System.Enum)value));
            }

            if (typeof(IList).IsAssignableFrom(t))
            {
                return(ListEditor(name, (IList)value, t, context));
            }

            if (typeof(IDictionary).IsAssignableFrom(t))
            {
                return(DictionaryEditor(name, (IDictionary)value, t, context));
            }

            //show nested class members recursively
            if (value != null && !t.IsEnum && !t.IsInterface)
            {
                GUILayout.BeginVertical();
                EditorGUILayout.LabelField(name, t.Name);
                EditorGUI.indentLevel++;
                ShowAutoEditorGUI(value);
                EditorGUI.indentLevel--;
                GUILayout.EndVertical();
            }
            else
            {
                EditorGUILayout.LabelField(name, string.Format("({0})", t.Name));
            }

            return(value);
        }
        private void DrawMember(SerializedProperty property, ref int index, ParameterData parameter)
        {
            var label = this.labels[index];

            switch (parameter.returnType)
            {
            case ObjectType.Boolean:
            case ObjectType.Int32:
            case ObjectType.Int64:
            case ObjectType.Single:
            case ObjectType.Double:
            case ObjectType.String:
            case ObjectType.LayerMask:
            case ObjectType.Color:
            case ObjectType.AnimationCurve:
                EditorGUILayout.PropertyField(property, label, false);
                break;

            case ObjectType.UInt64:
                var   oldString   = property.stringValue;
                var   ulongString = EditorGUILayout.TextField(label, property.stringValue);
                ulong ulongVal;

                if (!ulong.TryParse(ulongString, out ulongVal))
                {
                    ulongString = oldString;
                }

                if (string.IsNullOrEmpty(ulongString))
                {
                    ulongString = "0";
                }

                property.stringValue = ulongString;
                break;

            case ObjectType.Byte:
                property.intValue = EditorFields.ByteField(label, (byte)property.intValue);
                break;

            case ObjectType.SByte:
                property.intValue = EditorFields.SByteField(label, (sbyte)property.intValue);
                break;

            case ObjectType.Char:
                property.intValue = EditorFields.CharField(label, (char)property.intValue);
                break;

            case ObjectType.Int16:
                property.intValue = EditorFields.ShortField(label, (short)property.intValue);
                break;

            case ObjectType.UInt16:
                property.intValue = EditorFields.UShortField(label, (ushort)property.intValue);
                break;

            case ObjectType.UInt32:
                property.longValue = EditorFields.UIntField(label, (uint)property.longValue);
                break;

            case ObjectType.Enum:
            {
                var  typeOf         = Type.GetType(parameter.assemblyQualifiedName);
                var  flagsAttribute = typeOf.GetCustomAttributes(typeof(FlagsAttribute), false);
                Enum enumValue;

                if (flagsAttribute != null && flagsAttribute.Length >= 1)
                {
                    enumValue = EditorGUILayout.EnumMaskPopup(label, (Enum)Enum.ToObject(typeOf, property.longValue));
                }
                else
                {
                    enumValue = EditorGUILayout.EnumPopup(label, (Enum)Enum.ToObject(typeOf, property.longValue));
                }

                try
                {
                    property.longValue = (int)Enum.ToObject(typeOf, enumValue);
                }
                catch
                {
                    property.longValue = (long)Enum.ToObject(typeOf, enumValue);
                }
            }
            break;

            case ObjectType.Vector2:
                property.vector2Value = EditorGUILayout.Vector2Field(label, property.vector2Value);
                break;

            case ObjectType.Vector3:
                property.vector3Value = EditorGUILayout.Vector3Field(label, property.vector3Value);
                break;

            case ObjectType.Vector4:
                property.vector4Value = EditorGUILayout.Vector4Field(label, property.vector4Value);
                break;

            case ObjectType.Bounds:
                property.boundsValue = EditorGUILayout.BoundsField(label, property.boundsValue);
                break;

            case ObjectType.Rect:
                property.rectValue = EditorGUILayout.RectField(label, property.rectValue);
                break;

            case ObjectType.Quaternion:
                property.quaternionValue = EditorFields.QuaternionField(label, property.quaternionValue);
                break;

            case ObjectType.UnityObject:
            {
                var typeOf = Type.GetType(parameter.assemblyQualifiedName);
                property.objectReferenceValue = EditorGUILayout.ObjectField(label, property.objectReferenceValue, typeOf, true);
            }
            break;

            case ObjectType.Matrix4x4:
            {
                var matrix = property.stringValue.ToObject <Matrix4x4>();
                matrix = EditorFields.Matrix4x4Field(label, matrix);
                property.stringValue = matrix.ToJson();
            }
            break;

            case ObjectType.SerializableType:
            case ObjectType.Array:
            case ObjectType.List:
            {
                var typeOf = Type.GetType(parameter.assemblyQualifiedName);

                if (this.cloneObjects[index] == null)
                {
                    var cloneObjectType = CreateCloneObjectType("CloneObject", FakeObjectFields.Value, typeOf);
                    this.cloneObjects[index]         = CreateInstance(cloneObjectType);
                    this.cloneValueFieldInfos[index] = cloneObjectType.GetField(FakeObjectFields.Value,
                                                                                BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                }

                var cloneObject         = this.cloneObjects[index];
                var cloneValueFieldInfo = this.cloneValueFieldInfos[index];

                var data = property.stringValue.ToObject(typeOf);

                if (data == null)
                {
                    if (parameter.returnType == ObjectType.Array)
                    {
                        data = Activator.CreateInstance(typeOf, 0);
                    }
                    else
                    {
                        data = Activator.CreateInstance(typeOf);
                    }
                }

                cloneValueFieldInfo.SetValue(cloneObject, data);

                if (this.serializedCloneObjects[index] == null)
                {
                    this.serializedCloneObjects[index]    = new SerializedObject(cloneObject);
                    this.serializedCloneProperties[index] = this.serializedCloneObjects[index].FindProperty(FakeObjectFields.Value);
                }

                var serializedCloneObject   = this.serializedCloneObjects[index];
                var serializedCloneProperty = this.serializedCloneProperties[index];

                EditorGUI.BeginChangeCheck();

                serializedCloneObject.Update();
                EditorGUILayout.PropertyField(serializedCloneProperty, label, true);

                if (EditorGUI.EndChangeCheck())
                {
                    serializedCloneObject.ApplyModifiedPropertiesWithoutUndo();
                    data = cloneValueFieldInfo.GetValue(cloneObject);

                    property.stringValue = data.ToJson(typeOf);
                }
            }
            break;
            }
        }
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            MapStyle mapStyle = serializedObject.targetObject as MapStyle;

            if (mapStyle == null)
            {
                // ????
                return;
            }

            GUILayout.Label("Editing options", labelBoldStyle);

            var liveUpdateProperty = serializedObject.FindProperty("liveUpdateEnabled");

            EditorGUILayout.PropertyField(liveUpdateProperty, new GUIContent {
                text = "Update RegionMap while editing"
            });

            GUILayout.Space(EditorGUIUtility.singleLineHeight);

            GUILayout.Label("Layers", labelBoldStyle);

            layerTreeView.Layers = mapStyle.Layers;
            layerTreeView.Reload();
            layerTreeView.OnGUI(GUILayoutUtility.GetRect(0, 500, 0, 150));

            var selectedLayers = layerTreeView.GetSelection();

            var layerArrayProperty = serializedObject.FindProperty("Layers");

            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Add Layer"))
            {
                mapStyle.Layers.Add(new FeatureLayer("untitled"));
            }
            if (GUILayout.Button("Remove Selected"))
            {
                foreach (var index in selectedLayers.OrderByDescending(i => i))
                {
                    layerArrayProperty.DeleteArrayElementAtIndex(index);
                }
                selectedLayers = new int[0];
                layerTreeView.SetSelection(selectedLayers);
            }
            GUILayout.EndHorizontal();

            GUILayout.Space(EditorGUIUtility.singleLineHeight);

            if (selectedLayers.Count == 1)
            {
                var index = selectedLayers[0];

                var layerProperty = layerArrayProperty.GetArrayElementAtIndex(index);

                layerProperty.isExpanded = true;

                GUILayout.Label("Layer Properties", labelBoldStyle);

                var layer = mapStyle.Layers[index];

                layer.FeatureCollection = (FeatureLayer.MapzenFeatureCollection)EditorGUILayout.EnumMaskPopup("Feature Collections", layer.FeatureCollection);

                DrawSelectedLayer(layerProperty);
            }
            else
            {
                GUILayout.Label("Select a layer to see properties", labelItalicCenteredStyle);
            }

            serializedObject.ApplyModifiedProperties();

            if (liveUpdateProperty.boolValue)
            {
                // Find the regionMap containing the style mapStyle
                var       regionMaps = GameObject.FindObjectsOfType <RegionMap>();
                RegionMap map        = null;
                foreach (var regionMap in regionMaps)
                {
                    if (regionMap.Style == mapStyle)
                    {
                        map = regionMap;
                        break;
                    }
                }

                if (map != null)
                {
                    if (GUI.changed)
                    {
                        map.LogWarnings();
                        if (map.IsValid())
                        {
                            map.DownloadTilesAsync();
                        }
                        else
                        {
                            map.LogErrors();
                        }
                    }

                    if (map.HasPendingTasks())
                    {
                        Repaint();
                        if (map.FinishedRunningTasks())
                        {
                            map.GenerateSceneGraph();
                        }
                    }
                }
            }
        }
Exemple #29
0
        //While there is a similar method in EditorUtils, due to layouting and especialy no prefix name, this has to be redone a bit differently
        static object VariableField(Variable data, UnityEngine.Object context, GUILayoutOption[] layoutOptions)
        {
            var o = data.value;
            var t = data.varType;

            if (t == typeof(VariableSeperator))
            {
                GUILayout.Space(0);
                return(o);
            }

            //Check scene object type for UnityObjects. Consider Interfaces as scene object type. Assume that user uses interfaces with UnityObjects
            if (typeof(UnityEngine.Object).IsAssignableFrom(t) || t.IsInterface)
            {
                var isSceneObjectType = (typeof(Component).IsAssignableFrom(t) || t == typeof(GameObject) || t.IsInterface);
                return(EditorGUILayout.ObjectField((UnityEngine.Object)o, t, isSceneObjectType, layoutOptions));
            }

            //Check Type second
            if (t == typeof(System.Type))
            {
                return(EditorUtils.Popup <System.Type>(string.Empty, (System.Type)o, UserTypePrefs.GetPreferedTypesList(true), layoutOptions));
            }

            t = o != null?o.GetType() : t;

            if (t.IsAbstract)
            {
                GUILayout.Label(string.Format("({0})", t.FriendlyName()), layoutOptions);
                return(o);
            }

            if (o == null && !t.IsAbstract && !t.IsInterface && (t.GetConstructor(System.Type.EmptyTypes) != null || t.IsArray))
            {
                if (GUILayout.Button("(null) Create", layoutOptions))
                {
                    if (t.IsArray)
                    {
                        return(System.Array.CreateInstance(t.GetElementType(), 0));
                    }
                    return(System.Activator.CreateInstance(t));
                }
                return(o);
            }

            if (t == typeof(bool))
            {
                return(EditorGUILayout.Toggle((bool)o, layoutOptions));
            }

            if (t == typeof(Color))
            {
                return(EditorGUILayout.ColorField((Color)o, layoutOptions));
            }

            if (t == typeof(AnimationCurve))
            {
                return(EditorGUILayout.CurveField((AnimationCurve)o, layoutOptions));
            }

            if (t.IsSubclassOf(typeof(System.Enum)))
            {
                if (t.IsDefined(typeof(System.FlagsAttribute), true))
                {
                    return(EditorGUILayout.EnumMaskPopup(GUIContent.none, (System.Enum)o, layoutOptions));
                }
                return(EditorGUILayout.EnumPopup((System.Enum)o, layoutOptions));
            }

            if (t == typeof(float))
            {
                GUI.backgroundColor = UserTypePrefs.GetTypeColor(t);
                return(EditorGUILayout.FloatField((float)o, layoutOptions));
            }

            if (t == typeof(int))
            {
                GUI.backgroundColor = UserTypePrefs.GetTypeColor(t);
                return(EditorGUILayout.IntField((int)o, layoutOptions));
            }

            if (t == typeof(string))
            {
                GUI.backgroundColor = UserTypePrefs.GetTypeColor(t);
                return(EditorGUILayout.TextField((string)o, layoutOptions));
            }

            if (t == typeof(Vector2))
            {
                return(EditorGUILayout.Vector2Field(string.Empty, (Vector2)o, layoutOptions));
            }

            if (t == typeof(Vector3))
            {
                return(EditorGUILayout.Vector3Field(string.Empty, (Vector3)o, layoutOptions));
            }

            if (t == typeof(Vector4))
            {
                return(EditorGUILayout.Vector4Field(string.Empty, (Vector4)o, layoutOptions));
            }

            if (t == typeof(Quaternion))
            {
                var q = (Quaternion)o;
                var v = new Vector4(q.x, q.y, q.z, q.w);
                v = EditorGUILayout.Vector4Field(string.Empty, v, layoutOptions);
                return(new Quaternion(v.x, v.y, v.z, v.w));
            }

            if (t == typeof(LayerMask))
            {
                return(EditorUtils.LayerMaskField(string.Empty, (LayerMask)o, layoutOptions));
            }

            //If some other type, show it in the generic object editor window
            if (GUILayout.Button(string.Format("{0} {1}", t.FriendlyName(), (o is IList)? ((IList)o).Count.ToString() : string.Empty), layoutOptions))
            {
                GenericInspectorWindow.Show(data.ID, o, t, context);
            }

            //if we are externaly inspecting value and it's this one, get value from the external editor. This is basicaly done for structs
            if (GenericInspectorWindow.current != null && GenericInspectorWindow.current.inspectedID == data.ID)
            {
                return(GenericInspectorWindow.current.value);
            }

            return(o);
        }
        //For generic automatic editors. Passing a MemberInfo will also check for attributes
        public static object GenericField(string name, object value, Type t, MemberInfo member = null, object instance = null)
        {
            if (t == null)
            {
                GUILayout.Label("NO TYPE PROVIDED!");
                return(value);
            }

            //Preliminary Hides
            if (typeof(Delegate).IsAssignableFrom(t))
            {
                return(value);
            }

            name = name.SplitCamelCase();

            //

            IEnumerable <Attribute> attributes = new Attribute[0];

            if (member != null)
            {
                //Hide class?
                if (t.GetCustomAttributes(typeof(HideInInspector), true).FirstOrDefault() != null)
                {
                    return(value);
                }

                attributes = member.GetCustomAttributes(true).Cast <Attribute>();

                //Hide field?
                if (attributes.Any(a => a is HideInInspector))
                {
                    return(value);
                }

                //Is required?
                if (attributes.Any(a => a is RequiredFieldAttribute))
                {
                    if ((value == null || value.Equals(null)) ||
                        (t == typeof(string) && string.IsNullOrEmpty((string)value)) ||
                        (typeof(BBParameter).IsAssignableFrom(t) && (value as BBParameter).isNull))
                    {
                        GUI.backgroundColor = lightRed;
                    }
                }
            }


            if (member != null)
            {
                var nameAtt = attributes.FirstOrDefault(a => a is NameAttribute) as NameAttribute;
                if (nameAtt != null)
                {
                    name = nameAtt.name;
                }

                if (instance != null)
                {
                    var showAtt = attributes.FirstOrDefault(a => a is ShowIfAttribute) as ShowIfAttribute;
                    if (showAtt != null)
                    {
                        var targetField = instance.GetType().GetField(showAtt.fieldName);
                        if (targetField == null || targetField.FieldType != typeof(bool))
                        {
                            GUILayout.Label(string.Format("[ShowIf] Error: bool \"{0}\" does not exist.", showAtt.fieldName));
                        }
                        else
                        {
                            if ((bool)targetField.GetValue(instance) != showAtt.show)
                            {
                                return(value);
                            }
                        }
                    }
                }
            }


            //Before everything check BBParameter
            if (typeof(BBParameter).IsAssignableFrom(t))
            {
                return(BBParameterField(name, (BBParameter)value, false, member));
            }


            //Cutstom object drawers
            var objectDrawer = GetCustomDrawer(t);

            if (objectDrawer != null && !(objectDrawer is NoDrawer))
            {
                return(objectDrawer.DrawGUI(name, value, member as FieldInfo, null, instance));
            }

            //Cutstom attribute drawers
            foreach (CustomDrawerAttribute att in attributes.OfType <CustomDrawerAttribute>())
            {
                var attributeDrawer = GetCustomDrawer(att.GetType());
                if (attributeDrawer != null && !(attributeDrawer is NoDrawer))
                {
                    return(attributeDrawer.DrawGUI(name, value, member as FieldInfo, att, instance));
                }
            }


            //Then check UnityObjects
            if (typeof(UnityObject).IsAssignableFrom(t))
            {
                if (t == typeof(Component) && (Component)value != null)
                {
                    return(ComponentField(name, (Component)value, typeof(Component)));
                }
                return(EditorGUILayout.ObjectField(name, (UnityObject)value, t, true));
            }

            //Force UnityObject field?
            if (member != null && attributes.Any(a => a is ForceObjectFieldAttribute))
            {
                return(EditorGUILayout.ObjectField(name, value as UnityObject, t, true));
            }

            //Restricted popup values?
            if (member != null)
            {
                var popAtt = attributes.FirstOrDefault(a => a is PopupFieldAttribute) as PopupFieldAttribute;
                if (popAtt != null)
                {
                    if (popAtt.staticPath != null)
                    {
                        try
                        {
                            var typeName  = popAtt.staticPath.Substring(0, popAtt.staticPath.LastIndexOf("."));
                            var type      = ReflectionTools.GetType(typeName);
                            var start     = popAtt.staticPath.LastIndexOf(".") + 1;
                            var end       = popAtt.staticPath.Length;
                            var propName  = popAtt.staticPath.Substring(start, end - start);
                            var prop      = type.GetProperty(propName, BindingFlags.Static | BindingFlags.Public);
                            var propValue = prop.GetValue(null, null);
                            var values    = ((IEnumerable)propValue).Cast <object>().ToList();
                            return(Popup <object>(name, value, values));
                        }
                        catch
                        {
                            EditorGUILayout.LabelField(name, "[PopupField] attribute error!");
                            return(value);
                        }
                    }
                    return(Popup <object>(name, value, popAtt.values.ToList()));
                }
            }


            //Check Type of Type
            if (t == typeof(Type))
            {
                return(Popup <Type>(name, (Type)value, UserTypePrefs.GetPreferedTypesList(typeof(object), false)));
            }

            //Check abstract
            if ((value != null && value.GetType().IsAbstract) || (value == null && t.IsAbstract))
            {
                EditorGUILayout.LabelField(name, string.Format("Abstract ({0})", t.FriendlyName()));
                return(value);
            }

            //Create instance for some types
            if (value == null && !t.IsAbstract && !t.IsInterface && (t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null || t.IsArray))
            {
                if (t.IsArray)
                {
                    value = Array.CreateInstance(t.GetElementType(), 0);
                }
                else
                {
                    value = Activator.CreateInstance(t);
                }
            }



            //Check the rest
            //..............
            if (t == typeof(string))
            {
                if (member != null)
                {
                    if (attributes.Any(a => a is TagFieldAttribute))
                    {
                        return(EditorGUILayout.TagField(name, (string)value));
                    }
                    var areaAtt = attributes.FirstOrDefault(a => a is TextAreaFieldAttribute) as TextAreaFieldAttribute;
                    if (areaAtt != null)
                    {
                        GUILayout.Label(name);
                        var areaStyle = new GUIStyle(GUI.skin.GetStyle("TextArea"));
                        areaStyle.wordWrap = true;
                        var s = EditorGUILayout.TextArea((string)value, areaStyle, GUILayout.Height(areaAtt.height));
                        return(s);
                    }
                }

                return(EditorGUILayout.TextField(name, (string)value));
            }

            if (t == typeof(bool))
            {
                return(EditorGUILayout.Toggle(name, (bool)value));
            }

            if (t == typeof(int))
            {
                if (member != null)
                {
                    var sField = attributes.FirstOrDefault(a => a is SliderFieldAttribute) as SliderFieldAttribute;
                    if (sField != null)
                    {
                        return((int)EditorGUILayout.Slider(name, (int)value, (int)sField.left, (int)sField.right));
                    }
                    if (attributes.Any(a => a is LayerFieldAttribute))
                    {
                        return(EditorGUILayout.LayerField(name, (int)value));
                    }
                }

                return(EditorGUILayout.IntField(name, (int)value));
            }

            if (t == typeof(float))
            {
                if (member != null)
                {
                    var sField = attributes.FirstOrDefault(a => a is SliderFieldAttribute) as SliderFieldAttribute;
                    if (sField != null)
                    {
                        return(EditorGUILayout.Slider(name, (float)value, sField.left, sField.right));
                    }
                }
                return(EditorGUILayout.FloatField(name, (float)value));
            }

            if (t == typeof(byte))
            {
                return(Convert.ToByte(Mathf.Clamp(EditorGUILayout.IntField(name, (byte)value), 0, 255)));
            }

            if (t == typeof(Vector2))
            {
                return(EditorGUILayout.Vector2Field(name, (Vector2)value));
            }

            if (t == typeof(Vector3))
            {
                return(EditorGUILayout.Vector3Field(name, (Vector3)value));
            }

            if (t == typeof(Vector4))
            {
                return(EditorGUILayout.Vector4Field(name, (Vector4)value));
            }

            if (t == typeof(Quaternion))
            {
                var quat = (Quaternion)value;
                var vec4 = new Vector4(quat.x, quat.y, quat.z, quat.w);
                vec4 = EditorGUILayout.Vector4Field(name, vec4);
                return(new Quaternion(vec4.x, vec4.y, vec4.z, vec4.w));
            }

            if (t == typeof(Color))
            {
                return(EditorGUILayout.ColorField(name, (Color)value));
            }

            if (t == typeof(Rect))
            {
                return(EditorGUILayout.RectField(name, (Rect)value));
            }

            if (t == typeof(AnimationCurve))
            {
                return(EditorGUILayout.CurveField(name, (AnimationCurve)value));
            }

            if (t == typeof(Bounds))
            {
                return(EditorGUILayout.BoundsField(name, (Bounds)value));
            }

            if (t == typeof(LayerMask))
            {
                return(LayerMaskField(name, (LayerMask)value));
            }

            if (t.IsSubclassOf(typeof(System.Enum)))
            {
#if UNITY_5
                if (t.GetCustomAttributes(typeof(FlagsAttribute), true).FirstOrDefault() != null)
                {
                    return(EditorGUILayout.EnumMaskPopup(new GUIContent(name), (System.Enum)value));
                }
#endif
                return(EditorGUILayout.EnumPopup(name, (System.Enum)value));
            }

            if (typeof(IList).IsAssignableFrom(t))
            {
                return(ListEditor(name, (IList)value, t, instance));
            }

            if (typeof(IDictionary).IsAssignableFrom(t))
            {
                return(DictionaryEditor(name, (IDictionary)value, t, instance));
            }


            //show nested class members recursively
            if (value != null && !t.IsEnum && !t.IsInterface)
            {
                GUILayout.BeginVertical();
                EditorGUILayout.LabelField(name, t.FriendlyName());
                EditorGUI.indentLevel++;
                ShowAutoEditorGUI(value);
                EditorGUI.indentLevel--;
                GUILayout.EndVertical();
            }
            else
            {
                EditorGUILayout.LabelField(name, string.Format("({0})", t.FriendlyName()));
            }

            return(value);
        }