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(); }
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); }