/// <summary> /// 得到攻击范围之内的敌人 /// </summary> /// <param name="attackRange">攻击范围类型</param> /// <param name="distanceAttack">攻击距离</param> /// <param name="isBossExsit">当前是否存在boss</param> /// <returns></returns> ArrayList GetEnemyInAttackRange(AttackRangeType type, float distanceAttack, bool isBossExsit = true) { //获取到所有可攻击怪列表 ArrayList enemyInAttackRangeList = new ArrayList(); //可攻击敌人列表 if (isBossExsit) //存在boss的时候 { CalculateEnemysCanAttack(enemyInAttackRangeList, Controller_BossBase.Instance.GetBossList(), distanceAttack); } CalculateEnemysCanAttack(enemyInAttackRangeList, Controller_EnemyBase.Instance.GetEnemyList(), distanceAttack); //判定攻击范围 ArrayList enemyInForwardAttackRangeList = new ArrayList(); //可攻击敌人列表 if (type == AttackRangeType.Forward) //只攻击一定范围内的正前方 { foreach (GameObject enemyItem in enemyInAttackRangeList) { //定义"主角与敌人"的方向"enemyItem"表示敌人的空间点减去主角的空间位置的点"normalized"数值归1化 Vector3 dir = (enemyItem.transform.position - this.gameObject.transform.position).normalized; //定义"主角与敌人"的夹角(用向量"点乘"进行计算) float floDirection = Vector3.Dot(dir, this.gameObject.transform.forward);//计算夹角 //如果主角与敌人在同一个方向,且在有效攻击范围内,则返回此类敌人 //"Dot"求夹角如果角度大于0敌人在主角的视野范围内(正面)并且距离在有效范围才能 if (floDirection > 0 && floDirection < 30)//前方扇形区域60度类怪可攻击 { enemyInForwardAttackRangeList.Add(enemyItem); } } return(enemyInForwardAttackRangeList);//前方可攻击怪 } else { return(enemyInAttackRangeList);//四周全范围可攻击怪 } }
/// <summary> /// 释放技能时 向敌方可攻击怪发送消息 对方接受消息后回应 /// </summary> void SendMessageToEnemys(AttackRangeType type, string[] proArray) { switch (GlobalParametersManager.CurrentActionTYPE) { case ActionType.Basic: _distanceAttack = 0.2f; //暂定数据 _playerDamage = 59; //暂定数据 AttackMessage(proArray, type, _distanceAttack, _playerDamage); //直线攻击 break; case ActionType.Skill01: _distanceAttack = 0.5f; //暂定数据 _playerDamage = 110; //暂定数据 AttackMessage(proArray, type, _distanceAttack, _playerDamage); //直线攻击 break; case ActionType.Skill02: //直线攻击 _distanceAttack = 0.5f; //暂定数据 _playerDamage = 130; //暂定数据 AttackMessage(proArray, type, _distanceAttack, _playerDamage); break; case ActionType.Skill03: //直线攻击 _distanceAttack = 0.6f; //暂定数据 _playerDamage = 100; //暂定数据 AttackMessage(proArray, type, _distanceAttack, _playerDamage); break; } }
void AttackMessage(string[] proArray, AttackRangeType type, float distanceAttack, float playerDamage) { foreach (GameObject go in GetEnemyInAttackRange(type, _distanceAttack)) { Debug.Log(go.name); //向可攻击范围内敌人发送一个攻击消息 go.SendMessage("TakeDamage", _playerDamage + "," + proArray[3] + "," + proArray[4]); //TODO 参数待定 } }
//---------------------------------------------------------------------------- // Constructor //---------------------------------------------------------------------------- #region Constructor public AttackData(IHasAttack hasAttack, AttackRangeType rangeType, AttackType attackType, AttackStat attackStat) { MyHasAttack = hasAttack; MyIsVictim = null; MyRangeType = rangeType; MyAttackType = attackType; MyAttackStat = attackStat; Advantage = false; Disadvantage = false; SumOfModifiers = 0; }
public static string getName(this AttackRangeType type) { switch (type) { case AttackRangeType.all: return("全体"); case AttackRangeType.oneEnemy: return("单体"); case AttackRangeType.smallLine: return("贯通小"); case AttackRangeType.LargeLine: return("贯通大"); case AttackRangeType.smallSector: return("扇形小"); case AttackRangeType.LargeFan: return("扇形大"); case AttackRangeType.adjustableFan: return("扇形可调节"); } return(""); }
/// <summary> /// 释放技能时 向玩家发送消息 对方接受消息后回应 /// </summary> void SendMessageToPlayer(AttackRangeType type, string[] proArray, float bossDamage) { AttackMessage(proArray, bossDamage); }