using UnityEditor; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; namespace Invector.vShooter { using Invector.vCamera; using vCharacterController; using vItemManager; using vMelee; public class vCreateShooterCharacterEditor : EditorWindow { GUISkin skin; public GameObject template; public bool addMeleeCombat = true; public bool useGameController = true; public bool useInventory = true; public GameObject inventory; public vItemListData itemListData; public GameObject charObj; Animator charAnimator; Vector2 rect = new Vector2(500, 660); UnityEditor.Editor humanoidpreview; Texture2D m_Logo; /// /// 3rdPersonController Menu /// [MenuItem("Invector/Shooter/Create Shooter Controller", false, 2)] public static void CreateNewCharacter() { GetWindow(); } bool isHuman, isValidAvatar, charExist; public virtual void OnEnable() { m_Logo = Resources.Load("icon_v2") as Texture2D; if(Selection.activeObject) { charObj = Selection.activeGameObject; } if (charObj) { charAnimator = charObj.GetComponent(); humanoidpreview = UnityEditor.Editor.CreateEditor(charObj); } charExist = charAnimator != null; isHuman = charExist ? charAnimator.isHuman : false; isValidAvatar = charExist ? charAnimator.avatar.isValid : false; } public virtual void OnGUI() { if (!skin) { skin = Resources.Load("vSkin") as GUISkin; } GUI.skin = skin; this.minSize = rect; this.titleContent = new GUIContent("Character", null, "Third Person Character Creator"); GUILayout.BeginVertical("Character Creator Window", "window"); GUILayout.Label(m_Logo, GUILayout.MaxHeight(25)); GUILayout.Space(5); GUILayout.BeginVertical("box"); if (!charObj) { EditorGUILayout.HelpBox("Make sure your FBX model is set as Humanoid!", MessageType.Info); } else if (!charExist) { EditorGUILayout.HelpBox("Missing a Animator Component", MessageType.Error); } else if (!isHuman) { EditorGUILayout.HelpBox("This is not a Humanoid", MessageType.Error); } else if (!isValidAvatar) { EditorGUILayout.HelpBox(charObj.name + " is a invalid Humanoid", MessageType.Info); } template = EditorGUILayout.ObjectField("Template", template, typeof(GameObject), true, GUILayout.ExpandWidth(true)) as GameObject; charObj = EditorGUILayout.ObjectField("FBX Model", charObj, typeof(GameObject), true, GUILayout.ExpandWidth(true)) as GameObject; EditorGUILayout.Space(); EditorGUILayout.LabelField("--- Optional---"); useGameController = EditorGUILayout.Toggle("Add GameController", useGameController); addMeleeCombat = EditorGUILayout.Toggle("Add MeleeCombat", addMeleeCombat); useInventory = EditorGUILayout.Toggle("Add Inventory", useInventory); if (useInventory) { inventory = EditorGUILayout.ObjectField("Inventory Prefab", inventory, typeof(GameObject), true, GUILayout.ExpandWidth(true)) as GameObject; itemListData = EditorGUILayout.ObjectField("ItemListData", itemListData, typeof(vItemListData), true, GUILayout.ExpandWidth(true)) as vItemListData; } if (GUI.changed && charObj != null && charObj.GetComponent() == null) { humanoidpreview = UnityEditor.Editor.CreateEditor(charObj); } if (charObj != null && charObj.GetComponent() != null) { EditorGUILayout.HelpBox("This gameObject already contains the component vThirdPersonController", MessageType.Warning); } GUILayout.EndVertical(); //GUILayout.BeginHorizontal("box"); //EditorGUILayout.LabelField("Need to know how it works?"); //if (GUILayout.Button("Video Tutorial")) //{ // Application.OpenURL("https://www.youtube.com/watch?v=KQ5xha36tfE&index=1&list=PLvgXGzhT_qehtuCYl2oyL-LrWoT7fhg9d"); //} //GUILayout.EndHorizontal(); if (charObj) { charAnimator = charObj.GetComponent(); } charExist = charAnimator != null; isHuman = charExist ? charAnimator.isHuman : false; isValidAvatar = charExist ? charAnimator.avatar.isValid : false; if (CanCreate()) { DrawHumanoidPreview(); GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); if (GUILayout.Button("Create")) { Create(); } GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); } GUILayout.EndVertical(); } public virtual bool CanCreate() { return isValidAvatar && isHuman && charObj != null && charObj.GetComponent() == null; } /// /// Draw the Preview window /// public virtual void DrawHumanoidPreview() { GUILayout.FlexibleSpace(); if (humanoidpreview != null) { humanoidpreview.OnInteractivePreviewGUI(GUILayoutUtility.GetRect(100, 400), "window"); } } private GameObject InstantiateNewCharacter(GameObject selected) { if (selected == null) { return selected; } if (selected.scene.IsValid()) { return selected; } return PrefabUtility.InstantiatePrefab(selected) as GameObject; } /// /// Created the Third Person Controller /// public virtual void Create() { // base for the character GameObject newCharacter = InstantiateNewCharacter(charObj); if (!newCharacter) { return; } GameObject _template = Instantiate(template, newCharacter.transform.position, newCharacter.transform.rotation); // finds the '3D Model' gameobject or crate one if it doesn't exist Transform modelParent = _template.transform.Find("3D Model"); if (modelParent == null) { modelParent = new GameObject("3D Model").transform; modelParent.parent = _template.transform; } // finds the 'Invector Components' gameobject or crate one if it doesn't exist Transform componentsParent = _template.transform.Find("Invector Components"); if (componentsParent == null) { componentsParent = new GameObject("Invector Components").transform; componentsParent.parent = _template.transform; } newCharacter.transform.parent = modelParent; newCharacter.transform.localPosition = Vector3.zero; newCharacter.transform.localEulerAngles = Vector3.zero; _template.name = "vShooterController_" + charObj.gameObject.name; Animator animatorController = newCharacter.GetComponent(); Animator animatorTemplate = _template.GetComponent(); animatorTemplate.avatar = animatorController.avatar; animatorTemplate.Rebind(); DestroyImmediate(animatorController); newCharacter.tag = "Player"; var p_layer = LayerMask.NameToLayer("Player"); newCharacter.layer = p_layer; foreach (Transform t in newCharacter.transform.GetComponentsInChildren()) { t.gameObject.layer = p_layer; } Selection.activeGameObject = _template; // search for a MainCamera and attach to the tpCamera var mainCamera = Camera.main; var tpCamera = _template.GetComponentInChildren(); if (mainCamera == null) { mainCamera = new GameObject("MainCamera", typeof(Camera), typeof(AudioListener)).GetComponent(); mainCamera.tag = "MainCamera"; } if (mainCamera.transform.parent != tpCamera.transform) { mainCamera.transform.parent = tpCamera.transform; mainCamera.transform.localPosition = Vector3.zero; mainCamera.transform.localEulerAngles = Vector3.zero; } // add the gameController example if (useGameController) { GameObject gC = null; var gameController = FindObjectOfType(); if (gameController == null) { gC = new GameObject("vGameController_Example"); gC.AddComponent(); } } if (!addMeleeCombat) { var _meleeManager = _template.GetComponent(); DestroyImmediate(_meleeManager as vMeleeManager, true); } if (useInventory) { // add prefab inventory to the 'Invector Components' gameObject inside the Controller inventory = Instantiate(inventory, componentsParent.transform.position, componentsParent.transform.rotation); inventory.gameObject.transform.parent = componentsParent.transform; inventory.transform.localPosition = Vector3.zero; inventory.transform.localEulerAngles = Vector3.zero; // add shooter melee item list data var _itemManager = _template.GetComponent(); _itemManager.itemListData = itemListData; } else { // remove ItemManager from the character var _inventory = _template.GetComponent(); DestroyImmediate(_inventory as vItemManager, true); } // load bones for the BodySnapControl var _bodySnap = _template.GetComponentInChildren(); _bodySnap.LoadBones(); UnityEditor.SceneView.lastActiveSceneView.FrameSelected(); this.Close(); } } }