Advertisement
MaximilianPs

Synty's Character Cleaner For Blink's RPG Builder

Jan 21st, 2022 (edited)
908
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 28.58 KB | None | 0 0
  1. /*************************************************************************************************
  2.  *  1.1 - 19/01/2021 by MaximilianPS                                                             *
  3.  *                                                                                               *
  4.  *  This piece of cake as been made to makes a bit easier to setup the character for             *
  5.  *  RPG Builder by Blink.                                                                        *
  6.  *  It will re-organize the hierarchy structure for the Modular Character from Synty.            *
  7.  *  You will have Chest with Upper Arms (booth arms) and same for gloves and boots.              *
  8.  *  Will be created a parent object that will store the left and right element so you            *
  9.  *  have to just enable the parent to have booth gloves or boots enabled.                        *
  10.  *  Same for the Chest, once activated the Parent, also booth upper arms will be visibile.       *
  11.  *                                                                                               *
  12.  *  Anyway the code should be extremely easy to be modified for any use.                         *
  13.  *                                                                                               *
  14.  *                                                             And soz for my English ^^"        *
  15.  *************************************************************************************************/
  16. using System.Collections;
  17. using System.Collections.Generic;
  18. using UnityEngine;
  19. using UnityEditor;
  20. using System.Linq;
  21.  
  22. namespace MaximilianPs
  23. {
  24.     [ExecuteInEditMode]
  25.     public class SetupSyntyHero4RPGB : MonoBehaviour
  26.     {
  27.         private enum Gender { Male, Female }
  28.         private GameObject body;
  29.         private GameObject hair;
  30.         private GameObject head;
  31.         private GameObject beard;
  32.         private GameObject ear;
  33.         private GameObject headgear;
  34.         private GameObject headgearDeco;
  35.         private GameObject headgearNoHair;
  36.         private GameObject headgearNoBeard;
  37.         private GameObject headgearNoHead;
  38.         private GameObject armor;
  39.         private GameObject chest;
  40.         private GameObject elbows;
  41.         private GameObject shoulders;
  42.         private GameObject lowerArms;
  43.         private GameObject back;
  44.         private GameObject hands;
  45.         private GameObject pants;
  46.         private GameObject hipsAttachmentRight;
  47.         private GameObject hipsAttachmentLeft;
  48.         private GameObject knees;
  49.         private GameObject boots;
  50.  
  51.         [SerializeField]
  52.         [Tooltip("Within which GameObject the body parts are contained (usually Modular_Characters)")]
  53.         private Transform parent;
  54.        
  55.         [Space]
  56.         [SerializeField]
  57.         private Gender gender = Gender.Male;
  58.  
  59.         [Space]
  60.         [SerializeField]
  61.         [Tooltip("WARNING THIS WILL REMOVE ALL OPPOSITE GENDER GAMEOBJECTS")]
  62.         private bool removeOppositeGender = false;
  63.         [SerializeField]
  64.         [Tooltip("START TO MOVE THE ENTIRE UNIVERSE!")]
  65.         private bool startSettingUp = false;
  66.  
  67.         private void Update()
  68.         {
  69.             if(startSettingUp)
  70.             {
  71.                 startSettingUp = false;
  72.                 Debug.Log("Starting the job");
  73.                 SetItUp(gender);
  74.             }
  75.         }
  76.  
  77.         private void SetItUp(Gender gender)
  78.         {
  79.             DisableOppositeGenderGameObjects();
  80.             CreateParents();
  81.  
  82.             // Store all elements in an array to speedup operations =)
  83.             var elements = parent.gameObject.GetComponentsInChildren(typeof(Renderer), true);
  84.  
  85.             // HEAD
  86.             Debug.Log("Working on heads...");
  87.             for (int i = 0; i < elements.Length; i++)
  88.             {
  89.                 if (elements[i].transform.name.Contains("Chr_Head_"+ gender))
  90.                 {
  91.                     elements[i].transform.parent = head.transform;
  92.                  
  93.                     if(StringTail(elements[i].transform.name.ToString(), 2) != "00")
  94.                         elements[i].gameObject.SetActive(false);
  95.                 }
  96.             }
  97.  
  98.             // EARS
  99.             Debug.Log("Working on ears...");
  100.             for (int i = 0; i < elements.Length; i++)
  101.             {
  102.                 if (elements[i].transform.name.Contains("Chr_Ear_"))
  103.                 {
  104.                     elements[i].transform.parent = ear.transform;
  105.                     elements[i].gameObject.SetActive(false);
  106.                 }
  107.             }
  108.  
  109.             // HAIRS
  110.             Debug.Log("Working on hairs...");
  111.             for (int i = 0; i < elements.Length; i++)
  112.             {
  113.                 if (elements[i].transform.name.Contains("Chr_Hair_"))
  114.                 {
  115.                     elements[i].transform.parent = hair.transform;
  116.                     elements[i].gameObject.SetActive(false);
  117.                 }
  118.             }
  119.  
  120.             // BEARDS
  121.             Debug.Log("Working on beards...");
  122.             for (int i = 0; i < elements.Length; i++)
  123.             {
  124.                 if (elements[i].transform.name.Contains("Chr_FacialHair_"))
  125.                 {
  126.                     elements[i].transform.parent = beard.transform;
  127.                     elements[i].gameObject.SetActive(false);
  128.                 }
  129.             }
  130.            
  131.             // HEADGEAR GEAR
  132.             Debug.Log("Working on Headgears...");
  133.             for (int i = 0; i < elements.Length; i++)
  134.             {
  135.                 if (elements[i].transform.name.Contains("Base_Hair_"))
  136.                 {
  137.                     elements[i].transform.parent = headgear.transform;
  138.                     elements[i].gameObject.SetActive(false);
  139.                 }
  140.             }
  141.  
  142.             // HEADGEAR NO BEARDS
  143.             Debug.Log("Working on headgears without beards...");
  144.             for (int i = 0; i < elements.Length; i++)
  145.             {
  146.                 if (elements[i].transform.name.Contains("No_FacialHair_"))
  147.                 {
  148.                     elements[i].transform.parent = headgearNoBeard.transform;
  149.                     elements[i].gameObject.SetActive(false);
  150.                 }
  151.             }
  152.  
  153.             // HEADGEAR NO HAIRS
  154.             Debug.Log("Working on headgears without hair...");
  155.             for (int i = 0; i < elements.Length; i++)
  156.             {
  157.                 if (elements[i].transform.name.Contains("No_Hair_"))
  158.                 {
  159.                     elements[i].transform.parent = headgearNoHair.transform;
  160.                     elements[i].gameObject.SetActive(false);
  161.                 }
  162.             }
  163.  
  164.             // HEADGEAR NO HEAD
  165.             Debug.Log("Working on headgears without heads...");
  166.             for (int i = 0; i < elements.Length; i++)
  167.             {
  168.                 if (elements[i].transform.name.Contains("No_Elements_" + gender))
  169.                 {
  170.                     elements[i].transform.parent = headgearNoHead.transform;
  171.                     elements[i].gameObject.SetActive(false);
  172.                 }
  173.             }
  174.  
  175.             // HEADGEAR DECO
  176.             Debug.Log("Working on headgears decorations...");
  177.             for (int i = 0; i < elements.Length; i++)
  178.             {
  179.                 if (elements[i].transform.name.Contains("Chr_HelmetAttachment_"))
  180.                 {
  181.                     elements[i].transform.parent = headgearDeco.transform;
  182.                     elements[i].gameObject.SetActive(false);
  183.                 }
  184.             }
  185.  
  186.             // BACK
  187.             Debug.Log("Working on back accessories...");
  188.             for (int i = 0; i < elements.Length; i++)
  189.             {
  190.                 if (elements[i].transform.name.Contains("Chr_BackAttachment_"))
  191.                 {
  192.                     elements[i].transform.parent = back.transform;
  193.                     elements[i].gameObject.SetActive(false);
  194.                 }
  195.             }
  196.  
  197.             // CHEST
  198.             // this will include also Upper Arms (left and right) so there's a bit of job to do:
  199.             // We need a new GameObject called Chest_XX that will be the parent for the Chest armor and the corresponding arms!
  200.             Debug.Log("Working on chest armors...");
  201.             for (int i = 0; i < elements.Length; i++)
  202.             {
  203.  
  204.                 if (elements[i].transform.name.Contains("Chr_Torso_" + gender))
  205.                 {
  206.                     // Creating the Arms strings
  207.                     string armLeftName = "Chr_ArmUpperLeft_" + gender + "_" + StringTail(elements[i].transform.name, 2);
  208.                     string armRightName = "Chr_ArmUpperRight_" + gender + "_" + StringTail(elements[i].transform.name, 2);
  209.  
  210.                     // We are using Component 'cause to find the real objects and not the parent, we used the SkinnedMeshRenderer as reference
  211.                     Component armLeft = elements.Where(obj => obj.name == armLeftName).FirstOrDefault();
  212.                     Component armRight = elements.Where(obj => obj.name == armRightName).FirstOrDefault();
  213.  
  214.                     // Creating the Chest parent.
  215.                     GameObject torso = new GameObject();
  216.                     torso.name = "Chest";
  217.                     torso.gameObject.AddComponent<SkinnedMeshRenderer>();
  218.  
  219.                     if (StringTail(elements[i].transform.name, 2) == "00")
  220.                     {
  221.                         // Move the Chest parent inside the body, this one is the naked version
  222.                         torso.transform.parent = body.transform;
  223.  
  224.                         elements[i].transform.parent = torso.transform;
  225.                         armLeft.transform.parent = torso.transform;
  226.                         armRight.transform.parent = torso.transform;
  227.  
  228.                     }
  229.                     else
  230.                     {
  231.                         // Moving the chest inside the new parent object
  232.                         elements[i].transform.parent = torso.transform;
  233.  
  234.                         if(armRight != null)
  235.                         {
  236.                             armLeft.transform.parent = torso.transform;
  237.                             armRight.transform.parent = torso.transform;
  238.                         }
  239.  
  240.                         torso.name = "Chest_" + StringTail(elements[i].name, 2);
  241.                         torso.transform.parent = chest.transform;   // Moving the current Armor Parent, inside the \ARMOR\CHEST\...
  242.                         torso.gameObject.SetActive(false);
  243.                     }
  244.                 }
  245.             }
  246.  
  247.             // SHOULDERS
  248.             Debug.Log("Working on shoulders armors...");
  249.             for (int i = 0; i < elements.Length; i++)
  250.             {
  251.                 if (elements[i].transform.name.Contains("Chr_ShoulderAttachRight_"))
  252.                 {
  253.                     string partIndex = StringTail(elements[i].transform.name, 2);
  254.                     GameObject parentShoulders = new GameObject();
  255.                     parentShoulders.name = "Shoulders_" + partIndex;
  256.  
  257.                     // Creating the shoulder(s) strings
  258.                     string shoulderLeftName = "Chr_ShoulderAttachLeft_" + partIndex;
  259.                     string shoulderRightName = "Chr_ShoulderAttachRight_" + partIndex;
  260.  
  261.                     // We are using Component 'cause to find the real objects and not the parent, we used the SkinnedMeshRenderer as reference
  262.                     Component shoulderLeft = elements.Where(obj => obj.name == shoulderLeftName).FirstOrDefault();
  263.                     Component shoulderRight = elements.Where(obj => obj.name == shoulderRightName).FirstOrDefault();
  264.  
  265.                     shoulderLeft.transform.parent = parentShoulders.transform;
  266.                     shoulderRight.transform.parent = parentShoulders.transform;
  267.  
  268.                     parentShoulders.gameObject.AddComponent<SkinnedMeshRenderer>();
  269.                     parentShoulders.transform.parent = shoulders.transform;
  270.                     parentShoulders.gameObject.SetActive(false);
  271.                 }
  272.             }
  273.  
  274.             // ELBOWS
  275.             Debug.Log("Working on elbows armors...");
  276.             for (int i = 0; i < elements.Length; i++)
  277.             {
  278.                 if (elements[i].transform.name.Contains("Chr_ElbowAttachRight_"))
  279.                 {
  280.                     string partIndex = StringTail(elements[i].transform.name, 2);
  281.                     GameObject parentElbow = new GameObject();
  282.                     parentElbow.name = "Elbows_" + partIndex;
  283.  
  284.                     // Creating the shoulder(s) strings
  285.                     string elbowLeftName = "Chr_ElbowAttachLeft_" + partIndex;
  286.                     string elbowRightName = "Chr_ElbowAttachRight_" + partIndex;
  287.  
  288.                     // We are using Component 'cause to find the real objects and not the parent, we used the SkinnedMeshRenderer as reference
  289.                     Component elbowLeft = elements.Where(obj => obj.name == elbowLeftName).FirstOrDefault();
  290.                     Component elbowRight = elements.Where(obj => obj.name == elbowRightName).FirstOrDefault();
  291.  
  292.                     elbowLeft.transform.parent = parentElbow.transform;
  293.                     elbowRight.transform.parent = parentElbow.transform;
  294.  
  295.                     parentElbow.gameObject.AddComponent<SkinnedMeshRenderer>();
  296.                     parentElbow.transform.parent = elbows.transform;
  297.                     parentElbow.gameObject.SetActive(false);
  298.                 }
  299.             }
  300.                        
  301.             // LOWER ARMS
  302.             Debug.Log("Working on lower arms armors...");
  303.             for (int i = 0; i < elements.Length; i++)
  304.             {
  305.                 if (elements[i].transform.name.Contains("Chr_ArmLowerRight_" + gender))
  306.                 {
  307.                     string partIndex = StringTail(elements[i].transform.name, 2);
  308.                     GameObject parentLowerArms = new GameObject();
  309.                     parentLowerArms.name = "LowerArm_" + partIndex;
  310.  
  311.                     // Creating the Arms strings
  312.                     string lowerArmLeftName = "Chr_ArmLowerLeft_" + gender + "_" + partIndex;
  313.                     string lowerArmRightName = "Chr_ArmLowerRight_" + gender + "_" + partIndex;
  314.  
  315.                     // We are using Component 'cause to find the real objects and not the parent, we used the SkinnedMeshRenderer as reference
  316.                     Component lowerArmLeft = elements.Where(obj => obj.name == lowerArmLeftName).FirstOrDefault();
  317.                     Component lowerArmRight = elements.Where(obj => obj.name == lowerArmRightName).FirstOrDefault();
  318.  
  319.                     lowerArmLeft.transform.parent = parentLowerArms.transform;
  320.                     lowerArmRight.transform.parent = parentLowerArms.transform;
  321.                    
  322.                     parentLowerArms.gameObject.AddComponent<SkinnedMeshRenderer>();
  323.  
  324.                     // We check if it's the first, for naked, or index is higher and so it's an armor
  325.                     if (elements[i].transform.name == "Chr_ArmLowerRight_" + gender + "_00")
  326.                     {
  327.                         parentLowerArms.transform.parent = body.transform;
  328.                         parentLowerArms.name = "LowerArms";
  329.                     }
  330.                     else
  331.                     {
  332.                         parentLowerArms.transform.parent = lowerArms.transform;
  333.                         parentLowerArms.gameObject.SetActive(false);
  334.                     }
  335.                 }
  336.             }
  337.  
  338.             // GAUNTLETS
  339.             Debug.Log("Working on hands...");
  340.             for (int i = 0; i < elements.Length; i++)
  341.             {
  342.  
  343.                 if (elements[i].transform.name.Contains("Chr_HandRight_" + gender))
  344.                 {
  345.                     string partIndex = StringTail(elements[i].transform.name, 2);
  346.                     GameObject parentHands = new GameObject();
  347.                     parentHands.name = "Hands_" + partIndex;
  348.  
  349.                     // Creating the Arms strings
  350.                     string handLeftName = "Chr_HandLeft_" + gender + "_" + partIndex;
  351.                     string handRightName = "Chr_HandRight_" + gender + "_" + partIndex;
  352.  
  353.                     // We are using Component 'cause to find the real objects and not the parent, we used the SkinnedMeshRenderer as reference
  354.                     Component handLeft = elements.Where(obj => obj.name == handLeftName).FirstOrDefault();
  355.                     Component handRight = elements.Where(obj => obj.name == handRightName).FirstOrDefault();
  356.  
  357.                     handLeft.transform.parent = parentHands.transform;
  358.                     handRight.transform.parent = parentHands.transform;
  359.  
  360.                     parentHands.gameObject.AddComponent<SkinnedMeshRenderer>();
  361.  
  362.                     // Let's check if it's naked or a piece of armor
  363.                     if (elements[i].transform.name == "Chr_HandRight_" + gender + "_00")
  364.                     {
  365.                         parentHands.transform.parent = body.transform;
  366.                         parentHands.name = "Hands";
  367.                     }
  368.                     else
  369.                     {
  370.                         parentHands.transform.parent = hands.transform;
  371.                         parentHands.gameObject.SetActive(false);
  372.                     }
  373.                 }
  374.             }
  375.  
  376.             // HIPS-PANTS
  377.             Debug.Log("Working on pants...");
  378.             for (int i = 0; i < elements.Length; i++)
  379.             {
  380.                 if(elements[i].transform.name.Contains("Chr_Hips_" + gender))
  381.                 {
  382.                     if (elements[i].transform.name.Contains("Chr_Hips_" + gender + "_00"))
  383.                     {
  384.                         elements[i].transform.parent = body.transform;
  385.                         elements[i].gameObject.name = "Hips";
  386.                     }
  387.                     else
  388.                     {
  389.                         elements[i].transform.parent = pants.transform;
  390.                         elements[i].gameObject.SetActive(false);
  391.                     }
  392.  
  393.                 }
  394.             }
  395.  
  396.             // HIPS-PANTS ATTACHMENT
  397.             Debug.Log("Working on hips attachment...");
  398.             for (int i = 0; i < elements.Length; i++)
  399.             {
  400.                 if(elements[i].name.Contains("Chr_HipsAttachment_"))
  401.                 {
  402.                     int partIndex = int.Parse(StringTail(elements[i].transform.name, 2));
  403.                     if(partIndex < 7)
  404.                     {
  405.                         elements[i].transform.name = "Hips_Right_" + StringTail(elements[i].transform.name, 2);
  406.                         elements[i].transform.parent = hipsAttachmentRight.transform;
  407.                     }
  408.                     else
  409.                     {
  410.                         elements[i].transform.name = "Hips_Left_" + StringTail(elements[i].transform.name, 2);
  411.                         elements[i].transform.parent = hipsAttachmentLeft.transform;
  412.                     }
  413.  
  414.                     elements[i].gameObject.SetActive(false);
  415.                 }
  416.             }
  417.  
  418.             // KNEES
  419.             Debug.Log("Working on knees armors...");
  420.             for (int i = 0; i < elements.Length; i++)
  421.             {
  422.                 if (elements[i].transform.name.Contains("Chr_KneeAttachRight_"))
  423.                 {
  424.                     string partIndex = StringTail(elements[i].transform.name, 2);
  425.                     GameObject parenKnees = new GameObject();
  426.                     parenKnees.name = "Knees_" + partIndex;
  427.  
  428.                     // Creating the shoulder(s) strings
  429.                     string kneesLeftName = "Chr_KneeAttachLeft_" + partIndex;
  430.                     string kneesRightName = "Chr_KneeAttachRight_" + partIndex;
  431.  
  432.                     // We are using Component 'cause to find the real objects and not the parent, we used the SkinnedMeshRenderer as reference
  433.                     Component kneesLeft = elements.Where(obj => obj.name == kneesLeftName).FirstOrDefault();
  434.                     Component kneesRight = elements.Where(obj => obj.name == kneesRightName).FirstOrDefault();
  435.  
  436.                     kneesLeft.transform.parent = parenKnees.transform;
  437.                     kneesRight.transform.parent = parenKnees.transform;
  438.  
  439.                     parenKnees.gameObject.AddComponent<SkinnedMeshRenderer>();
  440.                     parenKnees.transform.parent = knees.transform;
  441.                     parenKnees.gameObject.SetActive(false);
  442.                 }
  443.             }
  444.  
  445.             // BOOTS (booth of lower legs, so the same system used in chest)
  446.             Debug.Log("Working on boots...");
  447.             for (int i = 0; i < elements.Length; i++)
  448.             {
  449.  
  450.                 if (elements[i].transform.name.Contains("Chr_LegRight_" + gender))
  451.                 {
  452.                     string partIndex = StringTail(elements[i].transform.name, 2);
  453.                     GameObject parentBoots = new GameObject();
  454.                     parentBoots.name = "Boots_" + partIndex;
  455.                     parentBoots.gameObject.AddComponent<SkinnedMeshRenderer>();
  456.  
  457.                     // Creating the Arms strings
  458.                     string legLeftName = "Chr_LegLeft_" + gender + "_" + partIndex;
  459.                     string legRightName = "Chr_LegRight_" + gender + "_" + partIndex;
  460.  
  461.                     // We are using Component 'cause to find the real objects and not the parent, we used the SkinnedMeshRenderer as reference
  462.                     Component legLeft = elements.Where(obj => obj.name == legLeftName).FirstOrDefault();
  463.                     Component legRight = elements.Where(obj => obj.name == legRightName).FirstOrDefault();
  464.  
  465.                     legLeft.transform.parent = parentBoots.transform;
  466.                     legRight.transform.parent = parentBoots.transform;
  467.  
  468.                     // There is (was? maybe Synty one day will fix it) and issue with Male Legs
  469.                     // which are inverted, indeed Male_11_Leg_Right have LegLeft inside!
  470.                     // That's why I need another check :-\
  471.                     if (elements[i].transform.name == "Chr_LegRight_" + gender + "_00")
  472.                     {
  473.                         parentBoots.transform.parent = body.transform;
  474.                         parentBoots.name = "Foots";
  475.                     }
  476.                     else
  477.                     {
  478.                         parentBoots.transform.parent = boots.transform;
  479.                         parentBoots.gameObject.SetActive(false);
  480.                     }
  481.                 }
  482.             }
  483.  
  484.             // Removing Uneeded parts
  485.             if (removeOppositeGender)
  486.             { DestroyImmediate(parent.gameObject); }
  487.             else
  488.             {
  489.                 GameObject allGendersParts = parent.transform.Find("All_Gender_Parts").gameObject;
  490.                 GameObject gendersParts = parent.transform.Find(gender + "_Parts").gameObject;
  491.  
  492.                 DestroyImmediate(allGendersParts);
  493.                 DestroyImmediate(gendersParts);
  494.             }
  495.         }
  496.  
  497.         /// <summary>
  498.         /// Generate all parents needed to store all body parts.
  499.         /// </summary>
  500.         private void CreateParents()
  501.         {
  502.             ///<TODO> MAKE PARAMETERS FOR LESS HARDCODE</TODO>
  503.  
  504.             body = new GameObject();
  505.             body.name = "Body";
  506.             body.transform.parent = transform.root;
  507.  
  508.             hair = new GameObject();
  509.             hair.name = "Hairs";
  510.             hair.transform.parent = body.transform;
  511.  
  512.             head = new GameObject();
  513.             head.name = "Heads";
  514.             head.transform.parent = body.transform;
  515.  
  516.             beard = new GameObject();
  517.             beard.name = "Beards";
  518.             beard.transform.parent = body.transform;
  519.  
  520.             ear = new GameObject();
  521.             ear.name = "Ears";
  522.             ear.transform.parent = body.transform;
  523.  
  524.             armor = new GameObject();
  525.             armor.name = "Armor";
  526.             armor.transform.parent = transform.root;
  527.  
  528.             headgear = new GameObject();
  529.             headgear.name = "Headgears";
  530.             headgear.transform.parent = armor.transform;
  531.            
  532.             headgearNoHair = new GameObject();
  533.             headgearNoHair.name = "Headgears_NoHair";
  534.             headgearNoHair.transform.parent = armor.transform;
  535.  
  536.             headgearNoBeard = new GameObject();
  537.             headgearNoBeard.name = "Headgears_NoBeard";
  538.             headgearNoBeard.transform.parent = armor.transform;
  539.  
  540.             headgearNoHead = new GameObject();
  541.             headgearNoHead.name = "Headgears_NoHead";
  542.             headgearNoHead.transform.parent = armor.transform;
  543.            
  544.             headgearDeco = new GameObject();
  545.             headgearDeco.name = "Decorations";
  546.             headgearDeco.transform.parent = headgearNoHead.transform;
  547.  
  548.             chest = new GameObject();
  549.             chest.name = "Chests";
  550.             chest.transform.parent = armor.transform;
  551.  
  552.             back = new GameObject();
  553.             back.name = "Backs";
  554.             back.transform.parent = armor.transform;
  555.  
  556.             shoulders = new GameObject();
  557.             shoulders.name = "Shoulders";
  558.             shoulders.transform.parent = armor.transform;
  559.  
  560.             elbows = new GameObject();
  561.             elbows.name = "Elbows";
  562.             elbows.transform.parent = armor.transform;
  563.  
  564.             //Uper Arms (booth) are linked directly to chest so we don't need of this
  565.             lowerArms = new GameObject();
  566.             lowerArms.name = "Arms";
  567.             lowerArms.transform.parent = armor.transform;
  568.  
  569.             hands = new GameObject();
  570.             hands.name = "Gloves";
  571.             hands.transform.parent = armor.transform;
  572.  
  573.             pants = new GameObject();
  574.             pants.name = "Pants";
  575.             pants.transform.parent = armor.transform;
  576.  
  577.             hipsAttachmentRight = new GameObject();
  578.             hipsAttachmentRight.name = "Hips Right Attachment";
  579.             hipsAttachmentRight.transform.parent = armor.transform;
  580.  
  581.             hipsAttachmentLeft = new GameObject();
  582.             hipsAttachmentLeft.name = "Hips Left Attachment";
  583.             hipsAttachmentLeft.transform.parent = armor.transform;
  584.  
  585.             knees = new GameObject();
  586.             knees.name = "Knees";
  587.             knees.transform.parent = armor.transform;
  588.  
  589.             boots = new GameObject();
  590.             boots.name = "Boots";
  591.             boots.transform.parent = armor.transform;
  592.  
  593.         }
  594.  
  595.         /// <summary>
  596.         /// Search for opposite gender gameObject and will disable or destroy it.
  597.         /// </summary>
  598.         private void DisableOppositeGenderGameObjects()
  599.         {
  600.             string otherGender = ((int)gender) == 1 ? "Male" : "Female";
  601.  
  602.             // Search for the Opposite parent which is defined as Female_Parts or Male_Parts
  603.             Transform genderParent = parent.Find(otherGender + "_Parts");
  604.             if (genderParent == null) return;
  605.  
  606.             if (removeOppositeGender)
  607.             {
  608.                 DestroyImmediate(genderParent.gameObject);
  609.                 return;
  610.             }
  611.  
  612.             // First Search for the Opposite Gender and disable all GameObjects
  613.             foreach (Transform child in genderParent)
  614.             {
  615.                 foreach (Transform grandChild in child)
  616.                 {
  617.                     if (grandChild.childCount > 0)
  618.                     {
  619.                         for (int i = 0; i < grandChild.childCount; i++)
  620.                             grandChild.GetChild(i).gameObject.SetActive(false);
  621.                     }
  622.                     else
  623.                     {
  624.                         grandChild.gameObject.SetActive(false);
  625.                     }
  626.                 }
  627.             }
  628.         }
  629.  
  630.         /// <summary>
  631.         /// Search recursively inside the given hierarchy and return the first child in the bottomest parent.
  632.         /// So it is supposed that you will use SearchForLastParent(Pippo).parent to know who the parent is.
  633.         /// </summary>
  634.         private Transform SearchForLastParent(Transform parent)
  635.         {
  636.             Transform result = null;
  637.  
  638.             foreach (Transform child in parent)
  639.             {
  640.                 if (child.childCount == 0)
  641.                     result = child.transform;
  642.                 else
  643.                     result = SearchForLastParent(child);
  644.  
  645.                 if (result != null) break;
  646.             }
  647.  
  648.             return result;
  649.         }
  650.  
  651.         /// <summary>
  652.         /// Return the tail of a string based on how many characters do you want
  653.         /// </summary>
  654.         public static string StringTail(string source, int tail_length)
  655.         {
  656.             if (tail_length >= source.Length)
  657.                 return source;
  658.             return source.Substring(source.Length - tail_length);
  659.         }
  660.     }
  661. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement