示例#1
0
        private void OnGUIx()
        {
            GUI.skin = Resources.Load("RPGMakerAssets/EditorSkinRPGMaker") as GUISkin;
            GUILayout.BeginVertical();
            GUILayout.BeginHorizontal();
            GUILayout.Space(1);
            GUILayout.Label("Prefab Browser", "mainTitle", GUILayout.Height(40));
            GUILayout.Space(1);
            GUILayout.EndHorizontal();

            GUILayout.Space(2);

            GUILayout.BeginHorizontal();

            GUILayout.Space(2);

            #region "Categories"
            GUILayout.BeginVertical("backgroundBox", GUILayout.Width(180), GUILayout.ExpandHeight(true));
            GUILayout.Label("Categories");
            var categories = Enum.GetNames(typeof(Rmh_PrefabType));

            var ifShowAll = showAll ? "listItemSelected" : "listItem";
            if (GUILayout.Button("All", ifShowAll, GUILayout.Height(25)))
            {
                showAll = true;
                return;
            }
            foreach (var cat in categories)
            {
                var ifSelected = selectedCategory.ToString() == cat && !showAll ? "listItemSelected" : "listItem";
                if (GUILayout.Button(cat.Replace('_', ' '), ifSelected, GUILayout.Height(25)))
                {
                    selectedCategory = (Rmh_PrefabType)Enum.Parse(typeof(Rmh_PrefabType), cat);
                    showAll          = false;
                    return;
                }
            }
            GUILayout.EndVertical();
            #endregion

            GUILayout.Space(2);

            #region "MainArea"
            GUILayout.BeginVertical("backgroundBoxMain");

            GUILayout.BeginHorizontal();
            GUILayout.Label("Filter:", GUILayout.Width(35));
            GUI.SetNextControlName("searchTerm");
            _searchTerm = GUILayout.TextField(_searchTerm, "nodeTextField", GUILayout.Width(200));
            GUILayout.Space(1);
            if (!showAll && !new [] { Rmh_PrefabType.Enemy, Rmh_PrefabType.NPC, Rmh_PrefabType.Harvest }.Any(c => c == selectedCategory))
            {
                if (GUILayout.Button("+ Create New", "genericButton", GUILayout.Height(25)))
                {
                    if (selectedCategory == Rmh_PrefabType.Skill)
                    {
                        Rme_PrefabGenerator.GeneratePrefab(selectedCategory, selectedSkillType);
                    }
                    else
                    {
                        Rme_PrefabGenerator.GeneratePrefab(selectedCategory);
                    }
                    UpdatePrefabs();
                }

                if (selectedCategory == Rmh_PrefabType.Skill)
                {
                    selectedSkillType = (SkillType)RPGMakerGUI.EnumPopup("Skill Type:", selectedSkillType);
                }
            }
            else if (!showAll)
            {
                if (GUILayout.Button("+ Create New In RPGMaker", "genericButton", GUILayout.Height(25)))
                {
                    Rme_Main.Init();
                }
            }

            GUILayout.EndHorizontal();

            if (Event.current.type == EventType.Repaint)
            {
                if (GUI.GetNameOfFocusedControl() == "searchTerm" && _searchTerm == _searchTermPlaceholder)
                {
                    _searchTerm = "";
                }
            }
            List <PrefabInfo> objectsFiltered = objects;
            if (_searchTerm != _searchTermPlaceholder)
            {
                if (showAll)
                {
                    objectsFiltered = objects.Where(o => o.Identifier != null &&
                                                    ((o.Identifier.SearchName.ToLower().Contains(_searchTerm.ToLower()) ||
                                                      o.Identifier.PrefabType.ToString().ToLower().Contains(_searchTerm.ToLower())))
                                                    ).ToList();
                }
                else
                {
                    objectsFiltered = objects.Where(o => o.Identifier != null &&
                                                    ((o.Identifier.SearchName.ToLower().Contains(_searchTerm.ToLower()) ||
                                                      o.Identifier.PrefabType.ToString().ToLower().Contains(_searchTerm.ToLower())) &&
                                                     o.Identifier.PrefabType == selectedCategory)
                                                    ).ToList();
                }
            }


            content = objectsFiltered.Select(s => new GUIContent(s.Identifier.SearchName + (showTriangles ? s.Details : ""), s.Preview)).ToArray();


            scrollPos           = GUILayout.BeginScrollView(scrollPos);
            selectedObjectIndex = GUILayout.SelectionGrid(selectedObjectIndex, content, Window.position.width > 520 ? (int)((Window.position.width - 520) / 120).RoundToNearest(1) : 1, "prefabWindowGrid");
            if (selectedObjectIndex > content.Length - 1)
            {
                selectedObjectIndex = 0;
            }
            var oldSelectedObject = selectedObject;
            selectedObject = selectedObjectIndex != -1 && objectsFiltered.Count > 0 ? objectsFiltered[selectedObjectIndex] : null;
            if (selectedObject != oldSelectedObject)
            {
                GUI.FocusControl("");
            }
            GUILayout.EndScrollView();

            GUILayout.EndVertical();
            #endregion

            GUILayout.Space(2);

            #region "Properties"
            GUILayout.BeginVertical("backgroundBox", GUILayout.Width(200), GUILayout.ExpandHeight(false));
            GUILayout.Space(5);
            GUILayout.BeginHorizontal();
            GUILayout.Space(5);
            GUILayout.BeginVertical();
            GUILayout.Label("Properties");
            if (selectedObject != null)
            {
                if (selectedObject.Identifier != null)
                {
                    EditorGUILayout.PrefixLabel("Name:");
                    selectedObject.Identifier.SearchName = EditorGUILayout.TextField(selectedObject.Identifier.SearchName);
                    EditorGUILayout.PrefixLabel("Type:");
                    selectedObject.Identifier.PrefabType = (Rmh_PrefabType)EditorGUILayout.EnumPopup(selectedObject.Identifier.PrefabType);
                    EditorGUILayout.LabelField(selectedObject.Identifier.PrefabType.ToString());
                    if (GUILayout.Button("Spawn To Scene", "genericButton", GUILayout.Height(25)))
                    {
                        var obj = AssetDatabase.LoadAssetAtPath <GameObject>(selectedObject.Path);
                        GeneralMethodsEditor.InstantiateInView(obj);
                    }
                    if (GUILayout.Button("Select in Project Folder", "genericButton", GUILayout.Height(25)))
                    {
                        var obj = AssetDatabase.LoadAssetAtPath <GameObject>(selectedObject.Path);
                        Selection.activeObject     = obj;
                        Selection.activeGameObject = obj;
                    }
                }
            }
            GUILayout.EndVertical();
            GUILayout.EndHorizontal();
            GUILayout.FlexibleSpace();
            GUILayout.EndVertical();
            #endregion

            GUILayout.Space(2);

            GUILayout.EndHorizontal();

            GUILayout.Space(2);

            GUILayout.BeginHorizontal("backgroundBox", GUILayout.Height(30));
            GUILayout.Space(5);
            if (GUILayout.Button("Reload Prefabs", "genericButton", GUILayout.Height(25)))
            {
                objects = new List <PrefabInfo>();
                UpdatePrefabs();
                return;
            }
            if (GUILayout.Button("Toggle Tri. Count", "genericButton", GUILayout.Height(25)))
            {
                showTriangles = !showTriangles;
            }
            GUILayout.FlexibleSpace();

            GUILayout.Label(objectsFiltered.Count + " Items", GUILayout.Width(120));
            GUILayout.EndHorizontal();

            GUILayout.EndVertical();
        }
示例#2
0
        public static string GeneratePrefab(Rmh_PrefabType prefabType, SkillType?skillType = null, string param = "")
        {
            var prefab = new GameObject(prefabType + "_" + "Prefab_" + GeneralMethods.NextID);

            var identifier = prefab.AddComponent <Rm_PrefabIdentifier>();

            identifier.SearchName = prefab.name;
            identifier.PrefabType = prefabType;

            switch (prefabType)
            {
            case Rmh_PrefabType.Casting:
            case Rmh_PrefabType.Cast:
            case Rmh_PrefabType.Impact:
            case Rmh_PrefabType.Effect_Active:
            case Rmh_PrefabType.Effect_Activated:
            case Rmh_PrefabType.Effect_Expired:
            case Rmh_PrefabType.DoT_Damage_Tick:
            case Rmh_PrefabType.Moving_To_Effect:
            case Rmh_PrefabType.Target_Reached_Effect:
            case Rmh_PrefabType.Melee_Effect:
                prefab.AddComponent <DestroyHelper>();
                prefab.AddComponent <IgnoredByRaycast>();
                break;

            case Rmh_PrefabType.Interactable:
                var cc1 = prefab.AddComponent <CapsuleCollider>();
                cc1.isTrigger = true;
                var io = prefab.AddComponent <InteractiveObjectMono>();
                io.ObjectID = param;
                AddCameraPivot(prefab);

                var minimapIcon2 = Resources.Load("RPGMakerAssets/PrefabGen/MinimapIconUI");
                var minimapUI2   = (GameObject)PrefabUtility.InstantiatePrefab(minimapIcon2);
                minimapUI2.transform.SetParent(prefab.transform, false);
                minimapUI2.transform.localPosition = new Vector3(0, -0.5f, 0);

                var minimapIconModel2 = minimapUI2.GetComponent <MinimapIconModel>();
                minimapIconModel2.Type = MinimapIconType.Interactable;

                break;

            case Rmh_PrefabType.Harvest:
                var cc = prefab.AddComponent <CapsuleCollider>();
                cc.isTrigger = true;
                var ih = prefab.AddComponent <InteractableHarvestable>();
                ih.ObjectID = param;
                prefab.tag  = "Harvestable";

                var minimapIcon1 = Resources.Load("RPGMakerAssets/PrefabGen/MinimapIconUI");
                var minimapUI1   = (GameObject)PrefabUtility.InstantiatePrefab(minimapIcon1);
                minimapUI1.transform.SetParent(prefab.transform, false);
                minimapUI1.transform.localPosition = new Vector3(0, -0.5f, 0);

                var minimapIconModel1 = minimapUI1.GetComponent <MinimapIconModel>();
                minimapIconModel1.Type = MinimapIconType.Harvestable;

                break;

            case Rmh_PrefabType.Skill:
                prefab.AddComponent <DestroyHelper>();
                if (skillType != SkillType.Spawn)
                {
                    prefab.AddComponent <IgnoredByRaycast>();
                }
                break;

            case Rmh_PrefabType.SpawnPoint:
                prefab.tag = "SpawnPosition";
                prefab.AddComponent <Cull>();
                var spawnGraphic = Resources.Load("RPGMakerAssets/PrefabGen/SpawnPos");
                var graphic      = PrefabUtility.InstantiatePrefab(spawnGraphic) as GameObject;
                graphic.transform.parent        = prefab.transform;
                graphic.transform.localPosition = Vector3.zero;
                break;

            case Rmh_PrefabType.Target_Selected_Prefab:
                prefab.AddComponent <IgnoredByRaycast>();
                prefab.AddComponent <TargetLockPrefab>();
                break;

            case Rmh_PrefabType.Cast_Area_Prefab:
                break;

            case Rmh_PrefabType.Auto_Attack_Projectile:
                prefab.AddComponent <IgnoredByRaycast>();
                prefab.AddComponent <DestroyHelper>();
                prefab.AddComponent <ProjectileAutoAttackHandler>();
                var boxCollider = prefab.AddComponent <BoxCollider>();
                boxCollider.isTrigger = false;
                var rigidbody = prefab.AddComponent <Rigidbody>();
                rigidbody.isKinematic    = false;
                rigidbody.useGravity     = false;
                rigidbody.freezeRotation = true;
                break;

            case Rmh_PrefabType.Misc:
                break;

            case Rmh_PrefabType.Player_Class:
            case Rmh_PrefabType.Enemy:
            case Rmh_PrefabType.NPC:
                var charC = prefab.AddComponent <CharacterController>();
                charC.slopeLimit = 25;
                charC.height     = 2;
                charC.center     = new Vector3(0, 1, 0);
                charC.radius     = 0.5f;
                var navMeshAgent = prefab.AddComponent <NavMeshAgent>();
                navMeshAgent.radius            = 0.5f;
                navMeshAgent.height            = 2;
                navMeshAgent.enabled           = false;
                navMeshAgent.avoidancePriority = 50;
                var rigidB = prefab.AddComponent <Rigidbody>();
                rigidB.useGravity  = true;
                rigidB.isKinematic = true;
                rigidB.constraints = RigidbodyConstraints.FreezePosition | RigidbodyConstraints.FreezeRotation;
                var boxC = prefab.AddComponent <BoxCollider>();
                boxC.isTrigger = false;
                boxC.center    = new Vector3(0, 1, 0);
                boxC.size      = new Vector3(1, 2, 1);
                var rpgC = prefab.AddComponent <RPGController>();
                rpgC.cameraMode = Rm_RPGHandler.Instance.DefaultSettings.DefaultCameraMode;
                prefab.AddComponent <RPGAnimation>();
                prefab.AddComponent <RPGCombat>();

                var capsuleGraphic = GameObject.CreatePrimitive(PrimitiveType.Capsule);
                var capsuleCol     = capsuleGraphic.GetComponent <CapsuleCollider>();
                UnityEngine.Object.DestroyImmediate(capsuleCol);
                capsuleGraphic.transform.parent        = prefab.transform;
                capsuleGraphic.transform.localPosition = new Vector3(0, 1, 0);

                rpgC.characterModel = capsuleGraphic;

                var targetLockH = prefab.AddComponent <TargetLockHandler>();

                var targetLockPrefab = Resources.Load("RPGMakerAssets/PrefabGen/TargetLock");
                var targetLock       = PrefabUtility.InstantiatePrefab(targetLockPrefab) as GameObject;
                targetLock.transform.parent        = prefab.transform;
                targetLock.transform.localPosition = new Vector3(0, 0.05f, 0);

                targetLockH.TargetLockObject = targetLock;

                var cameraPivot = new GameObject("cameraPivot");
                cameraPivot.transform.parent        = prefab.transform;
                cameraPivot.transform.localPosition = new Vector3(0, 1.7f, 0);

                var minimapIcon = Resources.Load("RPGMakerAssets/PrefabGen/MinimapIconUI");
                var minimapUI   = (GameObject)PrefabUtility.InstantiatePrefab(minimapIcon);
                minimapUI.transform.SetParent(prefab.transform, false);
                minimapUI.transform.localPosition = new Vector3(0, -0.5f, 0);

                var minimapIconModel = minimapUI.GetComponent <MinimapIconModel>();
                switch (prefabType)
                {
                case Rmh_PrefabType.Enemy:
                    minimapIconModel.Type = MinimapIconType.Enemy;
                    break;

                case Rmh_PrefabType.NPC:
                    minimapIconModel.Type = MinimapIconType.NPC;
                    break;

                case Rmh_PrefabType.Player_Class:
                    minimapIconModel.Type = MinimapIconType.Player;
                    break;
                }

                break;

            case Rmh_PrefabType.Sound_FX:
                prefab.AddComponent <Audio_SFX>();
                break;

            case Rmh_PrefabType.Ambient_Music:
                prefab.AddComponent <Audio_Ambient>();
                break;

            case Rmh_PrefabType.Background_Music:
                prefab.AddComponent <Audio_BgMusic>();
                break;

            case Rmh_PrefabType.Map_Location_Trigger:
                //throw new NotImplementedException();
                break;

            case Rmh_PrefabType.Event_Trigger:
                //throw new NotImplementedException();
                break;

            case Rmh_PrefabType.Loot_Item_Prefab:
                var rigidBody = prefab.AddComponent <Rigidbody>();
                rigidBody.useGravity  = true;
                rigidBody.isKinematic = false;
                rigidBody.constraints = RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ | RigidbodyConstraints.FreezeRotation;
                var boxCol = prefab.AddComponent <BoxCollider>();
                boxCol.isTrigger = true;
                boxCol.size      = new Vector3(0.5f, 0.5f, 0.5f);
                var sphereCol = prefab.AddComponent <SphereCollider>();
                sphereCol.isTrigger = false;
                sphereCol.radius    = 0.2f;
                prefab.AddComponent <LootItemMono>();
                prefab.tag   = "LootItem";
                prefab.layer = LayerMask.NameToLayer("LootItem");
                var c       = GameObject.CreatePrimitive(PrimitiveType.Cube);
                var cubeCol = c.GetComponent <BoxCollider>();
                UnityEngine.Object.DestroyImmediate(cubeCol);
                c.transform.localScale    = new Vector3(0.35f, 0.15f, 0.35f);
                c.transform.parent        = prefab.transform;
                c.transform.localPosition = Vector3.zero;
                c.layer = LayerMask.NameToLayer("LootItem");
                break;

            default:
                Debug.LogError("Prefab creation not defined for this object!");
                break;
            }

            if (prefabType == Rmh_PrefabType.Player_Class)
            {
                prefab.AddComponent <PlayerMono>();
                var navMeshObs = prefab.AddComponent <NavMeshObstacle>();
                navMeshObs.shape   = NavMeshObstacleShape.Capsule;
                navMeshObs.height  = 2;
                navMeshObs.center  = new Vector3(0, 1, 0);
                navMeshObs.radius  = 0.5f;
                navMeshObs.carving = false;
                navMeshObs.enabled = false;
                prefab.tag         = "Player";
                prefab.layer       = LayerMask.NameToLayer("Combatant");

                //todo: rendertex
                //var cameraPrefab = Resources.Load("RPGMakerAssets/PrefabGen/PortraitCamera");
                //var camera = PrefabUtility.InstantiatePrefab(cameraPrefab) as GameObject;
                //camera.transform.SetParent(prefab.transform, false);
                //camera.transform.localPosition = new Vector3(0, 1.25f, 3f);
                //camera.transform.localRotation = Quaternion.Euler(new Vector3(0, 180, 0));
            }
            else if (prefabType == Rmh_PrefabType.NPC || prefabType == Rmh_PrefabType.Enemy)
            {
                prefab.AddComponent <RPGPatrol>();
                prefab.AddComponent <RPGFollow>();
                var combatantUi  = prefab.AddComponent <CombatantUI>();
                var spawnGraphic = Resources.Load("RPGMakerAssets/PrefabGen/CombatantUI");
                var graphic      = PrefabUtility.InstantiatePrefab(spawnGraphic) as GameObject;
                graphic.transform.SetParent(prefab.transform, false);
                graphic.transform.localPosition = new Vector3(0, 2.5f, 0);

                combatantUi.Canvas     = graphic;
                combatantUi.HealthBar  = graphic.transform.Find("HealthBar").GetComponent <Image>();
                combatantUi.HealthText = graphic.transform.Find("HealthText").GetComponent <Text>();

                if (prefabType == Rmh_PrefabType.Enemy)
                {
                    var enemyMono = prefab.AddComponent <EnemyCharacterMono>();
                    enemyMono.EnemyID = param;
                    prefab.tag        = "Enemy";
                    prefab.layer      = LayerMask.NameToLayer("Combatant");
                }
                if (prefabType == Rmh_PrefabType.NPC)
                {
                    var capCol = prefab.AddComponent <CapsuleCollider>();
                    capCol.isTrigger = true;
                    capCol.center    = new Vector3(0, 1, 0);
                    capCol.radius    = 1;
                    capCol.height    = 2.5f;
                    capCol.direction = 1;

                    var npcMono = prefab.AddComponent <NpcCharacterMono>();
                    prefab.AddComponent <InteractableNPC>();
                    npcMono.NpcID = param;

                    prefab.tag   = "NPC";
                    prefab.layer = LayerMask.NameToLayer("Combatant");

                    var npcQuestStatus    = Resources.Load("RPGMakerAssets/PrefabGen/NpcQuestStatus");
                    var npcQuestStatusObj = (GameObject)PrefabUtility.InstantiatePrefab(npcQuestStatus);
                    npcQuestStatusObj.transform.SetParent(prefab.transform, false);
                    npcQuestStatusObj.transform.localPosition = new Vector3(0, 2.6f, 0);

                    npcMono.QuestStatusModel = npcQuestStatusObj.GetComponent <NpcQuestStatusModel>();
                }
            }

            if (prefabType == Rmh_PrefabType.Skill)
            {
                prefab = AddSkillScripts(prefab, skillType.Value);
            }

            string path = "";

            if (prefabType == Rmh_PrefabType.Player_Class)
            {
                path = GeneralMethodsEditor.CreatePrefab(prefab, "Prefabs/Classes");
            }
            else
            {
                path = GeneralMethodsEditor.CreatePrefab(prefab);
            }

            Selection.activeObject = SceneView.currentDrawingSceneView;
            if (Selection.activeObject != null)
            {
                var sceneCam = SceneView.currentDrawingSceneView.camera;
                var spawnPos = sceneCam.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, 3f));
                prefab.transform.position = spawnPos;
            }

            return(path);
        }