private void OnEnable()
    {
        td_target = (TopDownCharacter)target;

        if (TopDownIcon == null)
        {
            TopDownIcon = Resources.Load("TopDownIcon") as Texture;
        }
    }
    void OnGUI()
    {
        GUIStyle boldCenteredLabel = new GUIStyle(EditorStyles.boldLabel)
        {
            alignment = TextAnchor.MiddleCenter
        };

        EditorStyles.textField.wordWrap = true;

        EditorGUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        EditorGUILayout.BeginVertical("Box", GUILayout.Width(90 * Screen.width / 100));
        EditorGUILayout.LabelField(new GUIContent(TopDownIcon), boldCenteredLabel, GUILayout.ExpandWidth(true), GUILayout.Height(32));
        EditorGUILayout.LabelField("- TOP DOWN RPG -", boldCenteredLabel);
        EditorGUILayout.LabelField("Setup New Character", boldCenteredLabel);
        EditorGUILayout.HelpBox("This is used to setup new player characters \nYou should setup your desired model and desired character info asset that will be used to setup new player character.", MessageType.Info);
        EditorGUILayout.EndVertical();
        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();

        characterAsset = (TopDownCharacter)EditorGUILayout.ObjectField("Character Asset:", characterAsset, typeof(TopDownCharacter), true);


        if (characterAsset == null)
        {
            if (GUILayout.Button("Create new character card"))
            {
                TopDownCharacter charCard = new TopDownCharacter();
                AssetDatabase.CreateAsset(charCard, "Assets/New Character Card.asset");
                characterAsset = charCard;
            }
        }
        else
        {
            characterModel = (GameObject)EditorGUILayout.ObjectField("Character Model:", characterModel, typeof(GameObject), true);
        }

        if (characterModel != null && characterAsset != null)
        {
            characterSpellcaster = EditorGUILayout.Toggle("Can Character use magic?", characterSpellcaster);

            if (GUILayout.Button("Create Character"))
            {
                #region CREATE CHARACTER BUTTON FUNCTIONS
                //GameObject charObject = new GameObject();
                GameObject charObject = Instantiate(characterModel);

                charObject.name = "Top Down Character Controller";

                charObject.tag = "Player";
                //charObject.layer = 2;

                if (charObject.GetComponent <Animator>() == null)
                {
                    Animator charAnimator = charObject.AddComponent <Animator>();
                    RuntimeAnimatorController animController = Resources.Load("TopDownCharacterAnimationController") as RuntimeAnimatorController;
                    charAnimator.runtimeAnimatorController = animController;
                }
                else
                {
                    RuntimeAnimatorController animController = Resources.Load("TopDownCharacterAnimationController") as RuntimeAnimatorController;
                    charObject.GetComponent <Animator>().runtimeAnimatorController = animController;
                }

                Rigidbody charRigidbody = charObject.AddComponent <Rigidbody>();
                charRigidbody.useGravity     = false;
                charRigidbody.isKinematic    = false;
                charRigidbody.freezeRotation = true;

                CapsuleCollider charCollider = charObject.AddComponent <CapsuleCollider>();
                charCollider.radius = 0.3f;
                charCollider.height = 1.5f;
                charCollider.center = new Vector3(0f, 0.75f, 0f);

                NavMeshAgent charAgent = charObject.AddComponent <NavMeshAgent>();
                charAgent.speed            = 1f;
                charAgent.stoppingDistance = 0.2f;
                charAgent.height           = 1.5f;

                charObject.AddComponent <TopDownControllerMain>();

                TopDownControllerInteract charInteract = charObject.AddComponent <TopDownControllerInteract>();
                charInteract.noFocusWalkPoint = Resources.Load("TD_MoveTargetParticle") as GameObject;

                TopDownEquipmentManager charEquipManager = charObject.AddComponent <TopDownEquipmentManager>();
                //charEquipManager.itemsOnCharacter = charObject.GetComponentsInChildren<SkinnedMeshRenderer>();

                Transform[] allChildren = charObject.GetComponentsInChildren <Transform>();
                for (int i = 0; i < allChildren.Length; i++)
                {
                    if (charEquipManager.weaponMountPoint == null)
                    {
                        if ((allChildren[i].name.Contains("hand") || allChildren[i].name.Contains("HAND") || allChildren[i].name.Contains("Hand") ||
                             (allChildren[i].name.Contains("wrist") || allChildren[i].name.Contains("WRIST") || allChildren[i].name.Contains("Wrist")) &&
                             (allChildren[i].name.Contains("right") || allChildren[i].name.Contains("RIGHT") || allChildren[i].name.Contains("Right"))))
                        {
                            GameObject weaponMount = new GameObject();
                            weaponMount.name = "WEAPON_MOUNTPOINT";
                            weaponMount.transform.SetParent(allChildren[i]);
                            weaponMount.transform.localPosition    = Vector3.zero;
                            weaponMount.transform.localEulerAngles = Vector3.zero;
                            charEquipManager.weaponMountPoint      = weaponMount.transform;
                        }
                    }
                    if (charEquipManager.shieldMountPoint == null)
                    {
                        if ((allChildren[i].name.Contains("hand") || allChildren[i].name.Contains("HAND") || allChildren[i].name.Contains("Hand") ||
                             (allChildren[i].name.Contains("wrist") || allChildren[i].name.Contains("WRIST") || allChildren[i].name.Contains("Wrist")) &&
                             (allChildren[i].name.Contains("left") || allChildren[i].name.Contains("LEFT") || allChildren[i].name.Contains("Left"))))
                        {
                            GameObject shieldMount = new GameObject();
                            shieldMount.name = "SHIELD_MOUNTPOINT";
                            shieldMount.transform.SetParent(allChildren[i]);
                            shieldMount.transform.localPosition    = Vector3.zero;
                            shieldMount.transform.localEulerAngles = Vector3.zero;
                            charEquipManager.shieldMountPoint      = shieldMount.transform;
                        }
                    }
                    if (charEquipManager.shieldHolsterMountPoint == null)
                    {
                        if (allChildren[i].name.Contains("spine") || allChildren[i].name.Contains("SPINE") || allChildren[i].name.Contains("Spine") ||
                            allChildren[i].name.Contains("chest") || allChildren[i].name.Contains("CHEST") || allChildren[i].name.Contains("Chest"))
                        {
                            GameObject weaponHolsterPoint = new GameObject();
                            weaponHolsterPoint.name = "WEAPON_HOLSTER_MOUNTPOINT";
                            weaponHolsterPoint.transform.SetParent(allChildren[i]);
                            weaponHolsterPoint.transform.localPosition    = Vector3.zero;
                            weaponHolsterPoint.transform.localEulerAngles = Vector3.zero;
                            charEquipManager.weaponHolsterMountPoint      = weaponHolsterPoint.transform;


                            GameObject shieldHolsterPoint = new GameObject();
                            shieldHolsterPoint.name = "SHIELD_HOLSTER_MOUNTPOINT";
                            shieldHolsterPoint.transform.SetParent(allChildren[i]);
                            shieldHolsterPoint.transform.localPosition    = Vector3.zero;
                            shieldHolsterPoint.transform.localEulerAngles = Vector3.zero;
                            charEquipManager.shieldHolsterMountPoint      = shieldHolsterPoint.transform;
                        }
                    }
                }

                TopDownCharacterCard charCard = charObject.AddComponent <TopDownCharacterCard>();
                charCard.character = characterAsset;

                GameObject goCamTmp = new GameObject();
                goCamTmp.name = "Profile Camera";
                Camera cam = goCamTmp.AddComponent <Camera>();
                cam.clearFlags      = CameraClearFlags.SolidColor;
                cam.backgroundColor = Color.black;
                cam.orthographic    = false;
                cam.fieldOfView     = 40f;
                cam.nearClipPlane   = 0.15f;
                cam.farClipPlane    = 0.9f;
                cam.depth           = 10;
                cam.targetTexture   = Resources.Load("TD_CharacterPortrait") as RenderTexture;

                GameObject goLightTmp = new GameObject();
                goLightTmp.transform.SetParent(cam.transform);
                goLightTmp.transform.localPosition = Vector3.zero;
                Light light = goLightTmp.AddComponent <Light>();
                light.type            = LightType.Point;
                light.range           = 10f;
                light.intensity       = 0.5f;
                light.bounceIntensity = 0f;

                for (int i = 0; i < allChildren.Length; i++)
                {
                    if (allChildren[i].name.Contains("head") || allChildren[i].name.Contains("HEAD") || allChildren[i].name.Contains("Head"))
                    {
                        goCamTmp.transform.SetParent(allChildren[i].transform);
                        Debug.Log("Setting up camera for Runtime Profile support. Be sure to check that camera game object is set as a child of Head Bone of your characters skeleton and to adjust it to your liking.");
                        break;
                    }
                }

                charCard.portraitCamera = cam;
                charCard.portraitLight  = light;

                if (charObject.GetComponent <TopDownAI>())
                {
                    if (charObject.transform.Find("[Vision]") == false)
                    {
                        GameObject vision = new GameObject();
                        vision.name = "[Vision]";
                        vision.transform.SetParent(charObject.transform);
                        vision.transform.localPosition = Vector3.zero;
                        vision.layer = 1 << 1;

                        SphereCollider col = vision.AddComponent <SphereCollider>();
                        col.isTrigger = true;
                        col.center    = Vector3.zero;
                        col.radius    = charObject.GetComponent <TopDownCharacterCard>().aiDetectRadius;

                        charObject.GetComponent <TopDownCharacterCard>().aiVision = col;

                        //Debug.LogFormat("Setting up <b><color=yellow>Vision collider</color></b> as child of <b><color=red>" + charObject.gameObject.name + "</color></b>.");
                    }
                }
                else if (charObject.GetComponent <TopDownControllerInteract>())
                {
                    if (charObject.transform.Find("TD_CharacterCamera") == false)
                    {
                        GameObject tmp             = Resources.Load("TD_CharacterCamera") as GameObject;
                        GameObject inventoryCamera = Instantiate(tmp);
                        inventoryCamera.name = "TD_CharacterCamera";
                        inventoryCamera.transform.SetParent(charObject.transform);
                        inventoryCamera.transform.localPosition    = new Vector3(0f, 0.9f, 2f);
                        inventoryCamera.transform.localEulerAngles = new Vector3(0f, 180f, 0f);

                        charObject.GetComponent <TopDownCharacterCard>().inventoryCamera = inventoryCamera;
                        //Debug.LogFormat("Setting up <b><color=yellow>Inventory Camera</color></b> as a child of <b><color=blue>" + charObject.gameObject.name + "</color></b> player character.");
                    }
                }

                charObject.AddComponent <TopDownRpgSpellcaster>();

                characterModel.SetActive(false);

                Selection.activeObject = charObject.gameObject;

                Debug.LogFormat("New Character has been set up. You need to adjust weapon and shield mount and holster points for better visual.");
            }
            #endregion
        }
        else
        {
            EditorGUILayout.HelpBox("You need to set your characters model and character card before you can create your character.", MessageType.Warning);
        }
    }