Vector3 DrawUnitConfigurator(float startX, float startY, List <UnitCreep> creepList, bool offense = false) { UnitCreep creep = creepList[selectID]; float maxWidth = 0; //float cachedY=startY; float cachedX = startX; startX += 65; //startY+=20; int type = (int)creep.type; cont = new GUIContent("Creep Type:", "Type of the creep. Different type of creep has different capabilities"); EditorGUI.LabelField(new Rect(startX, startY, width, height), cont); contL = new GUIContent[creepTypeLabel.Length]; for (int i = 0; i < contL.Length; i++) { contL[i] = new GUIContent(creepTypeLabel[i], creepTypeTooltip[i]); } type = EditorGUI.Popup(new Rect(startX + 80, startY, width - 40, 15), new GUIContent(""), type, contL); creep.type = (_CreepType)type; startX = cachedX; v3 = DrawIconAndName(creep, startX, startY); startY = v3.y; maxWidth = v3.z; cont = new GUIContent("Move When Casting:", "Take value from 0-1. 0 being 0% and 1 being 100%. Final value are subject to target's hitChance. Assume two attackers with 1 hitChance and .8 hitChance and the dodgeChance set to .2, the chances to dodge attack from each attacker are 20% and 40% respectively."); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.movableWhenCasting = EditorGUI.Toggle(new Rect(startX + spaceX, startY, 50, height), creep.movableWhenCasting); cont = new GUIContent("Dodge Chance:", "Take value from 0-1. 0 being 0% and 1 being 100%. Final value are subject to target's hitChance. Assume two attackers with 1 hitChance and .8 hitChance and the dodgeChance set to .2, the chances to dodge attack from each attacker are 20% and 40% respectively."); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.stats[0].dodge = EditorGUI.FloatField(new Rect(startX + spaceX, startY, 50, height), creep.stats[0].dodge); v3 = DrawUnitDefensiveSetting(creep, startX, startY, objHList, objHLabelList); startY = v3.y; if (maxWidth < v3.z) { maxWidth = v3.z; } startY += 20; cont = new GUIContent("Flying:", "Check to mark the creep as flying unit."); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.flying = EditorGUI.Toggle(new Rect(startX + spaceX, startY, 40, height), creep.flying); cont = new GUIContent("Move Speed:", "Moving speed of the creep"); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.moveSpeed = EditorGUI.FloatField(new Rect(startX + spaceX, startY, 40, height), creep.moveSpeed); cont = new GUIContent("Life Cost:", "The amont of life taken from player when this creep reach it's destination"); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.lifeCost = EditorGUI.IntField(new Rect(startX + spaceX, startY, 40, height), creep.lifeCost); //cont=new GUIContent("Score Value:", "Score gained when destroy this creep"); //EditorGUI.LabelField(new Rect(startX, startY+=spaceY, width, height), cont); //creep.scoreValue=EditorGUI.IntField(new Rect(startX+spaceX, startY, 40, height), creep.scoreValue); cont = new GUIContent("Life Gain:", "Life awarded to the player when player successfully destroy this creep"); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.lifeValue = EditorGUI.IntField(new Rect(startX + spaceX, startY, 40, height), creep.lifeValue); cont = new GUIContent("Energy Gain:", "Energy awarded to the player when player successfully destroy this creep"); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.valueEnergyGain = EditorGUI.IntField(new Rect(startX + spaceX, startY, 40, height), creep.valueEnergyGain); cont = new GUIContent("Resource Gain Upon Destroyed:", "The amont of life taken from player when this creep reach it's destination"); //EditorGUI.LabelField(new Rect(startX, startY+=spaceY, width, height), cont); rscGainFoldout = EditorGUI.Foldout(new Rect(startX, startY += spaceY, width, height), rscGainFoldout, cont); if (rscGainFoldout) { List <Rsc> rscList = EditorDBManager.GetRscList(); for (int i = 0; i < rscList.Count; i++) { EditorUtilities.DrawSprite(new Rect(startX + 25, startY += spaceY - 2, 20, 20), rscList[i].icon); startY += 2; EditorGUI.LabelField(new Rect(startX, startY, width, height), " - min/max");//+rscList[i].name); creep.valueRscMin[i] = EditorGUI.IntField(new Rect(startX + spaceX, startY, 40, height), creep.valueRscMin[i]); creep.valueRscMax[i] = EditorGUI.IntField(new Rect(startX + spaceX + 40, startY, 40, height), creep.valueRscMax[i]); } startY += 5; } string[] creepNameList = EditorDBManager.GetCreepNameList(); cont = new GUIContent("SpawnUponDestroyed:", "Creep prefab to be spawn when an instance of this unit is destroyed. Note that the HP of the spawned unit is inherit from the destroyed unit. Use HP-multiplier to specifiy how much of the HP should be carried forward"); GUI.Label(new Rect(startX, startY += spaceY, width, height), cont); int ID = -1; for (int i = 0; i < creepList.Count; i++) { if (creepList[i].gameObject == creep.spawnUponDestroyed) { ID = i + 1; } } ID = EditorGUI.Popup(new Rect(startX + spaceX + 30, startY, 120, height), ID, creepNameList); if (ID > 0 && creepList[ID - 1] != creep) { creep.spawnUponDestroyed = creepList[ID - 1].gameObject; } else if (ID == 0) { creep.spawnUponDestroyed = null; } if (creep.spawnUponDestroyed != null) { cont = new GUIContent(" - Num to Spawn:", "The amount of creep to spawn when this unit is destroyed"); EditorGUI.LabelField(new Rect(startX + 20, startY += spaceY, width, height), cont); creep.spawnUponDestroyedCount = EditorGUI.IntField(new Rect(startX + spaceX + 30, startY, 40, height), creep.spawnUponDestroyedCount); cont = new GUIContent(" - HP Multiplier:", "The percentage of HP to pass to the next unit. 0.5 being 50% of parent unit's fullHP, 1 being 100% of parent unit's fullHP"); EditorGUI.LabelField(new Rect(startX + 20, startY += spaceY, width, height), cont); creep.spawnUnitHPMultiplier = EditorGUI.FloatField(new Rect(startX + spaceX + 30, startY, 40, height), creep.spawnUnitHPMultiplier); } startY += 20; if (creep.type == _CreepType.Offense) { cont = new GUIContent("Stop To Attack:", "Check to have the creep stop moving when there's target to attack"); EditorGUI.LabelField(new Rect(startX, startY += spaceY, width, height), cont); creep.stopToAttack = EditorGUI.Toggle(new Rect(startX + spaceX, startY, 40, height), creep.stopToAttack); startY += spaceY; } v3 = DrawUnitOffensiveSetting(creep, startX, startY, objHList, objHLabelList); startY = v3.y + 20; if (maxWidth < v3.z) { maxWidth = v3.z; } if (creep.type == _CreepType.Offense) { startY += 30; } BaseAnimationController ani = creep.gameObject.GetComponent <BaseAnimationController>(); if (ani == null) { if (GUI.Button(new Rect(startX, startY, width + 50, height + 2), "Add animation component")) { ani = creep.gameObject.AddComponent <BaseAnimationController>(); } } else { if (GUI.Button(new Rect(startX, startY, width + 50, height + 2), "Remove animation component")) { DestroyImmediate(ani, true); return(new Vector3(startX, startY, maxWidth)); } } return(new Vector3(startX, startY, maxWidth)); }