public static PredatorCombatData EditCombat(string label, Predator3rdPersonalUnit Unit, PredatorCombatData Combat) { EditorGUILayout.LabelField(label); Combat.Name = EditorGUILayout.TextField("Combat name:", Combat.Name); Combat.userInput = (UserInputType)EditorGUILayout.EnumPopup(new GUIContent("Gesture:", "The matched gesture trigger this combat?"), Combat.userInput); string[] AllAttackDataName = Unit.PredatorAttackData.Select(x => x.Name).ToArray(); Combat.useAttackDataName = EditorCommon.EditStringArray("Use these attack data:", Combat.useAttackDataName, AllAttackDataName); EditorGUILayout.BeginHorizontal(); Combat.WaitUntilAnimationReturn = EditorGUILayout.Toggle("Wait animation return:", Combat.WaitUntilAnimationReturn); Combat.BlockPlayerInput = EditorGUILayout.Toggle("Block player input", Combat.BlockPlayerInput); EditorGUILayout.EndHorizontal(); Combat.OverrideAttackData = EditorGUILayout.BeginToggleGroup(new GUIContent("Override attackData setting", "If true, some of the attack data property would be overrided"), Combat.OverrideAttackData); Combat.DamagePointBase = EditorGUILayout.FloatField("DamagePoint base:", Combat.DamagePointBase); EditorGUILayout.BeginHorizontal(); Combat.MinDamagePointBonus = EditorGUILayout.FloatField("Min damage bonus:", Combat.MinDamagePointBonus); Combat.MaxDamagePointBonus = EditorGUILayout.FloatField("Max damage bonus:", Combat.MaxDamagePointBonus); EditorGUILayout.EndHorizontal(); Combat.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack", Combat.CanDoCriticalAttack); if (Combat.CanDoCriticalAttack) { EditorGUILayout.BeginHorizontal(); Combat.CriticalAttackChance = EditorGUILayout.Slider("Critical chance:", Combat.CriticalAttackChance, 0, 1); Combat.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical bonus rate", Combat.CriticalAttackBonusRate); EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndToggleGroup(); return(Combat); }
public static PredatorCombatData EditCombat(string label, Predator3rdPersonalUnit Unit, PredatorCombatData Combat) { EditorGUILayout.LabelField (label); Combat.Name = EditorGUILayout.TextField ("Combat name:", Combat.Name); Combat.userInput = (UserInputType)EditorGUILayout.EnumPopup (new GUIContent ("Gesture:", "The matched gesture trigger this combat?"), Combat.userInput); string[] AllAttackDataName = Unit.PredatorAttackData.Select(x=>x.Name).ToArray(); Combat.useAttackDataName = EditorCommon.EditStringArray("Use these attack data:",Combat.useAttackDataName,AllAttackDataName); EditorGUILayout.BeginHorizontal (); Combat.WaitUntilAnimationReturn = EditorGUILayout.Toggle ("Wait animation return:", Combat.WaitUntilAnimationReturn); Combat.BlockPlayerInput = EditorGUILayout.Toggle ("Block player input", Combat.BlockPlayerInput); EditorGUILayout.EndHorizontal (); Combat.OverrideAttackData = EditorGUILayout.BeginToggleGroup(new GUIContent("Override attackData setting", "If true, some of the attack data property would be overrided"), Combat.OverrideAttackData); Combat.DamagePointBase = EditorGUILayout.FloatField("DamagePoint base:",Combat.DamagePointBase); EditorGUILayout.BeginHorizontal(); Combat.MinDamagePointBonus = EditorGUILayout.FloatField("Min damage bonus:",Combat.MinDamagePointBonus); Combat.MaxDamagePointBonus = EditorGUILayout.FloatField("Max damage bonus:",Combat.MaxDamagePointBonus); EditorGUILayout.EndHorizontal(); Combat.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack", Combat.CanDoCriticalAttack); if(Combat.CanDoCriticalAttack) { EditorGUILayout.BeginHorizontal(); Combat.CriticalAttackChance = EditorGUILayout.Slider("Critical chance:", Combat.CriticalAttackChance, 0, 1); Combat.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical bonus rate", Combat.CriticalAttackBonusRate); EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndToggleGroup(); return Combat; }
/// <summary> /// Process a PredatorCombatData and perform attack behavior. /// </summary> /// <param name="combat"></param> /// <returns></returns> IEnumerator DoCombat(PredatorCombatData combat) { string useAttackDataName = Util.RandomFromArray <string>(combat.useAttackDataName); PredatorPlayerAttackData attackData = this.PredatorPlayerUnit.PredatorAttackDataDict[useAttackDataName]; if (combat.OverrideAttackData) { attackData = attackData.GetClone() as PredatorPlayerAttackData; attackData.DamagePointBase = combat.DamagePointBase; attackData.MinDamageBonus = combat.MinDamagePointBonus; attackData.MaxDamageBonus = combat.MaxDamagePointBonus; attackData.CanDoCriticalAttack = combat.CanDoCriticalAttack; attackData.CriticalAttackBonusRate = combat.CriticalAttackBonusRate; attackData.CriticalAttackChance = combat.CriticalAttackChance; } currentProcessCombat = combat; //If combat.BlockUserInput = TRUE, user gesture input will be dropped during combat processing if (combat.BlockPlayerInput == true) { ReleaseUserInputBlockTime = Time.time + animation[attackData.AnimationName].length * 0.5f; BlockUserGestureInput = true; } //Look for enemy - in near radius float DistanceToEnemy = 0; CurrentTarget = FindTarget(transform.forward, RushRadius, out DistanceToEnemy); // Debug.Log(string.Format("Find the target:{0}, enemy distance:{1}, AttackableRange:{2}", CurrentTarget,DistanceToEnemy,attackData.AttackableRange) ); if (CurrentTarget != null) { Util.RotateToward(transform, CurrentTarget.transform.position, false, 0); //if target farer than attack attackableRange, rush to the target. if (DistanceToEnemy > attackData.AttackableRange) { yield return(StartCoroutine(RushTo(CurrentTarget.transform, 0.3f))); } //if attackData.hitTriggerType = ByTime, means the message should be sent N seconds after animation. //else if attackData.hitTriggerType = ByEvent, the message should be triggered by animation event. if (attackData.hitTriggerType == HitTriggerType.ByTime) { StartCoroutine(SendHitMessage(attackData, CurrentTarget)); } } animation.CrossFade(attackData.AnimationName); if (combat.FinalCombat) { Invoke("ClearUnprocessCombatList", animation[attackData.AnimationName].length * 0.5f); } if (combat.WaitUntilAnimationReturn) { yield return(new WaitForSeconds(animation[attackData.AnimationName].length)); } else { yield return(new WaitForSeconds(CombatCooldown)); } }
void Awake() { controller = this.GetComponent <CharacterController> (); predatorStatus = GetComponent <PredatorPlayerStatus> (); PredatorPlayerUnit = GetComponent <Predator3rdPersonalUnit> (); EnemyLayer = PredatorPlayerUnit.EnemyLayer; RushRadius = PredatorPlayerUnit.RushRadius; CombatCooldown = PredatorPlayerUnit.CombatCoolDown; DefaultCombat_LeftClaw = PredatorPlayerUnit.DefaultCombat_LeftClaw; DefaultCombat_RightClaw = PredatorPlayerUnit.DefaultCombat_RightClaw; DefaultCombat_DualClaw = PredatorPlayerUnit.DefaultCombat_DualClaw; ComboCombats = PredatorPlayerUnit.ComboCombat; foreach (PredatorComboCombat comboCombat in ComboCombats) { comboCombat.Init(); ComboCombatTokenDict [comboCombat.token] = comboCombat; } }
/// <summary> /// Call by GestureHandler. /// 1. New HUD Hint /// 2. Search combo combat by playerComboToken /// 3. Determine the playerCombo can go ahead , or terminated(unmatched) /// Put a new user gesture into queue - UnprocessGestureList /// </summary> /// <param name="gestureInfo"></param> public void NewUserGesture(UserInputData gestureInfo) { if (!BlockUserGestureInput) { //Accumulate player combo token string playerComboToken += ((int)gestureInfo.Type).ToString(); UserInputType[] nextCombat = PredictNextMatchedCombo(playerComboToken); SendMessage("ShowButtonHints", nextCombat); // Debug.Log("Current playerComboToken:" + playerComboToken); //Check if player combo token has a matched prefab bool playerTokenMatched = false, isLastCombat = false; PredatorCombatData combat = GetComboCombatByToken(playerComboToken, gestureInfo.Type, out playerTokenMatched, out isLastCombat); if (combat == null) { return; } //If player combo token not matched, set BlockUserGestureInput = true to block all player input, //until the combat processing finish, then BlockUserGestureInput will be set true again. //reset playerComboToken if (playerTokenMatched == false) { combat.FinalCombat = true; BlockUserGestureInput = true; playerComboToken = ""; } else if (isLastCombat && playerTokenMatched) { combat.FinalCombat = true; playerComboToken = ""; } //record the last receiving player gesture input time LastProcessPlayerGestureInputTime = Time.time; // UnprocessGestureList.Add(gestureInfo); UnprocessCombatList.Add(combat); } else { Debug.Log("Input was dropped at frame:" + Time.frameCount); } }
/// <summary> /// Daemon routine, check if UnprocessCombatList contains element, then processing it. /// </summary> /// <returns></returns> IEnumerator RepeatCheckCombatList() { while (true) { if (UnprocessCombatList.Count > 0) { PredatorCombatData combat = UnprocessCombatList [0]; UnprocessCombatList.Remove(combat); //New Hint in GUI (HUD) PredatorPlayerUnit.HUDObject.SendMessage("NewHint", combat.userInput); yield return(StartCoroutine(DoCombat(combat))); if (combat.FinalCombat) { BlockUserGestureInput = false; PredatorPlayerUnit.HUDObject.SendMessage("ClearHint"); SendMessage("DontHint"); } } yield return(null); } }
public static PredatorCombatData[] EditCombatDataArray(Predator3rdPersonalUnit Unit, PredatorCombatData[] CombatArray) { if (GUILayout.Button("Add Combat")) { PredatorCombatData Combat = new PredatorCombatData(); CombatArray = Util.AddToArray <PredatorCombatData> (Combat, CombatArray); } if (CombatArray != null) { for (int i = 0; i < CombatArray.Length; i++) { PredatorCombatData Combat = CombatArray [i]; Combat = EditCombat("--- Edit combat:" + Combat.Name, Unit, Combat); if (GUILayout.Button("Delete combat:" + Combat.Name)) { CombatArray = Util.CloneExcept <PredatorCombatData> (CombatArray, Combat); } EditorGUILayout.Space(); } } return(CombatArray); }
/// <summary> /// Process a PredatorCombatData and perform attack behavior. /// </summary> /// <param name="combat"></param> /// <returns></returns> IEnumerator DoCombat(PredatorCombatData combat) { string useAttackDataName = Util.RandomFromArray<string>(combat.useAttackDataName); PredatorPlayerAttackData attackData = this.PredatorPlayerUnit.PredatorAttackDataDict[useAttackDataName]; if(combat.OverrideAttackData) { attackData = attackData.GetClone() as PredatorPlayerAttackData; attackData.DamagePointBase = combat.DamagePointBase; attackData.MinDamageBonus = combat.MinDamagePointBonus; attackData.MaxDamageBonus = combat.MaxDamagePointBonus; attackData.CanDoCriticalAttack = combat.CanDoCriticalAttack; attackData.CriticalAttackBonusRate = combat.CriticalAttackBonusRate; attackData.CriticalAttackChance = combat.CriticalAttackChance; } currentProcessCombat = combat; //If combat.BlockUserInput = TRUE, user gesture input will be dropped during combat processing if (combat.BlockPlayerInput == true) { ReleaseUserInputBlockTime = Time.time + animation[attackData.AnimationName].length * 0.5f; BlockUserGestureInput = true; } //Look for enemy - in near radius float DistanceToEnemy = 0; CurrentTarget = FindTarget (transform.forward, RushRadius, out DistanceToEnemy); // Debug.Log(string.Format("Find the target:{0}, enemy distance:{1}, AttackableRange:{2}", CurrentTarget,DistanceToEnemy,attackData.AttackableRange) ); if (CurrentTarget != null) { Util.RotateToward (transform, CurrentTarget.transform.position, false, 0); //if target farer than attack attackableRange, rush to the target. if (DistanceToEnemy > attackData.AttackableRange) { yield return StartCoroutine(RushTo (CurrentTarget.transform,0.3f)); } //if attackData.hitTriggerType = ByTime, means the message should be sent N seconds after animation. //else if attackData.hitTriggerType = ByEvent, the message should be triggered by animation event. if(attackData.hitTriggerType == HitTriggerType.ByTime) { StartCoroutine (SendHitMessage (attackData, CurrentTarget)); } } animation.CrossFade (attackData.AnimationName); if(combat.FinalCombat) { Invoke("ClearUnprocessCombatList", animation[attackData.AnimationName].length * 0.5f); } if (combat.WaitUntilAnimationReturn) { yield return new WaitForSeconds(animation[attackData.AnimationName].length); } else yield return new WaitForSeconds(CombatCooldown); }
void Awake() { controller = this.GetComponent<CharacterController> (); predatorStatus = GetComponent<PredatorPlayerStatus> (); PredatorPlayerUnit = GetComponent<Predator3rdPersonalUnit> (); EnemyLayer = PredatorPlayerUnit.EnemyLayer; RushRadius = PredatorPlayerUnit.RushRadius; CombatCooldown = PredatorPlayerUnit.CombatCoolDown; DefaultCombat_LeftClaw = PredatorPlayerUnit.DefaultCombat_LeftClaw; DefaultCombat_RightClaw = PredatorPlayerUnit.DefaultCombat_RightClaw; DefaultCombat_DualClaw = PredatorPlayerUnit.DefaultCombat_DualClaw; ComboCombats = PredatorPlayerUnit.ComboCombat; foreach (PredatorComboCombat comboCombat in ComboCombats) { comboCombat.Init (); ComboCombatTokenDict [comboCombat.token] = comboCombat; } }
public static PredatorCombatData[] EditCombatDataArray(Predator3rdPersonalUnit Unit, PredatorCombatData[] CombatArray) { if (GUILayout.Button ("Add Combat")) { PredatorCombatData Combat = new PredatorCombatData (); CombatArray = Util.AddToArray<PredatorCombatData> (Combat, CombatArray); } if (CombatArray != null) { for (int i=0; i<CombatArray.Length; i++) { PredatorCombatData Combat = CombatArray [i]; Combat = EditCombat ("--- Edit combat:" + Combat.Name, Unit, Combat); if (GUILayout.Button ("Delete combat:" + Combat.Name)) { CombatArray = Util.CloneExcept<PredatorCombatData> (CombatArray, Combat); } EditorGUILayout.Space (); } } return CombatArray; }