Beispiel #1
0
 private void Awake()
 {
     instance         = this;
     tcc_Main         = GetComponent <TopDownControllerMain>();
     tcc_Interact     = GetComponent <TopDownControllerInteract>();
     td_characterCard = GetComponent <TopDownCharacterCard>();
 }
Beispiel #2
0
 private void Start()
 {
     tdc_Main            = GetComponent <TopDownControllerMain>();
     td_EquipmentManager = GetComponent <TopDownEquipmentManager>();
     startPos            = transform.position;
     tdc_CharacterCard   = GetComponent <TopDownCharacterCard>();
     //tdc_CharacterCard.activePlayerAi = true;
 }
Beispiel #3
0
    private void OnEnable()
    {
        td_target = (TopDownEquipmentManager)target;

        if (TopDownIcon == null)
        {
            TopDownIcon = Resources.Load("TopDownIcon") as Texture;
        }

        equipmentTypeProperty = serializedObject.FindProperty("characterEquipmentType");
    }
    public virtual void UnuseItem()   //Used only for equipment
    {
        equipmentManager = TopDownUIInventory.instance.currentEquipmentManager;

        if (equipmentManager.tcc_Main.tdcm_animator.GetBool("Attacking") == false)
        {
            if (equipmentManager.currentEquipment[(int)itemType] == this)
            {
                equipmentManager.UnequipItem(this);
            }
        }
    }
Beispiel #5
0
    public void DealDamage(GameObject target, float damage)
    {
        if (target.GetComponent <TopDownControllerMain>())
        {
            TopDownCharacterCard td_characterCard = target.GetComponent <TopDownCharacterCard>();

            if (td_characterCard.health == 0f)
            {
                return;
            }
            else
            {
                if (target.GetComponent <TopDownEquipmentManager>())
                {
                    TopDownEquipmentManager equipmentManager = target.GetComponent <TopDownEquipmentManager>();

                    if ((equipmentManager.armorPointsValue > 0))
                    {
                        float defensePercentage = equipmentManager.armorPointsValue / damage;
                        float finalDamage       = damage - (defensePercentage * 0.25f);

                        if (finalDamage > 0f)
                        {
                            td_characterCard.health -= finalDamage;
                        }
                        else
                        {
                            td_characterCard.health -= 0.9f;
                        }
                    }
                    else
                    {
                        if (damage > 0)
                        {
                            float finalDamage = damage + (damage * 0.5f);
                            td_characterCard.health -= finalDamage;
                        }
                        else
                        {
                            td_characterCard.health -= 0.9f;
                        }
                    }
                }
                else
                {
                    td_characterCard.health -= damage;
                }
            }
        }
    }
    private void Start()
    {
        td_CheckUI = TopDownCheckUI.instance;

        tdcc_Main             = GetComponent <TopDownControllerMain>();
        tdcc_NavMeshAgent     = GetComponent <NavMeshAgent>();
        tdcc_InputManager     = TopDownInputManager.instance;
        tdcc_EquipmentManager = GetComponent <TopDownEquipmentManager>();
        tdr_Spellcaster       = GetComponent <TopDownRpgSpellcaster>();
        if (GameObject.FindGameObjectWithTag("MainCamera"))
        {
            tdcc_CameraMain = GameObject.FindGameObjectWithTag("MainCamera").GetComponent <Camera>();
        }
        else if (GameObject.FindObjectOfType <Camera>())
        {
            tdcc_CameraMain = GameObject.FindObjectOfType <Camera>();
        }
    }
    public virtual void UseItem()
    {
        equipmentManager = TopDownUIInventory.instance.currentEquipmentManager;

        if (equipmentManager.tcc_Main.tdcm_animator.GetBool("Attacking") == false) //We want to be able to use items(equip/change them) only when we are not attacking
        {
            if (equipmentManager.currentEquipment[(int)itemType] != this)          //If this item is not equipped
            {
                equipmentManager.EquipItem(this);
                //Debug.Log("Equiping item " + itemName);
            }
            else
            {
                equipmentManager.UnequipItem(this);
                //Debug.Log("Unequiping item " + itemName);
            }
        }
    }
    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 AI", boldCenteredLabel);
        EditorGUILayout.HelpBox("This is used to setup new AI characters \nYou should setup your desired model that will be used to setup new AI character.", MessageType.Info);
        EditorGUILayout.EndVertical();
        GUILayout.FlexibleSpace();
        EditorGUILayout.EndHorizontal();

        aiModel   = (GameObject)EditorGUILayout.ObjectField("AI Model:", aiModel, typeof(GameObject), true);
        aiHostile = EditorGUILayout.Toggle("Is AI Hostile?", aiHostile);

        if (aiModel != null)
        {
            if (GUILayout.Button("Create AI"))
            {
                GameObject charObject = Instantiate(aiModel);

                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 = 1.5f;
                charAgent.height           = 1.5f;

                TopDownAI ai = charObject.AddComponent <TopDownAI>();

                TopDownEquipmentManager charEquipManager = charObject.AddComponent <TopDownEquipmentManager>();

                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;
                    col.gameObject.layer = 2;

                    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>.");
                }

                Debug.LogFormat("New AI has been set up. You need to adjust weapon and shield mount and holster points for better visual. You should also setup basic values (name, health, voice set) inside TopDownAI component located on your new AI.");
                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"))
                        {
                            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;
                        }
                    }
                }

                if (aiHostile == true)
                {
                    charObject.name  = "Top Down Enemy";
                    charObject.tag   = "Enemy";
                    charObject.layer = 0;
                    ai.hostile       = true;
                }
                else
                {
                    charObject.name  = "Top Down NPC";
                    charObject.tag   = "NPC";
                    charObject.layer = 0;
                    ai.hostile       = false;
                }

                Selection.activeObject = charObject.gameObject;

                aiModel.SetActive(false);
            }
        }
        else
        {
            EditorGUILayout.HelpBox("You need to set your AI model before you can create your character.", MessageType.Warning);
        }
    }
Beispiel #9
0
    /// <summary>
    /// Used when we want to add new character to our party.
    /// </summary>
    /// <param name="newCharacter"></param>
    public void AddCharacterToParty(GameObject newCharacter)
    {
        if (activeCharacters.Count < 4)
        {
            for (int i = 0; i < characterButtonsUi.Length; i++)
            {
                if (characterButtonsUi[i].occupied == false)
                {
                    activeCharacters.Add(newCharacter.GetComponent <TopDownControllerMain>());
                    characterButtonsUi[i].characterInSlot = newCharacter.GetComponent <TopDownControllerMain>();
                    characterButtonsUi[i].SetCharacterUI();

                    newCharacter.GetComponent <TopDownCharacterCard>().td_characterIndex  = i;
                    newCharacter.GetComponent <TopDownCharacterCard>().characterInventory = td_Inventory.charEquipmentSlots[i];
                    newCharacter.GetComponent <TopDownCharacterCard>().characterInventory.SetUpInventory(newCharacter.GetComponent <TopDownCharacterCard>());
                    newCharacter.GetComponent <TopDownCharacterCard>().UpdatePortrait();


                    //With this method we are adding equipment to usable equipment manager and inventory from npc
                    if (td_Inventory.currentEquipmentSlots != null && td_Inventory.currentEquipmentManager != null)   //We want to do this only if this is not our first cha
                    {
                        TopDownCharacterEquipmentSlots lastSlots   = td_Inventory.currentEquipmentSlots;
                        TopDownEquipmentManager        lastManager = td_Inventory.currentEquipmentManager;

                        lastManager.gameObject.GetComponent <TopDownCharacterCard>().characterInventory.gameObject.SetActive(false);

                        td_Inventory.currentEquipmentSlots   = newCharacter.GetComponent <TopDownCharacterCard>().characterInventory;
                        td_Inventory.currentEquipmentManager = newCharacter.GetComponent <TopDownCharacterCard>().equipmentManager;

                        //Check if NPC has equipment on himself, so we can add it to character inventory window.
                        if (newCharacter.GetComponent <TopDownStartupItemsSetup>())
                        {
                            TopDownStartupItemsSetup startUpItems = newCharacter.GetComponent <TopDownStartupItemsSetup>();

                            if (startUpItems.itemsEquipped.Count > 0)
                            {
                                for (int s = 0; s < startUpItems.itemsEquipped.Count; s++)
                                {
                                    TopDownItemObject tmp = startUpItems.itemsEquipped[s];
                                    td_Inventory.AddItemJustAsset(startUpItems.itemsEquipped[s]);
                                    newCharacter.GetComponent <TopDownCharacterCard>().characterInventory.equipmentSlots[(int)startUpItems.itemsEquipped[s].itemType].ClearSlot(startUpItems.itemsEquipped[s].slotOfThisItem);
                                    newCharacter.GetComponent <TopDownCharacterCard>().characterInventory.equipmentSlots[(int)startUpItems.itemsEquipped[s].itemType].AddItemToSlot(tmp);
                                }
                            }

                            if (startUpItems.itemsToPlaceInInventory.Length > 0)
                            {
                                for (int inv = 0; inv < startUpItems.itemsToPlaceInInventory.Length; inv++)
                                {
                                    td_Inventory.AddItemJustAsset(startUpItems.itemsToPlaceInInventory[inv]);
                                    startUpItems.itemsInInventory.Add(startUpItems.itemsToPlaceInInventory[inv]);
                                }

                                startUpItems.itemsToPlaceInInventory = null;
                            }
                        }

                        td_Inventory.currentEquipmentSlots   = lastSlots;
                        td_Inventory.currentEquipmentManager = lastManager;

                        lastManager.gameObject.GetComponent <TopDownCharacterCard>().characterInventory.gameObject.SetActive(true);

                        newCharacter.GetComponent <TopDownCharacterCard>().characterInventory.armorPointsTxt.text  = "AP: " + newCharacter.GetComponent <TopDownEquipmentManager>().armorPointsValue.ToString();
                        newCharacter.GetComponent <TopDownCharacterCard>().characterInventory.damagePointsTxt.text = "DP: " + newCharacter.GetComponent <TopDownEquipmentManager>().damagePointsValue.ToString();

                        newCharacter.GetComponent <TopDownCharacterCard>().characterInventory.gameObject.SetActive(false);
                    }

                    if (controllingCharacter == null)
                    {
                        controllingCharacter = newCharacter;
                        controllingCharacter.GetComponent <TopDownControllerInteract>().enabled = true;
                        if (controllingCharacter.GetComponent <TopDownCharacterCard>().inventoryCamera != null)
                        {
                            controllingCharacter.GetComponent <TopDownCharacterCard>().inventoryCamera.SetActive(true);
                        }

                        TopDownUIInventory.instance.currentEquipmentManager = newCharacter.GetComponent <TopDownEquipmentManager>();
                        TopDownUIInventory.instance.currentEquipmentSlots   = newCharacter.GetComponent <TopDownCharacterCard>().characterInventory;
                    }
                    else
                    {
                        newCharacter.GetComponent <TopDownCharacterCard>().SetAiActive();
                    }

                    newCharacter.tag = "Player";


                    if (characterCamera.td_Target == null)
                    {
                        characterCamera.td_Target = newCharacter.transform;
                    }

                    characterButtonsUi[i].occupied = true;

                    return;
                }
            }
        }
        else
        {
            Debug.Log("No more room in party. We already have max number(4) of character.");
        }
    }
    private void Start()
    {
        if (character != null)
        {
            name      = character.name;
            health    = character.health;
            maxHealth = character.health;
            energy    = character.energy;
            maxEnergy = character.energy;
        }
        else
        {
            name = aiName;
        }

        main             = GetComponent <TopDownControllerMain>();
        interact         = GetComponent <TopDownControllerInteract>();
        equipmentManager = GetComponent <TopDownEquipmentManager>();
        if (TopDownCharacterManager.instance != null)
        {
            characterManager = TopDownCharacterManager.instance;
        }
        if (TopDownUIManager.instance != null)
        {
            npcBar           = TopDownUIManager.instance.npcWorldName.GetComponent <TopDownUINpcNameBar>();
            placeBarOverHead = npcBar.placeBarOverHead;
            uiManager        = TopDownUIManager.instance;
        }

        if (GameObject.FindGameObjectWithTag("MainCamera"))
        {
            mainCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent <Camera>();
        }
        else if (GameObject.FindObjectOfType <Camera>())
        {
            mainCamera = GameObject.FindObjectOfType <Camera>();
        }

        if (GetComponent <TopDownAI>())
        {
            maxHealth = health;
            GetComponent <TopDownAI>().name             = aiName;
            GetComponent <TopDownAI>().voiceSet         = aiVoiceSet;
            GetComponent <TopDownAI>().visionCollider   = aiVision;
            GetComponent <TopDownAI>().detectRadius     = aiDetectRadius;
            GetComponent <TopDownAI>().fieldOfViewAngle = aiFieldOfView;
        }

        if (GetComponent <TopDownControllerInteract>())
        {
            int layerInt = gameObject.layer;

            if (inventoryCamera != null)
            {
                inventoryCamera.GetComponent <Camera>().cullingMask = 1 << layerInt;

                if (TopDownCharacterManager.instance != null)
                {
                    if (TopDownCharacterManager.instance.controllingCharacter != gameObject)
                    {
                        inventoryCamera.SetActive(false);
                    }
                }
            }
        }

        Transform[] allChildren = GetComponentsInChildren <Transform>();
        for (int i = 0; i < allChildren.Length; i++)
        {
            if (allChildren[i].name.Contains("head") || allChildren[i].name.Contains("HEAD") || allChildren[i].name.Contains("Head"))
            {
                nameBarPosition = allChildren[i];
            }
        }
    }
Beispiel #11
0
 private void Start()
 {
     equipmentManager = GetComponentInParent <TopDownEquipmentManager>();
 }
    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);
        }
    }