public override AttackData GetClone() { PredatorPlayerAttackData clone = new PredatorPlayerAttackData(); base.CloneBasic(clone as UnitAnimationData); clone.Type = this.Type; clone.hitTriggerType = this.hitTriggerType; clone.DamageForm = this.DamageForm; clone.HitTestType = this.HitTestType; clone.HitRate = this.HitRate; clone.HitTestCollider = this.HitTestCollider; clone.HitTestDistance = this.HitTestDistance; clone.HitTestAngularDiscrepancy = this.HitTestAngularDiscrepancy; clone.AttackableRange = this.AttackableRange; clone.HitTime = this.HitTime; clone.Projectile = this.Projectile; clone.ProjectileInstantiateAnchor = this.ProjectileInstantiateAnchor; clone.DamagePointBase = this.DamagePointBase; clone.MinDamageBonus = this.MinDamageBonus; clone.MaxDamageBonus = this.MaxDamageBonus; clone.ScriptObjectAttachToTarget = this.ScriptObjectAttachToTarget; clone.CanDoCriticalAttack = this.CanDoCriticalAttack; clone.CriticalAttackBonusRate = this.CriticalAttackBonusRate; clone.CriticalAttackChance = this.CriticalAttackChance; return(clone); }
public static PredatorPlayerAttackData[] EditPredatorPlayerAttackDataArray(UnitBase unit, PredatorPlayerAttackData[] predatorPlayerAttackDataArray) { if (GUILayout.Button("Add PredatorPlayerAttackData:")) { PredatorPlayerAttackData _p = new PredatorPlayerAttackData(); predatorPlayerAttackDataArray = Util.AddToArray <PredatorPlayerAttackData>(_p, predatorPlayerAttackDataArray); } for (int i = 0; i < predatorPlayerAttackDataArray.Length; i++) { PredatorPlayerAttackData attackData = predatorPlayerAttackDataArray[i]; if (DynamicalToggle.Keys.Contains(attackData.Name) == false) { DynamicalToggle.Add(attackData.Name, true); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Edit attack data:" + attackData.Name); DynamicalToggle[attackData.Name] = EditorGUILayout.Toggle(DynamicalToggle[attackData.Name]); EditorGUILayout.EndHorizontal(); if (DynamicalToggle[attackData.Name] == false) { continue; } attackData = EditPredatorPlayerAttackData(unit, attackData); predatorPlayerAttackDataArray[i] = attackData; if (GUILayout.Button("Delete PredatorPlayerAttackData:" + attackData.Name)) { predatorPlayerAttackDataArray = Util.CloneExcept <PredatorPlayerAttackData>(predatorPlayerAttackDataArray, attackData); } } return(predatorPlayerAttackDataArray); }
public override IEnumerator DoNormalAttack() { PredatorPlayerAttackData attackData = predatorPlayerUnit.PredatorAttackDataDict[this.NormalAttackDataName]; StartCoroutine(attackController.SendHitMessage(attackData, CurrentSplitTarget)); yield return(null); }
/// <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 _Attack(string AttackDataName) { PredatorPlayerAttackData attackData = this.PredatorPlayerUnit.PredatorAttackDataDict[AttackDataName]; if (CurrentTarget != null && IsTargetDead(CurrentTarget) == false) { StartCoroutine(SendHitMessage(attackData, CurrentTarget)); } }
/// <summary> /// Sends the ApplyDamage message to enemy. /// </summary> public IEnumerator SendHitMessage(PredatorPlayerAttackData attackData, GameObject enemy) { if (enemy == null) { yield break; } //if attackData.hitTime > 0, wait for the hitTime. if (Mathf.Approximately(attackData.HitTime, 0) == false) { yield return(new WaitForSeconds(attackData.HitTime)); } //in case the enemy object is destoryed between the previous yield time. if (enemy == null) { yield break; } //if attack type = Instant, means there is only one target to be attacked. if (attackData.Type == AIAttackType.Instant) { if (CheckHitCondition(enemy, attackData)) { //send applyDamage to target. DamageParameter damageParam = GetDamageParameter(attackData); enemy.SendMessage("ApplyDamage", damageParam); //at each hit, plus the rage this.PredatorPlayerUnit.Rage = Mathf.Clamp(this.PredatorPlayerUnit.Rage + this.PredatorPlayerUnit.RageEarnPerHit, 0, this.PredatorPlayerUnit.MaxRage); //send GameEvent to HUD to display the damage text. GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC); _e.receiver = enemy; _e.ObjectParameter = damageParam; PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e); } } else if (attackData.Type == AIAttackType.Regional) { Collider[] colliders = Physics.OverlapSphere(transform.position, this.RushRadius, this.EnemyLayer); foreach (Collider collider in colliders) { if (attackData.HitTestCollider.bounds.Intersects(collider.bounds)) { //send applyDamage to every object intersect with the hitTestCollider. DamageParameter damageParam = GetDamageParameter(attackData); collider.gameObject.SendMessage("ApplyDamage", damageParam); // this.SendMessage("AddRage", damageParam); //send GameEvent to HUD to display the damage text. GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC); _e.receiver = collider.gameObject; _e.ObjectParameter = damageParam; PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e); } } } }
public DamageParameter GetDamageParameter(PredatorPlayerAttackData attackData) { DamageParameter dp = new DamageParameter(this.gameObject, attackData.DamageForm, 0); UnityEngine.Random.seed = DateTime.Now.Millisecond; //calculate damage point = base point + random(min, max) dp.damagePoint = attackData.DamagePointBase + UnityEngine.Random.Range(attackData.MinDamageBonus, attackData.MaxDamageBonus); //if critical attack is enabled and random chance matches, multiple the bonus rate. //Usually, designer can put the critical attack chance to the final combat of a combo-combat, this is like the great-final hit. if (attackData.CanDoCriticalAttack && UnityEngine.Random.Range(0f, 1f) <= attackData.CriticalAttackChance) { dp.damagePoint *= attackData.CriticalAttackBonusRate; dp.extraParameter.Add(DamageParameter.ExtraParameterKey.IsCriticalStrike, true); dp.extraParameter.Add(DamageParameter.ExtraParameterKey.CritcialStrikeRate, attackData.CriticalAttackBonusRate); } return(dp); }
/// <summary> /// Sends the ApplyDamage message to enemy. /// </summary> public IEnumerator SendHitMessage(PredatorPlayerAttackData attackData, GameObject enemy) { if (enemy == null) { yield break; } //if attackData.hitTime > 0, wait for the hitTime. if (Mathf.Approximately (attackData.HitTime, 0) == false) { yield return new WaitForSeconds(attackData.HitTime); } //in case the enemy object is destoryed between the previous yield time. if (enemy == null) { yield break; } //if attack type = Instant, means there is only one target to be attacked. if(attackData.Type == AIAttackType.Instant) { if(CheckHitCondition(enemy, attackData)) { //send applyDamage to target. DamageParameter damageParam = GetDamageParameter(attackData); enemy.SendMessage ("ApplyDamage", damageParam); //at each hit, plus the rage this.PredatorPlayerUnit.Rage = Mathf.Clamp(this.PredatorPlayerUnit.Rage + this.PredatorPlayerUnit.RageEarnPerHit, 0, this.PredatorPlayerUnit.MaxRage); //send GameEvent to HUD to display the damage text. GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC); _e.receiver = enemy; _e.ObjectParameter = damageParam; PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e); } } else if(attackData.Type == AIAttackType.Regional) { Collider[] colliders = Physics.OverlapSphere(transform.position, this.RushRadius, this.EnemyLayer); foreach(Collider collider in colliders) { if(attackData.HitTestCollider.bounds.Intersects(collider.bounds)) { //send applyDamage to every object intersect with the hitTestCollider. DamageParameter damageParam = GetDamageParameter(attackData); collider.gameObject.SendMessage ("ApplyDamage", damageParam); // this.SendMessage("AddRage", damageParam); //send GameEvent to HUD to display the damage text. GameEvent _e = new GameEvent(GameEventType.DisplayDamageParameterOnNPC); _e.receiver = collider.gameObject; _e.ObjectParameter = damageParam; PredatorPlayerUnit.HUDObject.SendMessage("OnGameEvent", _e); } } } }
public DamageParameter GetDamageParameter(PredatorPlayerAttackData attackData) { DamageParameter dp = new DamageParameter(this.gameObject, attackData.DamageForm, 0); UnityEngine.Random.seed = DateTime.Now.Millisecond; //calculate damage point = base point + random(min, max) dp.damagePoint = attackData.DamagePointBase + UnityEngine.Random.Range(attackData.MinDamageBonus, attackData.MaxDamageBonus); //if critical attack is enabled and random chance matches, multiple the bonus rate. //Usually, designer can put the critical attack chance to the final combat of a combo-combat, this is like the great-final hit. if(attackData.CanDoCriticalAttack && UnityEngine.Random.Range(0f,1f) <= attackData.CriticalAttackChance) { dp.damagePoint *= attackData.CriticalAttackBonusRate; dp.extraParameter.Add(DamageParameter.ExtraParameterKey.IsCriticalStrike, true); dp.extraParameter.Add(DamageParameter.ExtraParameterKey.CritcialStrikeRate, attackData.CriticalAttackBonusRate); } return dp; }
public static PredatorPlayerAttackData[] EditPredatorPlayerAttackDataArray(UnitBase unit, PredatorPlayerAttackData[] predatorPlayerAttackDataArray) { if(GUILayout.Button("Add PredatorPlayerAttackData:")) { PredatorPlayerAttackData _p = new PredatorPlayerAttackData(); predatorPlayerAttackDataArray = Util.AddToArray<PredatorPlayerAttackData>(_p, predatorPlayerAttackDataArray); } for(int i=0; i<predatorPlayerAttackDataArray.Length; i++) { PredatorPlayerAttackData attackData = predatorPlayerAttackDataArray[i]; if(DynamicalToggle.Keys.Contains(attackData.Name) == false) { DynamicalToggle.Add(attackData.Name, true); } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Edit attack data:" + attackData.Name); DynamicalToggle[attackData.Name] = EditorGUILayout.Toggle(DynamicalToggle[attackData.Name]); EditorGUILayout.EndHorizontal(); if(DynamicalToggle[attackData.Name] == false) { continue; } attackData = EditPredatorPlayerAttackData(unit,attackData); predatorPlayerAttackDataArray[i] = attackData; if(GUILayout.Button("Delete PredatorPlayerAttackData:"+attackData.Name)) { predatorPlayerAttackDataArray = Util.CloneExcept<PredatorPlayerAttackData>(predatorPlayerAttackDataArray, attackData); } } return predatorPlayerAttackDataArray; }
public static PredatorPlayerAttackData EditPredatorPlayerAttackData(UnitBase unit, PredatorPlayerAttackData predatorPlayerAttackData) { EditorCommon.EditAttackData(unit, predatorPlayerAttackData); predatorPlayerAttackData.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack ?" , predatorPlayerAttackData.CanDoCriticalAttack); if(predatorPlayerAttackData.CanDoCriticalAttack) { predatorPlayerAttackData.CriticalAttackChance = EditorGUILayout.Slider("Critical attack chance:", 0,1,predatorPlayerAttackData.CriticalAttackChance); predatorPlayerAttackData.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical attack bonus rate:", predatorPlayerAttackData.CriticalAttackBonusRate); } return predatorPlayerAttackData; }
public override AttackData GetClone() { PredatorPlayerAttackData clone = new PredatorPlayerAttackData(); base.CloneBasic(clone as UnitAnimationData); clone.Type = this.Type; clone.hitTriggerType = this.hitTriggerType; clone.DamageForm = this.DamageForm; clone.HitTestType = this.HitTestType; clone.HitRate = this.HitRate; clone.HitTestCollider = this.HitTestCollider; clone.HitTestDistance = this.HitTestDistance; clone.HitTestAngularDiscrepancy = this.HitTestAngularDiscrepancy; clone.AttackableRange = this.AttackableRange; clone.HitTime = this.HitTime; clone.Projectile = this.Projectile; clone.ProjectileInstantiateAnchor = this.ProjectileInstantiateAnchor; clone.DamagePointBase = this.DamagePointBase; clone.MinDamageBonus = this.MinDamageBonus; clone.MaxDamageBonus = this.MaxDamageBonus; clone.ScriptObjectAttachToTarget = this.ScriptObjectAttachToTarget; clone.CanDoCriticalAttack = this.CanDoCriticalAttack; clone.CriticalAttackBonusRate = this.CriticalAttackBonusRate; clone.CriticalAttackChance = this.CriticalAttackChance; return clone; }
public static PredatorPlayerAttackData EditPredatorPlayerAttackData(UnitBase unit, PredatorPlayerAttackData predatorPlayerAttackData) { EditorCommon.EditAttackData(unit, predatorPlayerAttackData); predatorPlayerAttackData.CanDoCriticalAttack = EditorGUILayout.Toggle("Can do critical attack ?", predatorPlayerAttackData.CanDoCriticalAttack); if (predatorPlayerAttackData.CanDoCriticalAttack) { predatorPlayerAttackData.CriticalAttackChance = EditorGUILayout.Slider("Critical attack chance:", 0, 1, predatorPlayerAttackData.CriticalAttackChance); predatorPlayerAttackData.CriticalAttackBonusRate = EditorGUILayout.FloatField("Critical attack bonus rate:", predatorPlayerAttackData.CriticalAttackBonusRate); } return(predatorPlayerAttackData); }