这周的工作:
关于Boss的子节点的具体实现
以及部分的转化函数
由于转化为概率模型,还是谨慎设置比较好
其次是寻找可用的资源用於测试脚本。
/******************************************以下是子节点*****************************/ //截获帧数更新,系统设置的 public static void FSM_Test_Recorder(AIEntity pEntity){ pEntity.GetComponent<AIState> ().LastEntityData.AIPos = pEntity.AIPos; pEntity.GetComponent<AIState> ().LastEntityData.PlayerPos = pEntity.PlayerPos; pEntity.GetComponent<AIState> ().LastEntityData.PlayerEntity.GetComponent<HPComponent> ().tempHP = pEntity.PlayerEntity.GetComponent<HPComponent> ().tempHP; pEntity.GetComponent<AIState> ().LastEntityData.PlayerEntity.GetComponent<HPComponent> ().tempHurt = pEntity.PlayerEntity.GetComponent<HPComponent> ().tempHurt; } //巡逻此时有很大程度可以清空疲惫值以及恢复血量(注意有关疲惫的还没写完) public static void FSM_Walk(AIEntity pEntity){ if (pEntity.GetComponent<myBossAI> ().tempRoundPoint== Vector3.zero) { Vector2 trandom = Random.insideUnitCircle; pEntity.GetComponent<myBossAI> ().tempRoundPoint = pEntity.GetComponent<myBossAI> ().RoundCenter+(new Vector3(trandom.x,0,trandom.y))*pEntity.GetComponent<myBossAI>().RoundSize; } //如果获取距离离现在太近(可能会有卡顿现象) while(Vector3.Distance(pEntity.GetComponent<myBossAI>().tempRoundPoint,pEntity.AIPos)<1.0f){ //重新获得一个二维坐标 Vector2 trandom = Random.insideUnitCircle; pEntity.GetComponent<myBossAI> ().tempRoundPoint = pEntity.GetComponent<myBossAI> ().RoundCenter+(new Vector3(trandom.x,0,trandom.y))*pEntity.GetComponent<myAI>().RoundSize; } //获取完后更新方向 pEntity.GetComponent<AIMove>().mDirection=(pEntity.GetComponent<myBossAI>().tempRoundPoint-pEntity.AIPos).normalized; pEntity.GetComponent<AIMove> ().mVelocity = pEntity.GetComponent<myBossAI> ().mWalkVelocity; pEntity.GetComponent<AIMove> ().mMoveFunc = MoveFunc.Complex;//不知道这个是干嘛的,要问一下 //关于疲劳的代码没写******************************************************************* //只写了增加疲劳 pEntity.GetComponent<myBossAI>().tired+=pEntity.GetComponent<myBossAI>().walkTiredValue; } //追击敌人 public static void FSM_Trace(AIEntity pEntity){ //发现了,就走路麻烦,其实就是为了设置一个方向、速度以及移动方式,还有现在的疲惫值 //AImove 是基本的 //追击的时候是看到玩家的时候,用pEntity中的PlyaerPos可以得到Player的位置 pEntity.GetComponent<AIMove>().mDirection=(pEntity.PlayerPos-pEntity.AIPos).normalized; pEntity.GetComponent<AIMove> ().mVelocity = pEntity.GetComponent<myBossAI> ().mTraceVelocity; pEntity.GetComponent<AIMove> ().mMoveFunc = MoveFunc.Complex; pEntity.GetComponent<myBossAI> ().tired += pEntity.GetComponent<myBossAI> ().traceTiredValue; } //逃跑 public static void FSM_RunAway(AIEntity pEntity){ //朝着玩家的反方向跑,同时朝着躲避点跑,躲避点是一堆位置的数组 //玩家反方向 Vector3 playerDir=(pEntity.AIPos-pEntity.PlayerPos).normalized; float playerDistance = Vector3.Distance (pEntity.AIPos, pEntity.PlayerPos);//计算AI和玩家距离 int count = 0; while (count <= 7) { int index = Random.Range (0, pEntity.GetComponent<myBossAI> ().HiddenPoint.Length); count++; //隐蔽点方向 Vector3 HiddenDir = (pEntity.GetComponent<myBossAI> ().HiddenPoint [index].position - pEntity.AIPos).normalized; //计算隐蔽点与玩家位置 float HiddenDistance = Vector3.Distance(pEntity.GetComponent<myBossAI>().HiddenPoint[index].position,pEntity.PlayerPos); if(HiddenDistance-playerDistance>1.0f&&Vector3.Dot(playerDir,HiddenDir)>=0.1f){ pEntity.GetComponent<AIMove> ().mDirection = HiddenDir; break; } } if (count > 7) { //说明一直没有搜寻到比较好的隐蔽点位置 pEntity.GetComponent<AIMove>().mDirection=playerDir; } pEntity.GetComponent<AIMove> ().mVelocity = pEntity.GetComponent<myBossAI> ().mTraceVelocity+1; pEntity.GetComponent<AIMove> ().mMoveFunc = MoveFunc.Complex; pEntity.GetComponent<myBossAI> ().tired += pEntity.GetComponent<myBossAI> ().runawayTiredValue; } //呼唤小兵 public static void FSM_CallOthers(AIEntity pEntity){ if (pEntity.GetComponent<myBossAI> ().CallOtherRate > 0) { pEntity.GetComponent<myBossAI> ().CallOtherRate -= Time.deltaTime; } else { pEntity.GetComponent<myBossAI> ().CallOtherRate = 3.0f; Debug.Log ("Call Other"); } } public static void FSM_CallOthersExit(AIEntity pEntity){ pEntity.GetComponent<myBossAI> ().CallOtherRate = 3.0f; } /************攻击相关******************************************************************************************/ //Special Attack 有三种,Normal Attack 有2种,分别是(远程)的和近战的 public static void FSM_SpecialAttack1(AIEntity pEntity){ if (pEntity.GetComponent<myBossAI> ().groundAttackRate > 0.0f) { pEntity.GetComponent<myBossAI> ().groundAttackRate -= Time.deltaTime; } else { //可以攻击 pEntity.GetComponent<myBossAI>().groundAttackRate=pEntity.GetComponent<myBossAI>().groundAttackRateValue; //更改tempHP,到底怎么获取玩家的HP然后再传回去? pEntity.GetComponent<myBossAI>().tempHP-=10; pEntity.GetComponent<BaseAIComponent> ().mAIRT.transform.forward = (pEntity.PlayerPos - pEntity.AIPos).normalized; pEntity.GetComponent<myBossAI> ().fire_Timer += Time.deltaTime; pEntity.GetComponent<myBossAI> ().tired += 10; } } public static void FSM_SpecialAttack_Exit(AIEntity pEntity){ pEntity.GetComponent<myBossAI> ().fire_Timer = 0.0f; pEntity.GetComponent<myBossAI> ().groundAttackRate = pEntity.GetComponent<myBossAI> ().groundAttackRateValue; } //远程攻击1:放火焰 public static void FSM_FarAttack1(AIEntity pEntity){ if (pEntity.GetComponent<myBossAI> ().FarAttackRate > 0) { pEntity.GetComponent<myBossAI> ().FarAttackRate -= Time.deltaTime; } else { pEntity.GetComponent<myBossAI> ().FarAttackRate = 0.5f; Shoot (pEntity); } } //远程攻击2:放特效 public static void FSM_FarAttack2(AIEntity pEntity){ if (pEntity.GetComponent<myBossAI> ().FarMagicRate > 0) { } else { if (pEntity.GetComponent<myBossAI> ().MagicValue >=10.0f) { pEntity.GetComponent<myBossAI> ().FarMagicRate = 2.0f; pEntity.GetComponent<myBossAI> ().MagicValue -= 10.0f; } } } //攻击结束 public static void FSM_AttackExit(AIEntity pEntity){ } /**********************************************************************************************************************/ //各种转化函数 //任意状态转化为逃跑 public static float Transfer_AnyToRunaway(AIEntity pEntity){ if (pEntity.GetComponent<myBossAI> ().tempHP < pEntity.GetComponent<myBossAI> ().HPValue) { float rate = (0.5f * pEntity.GetComponent<myBossAI> ().HPValue - pEntity.GetComponent<myBossAI> ().tempHP) / (0.5f * pEntity.GetComponent<myBossAI> ().HPValue); if (pEntity.GetComponent<AIEmotion> ().GetTempEmotion () == "Fear") rate *= 1.5f; return rate; } return 0.0f; } //从走转化为追击 public static float Transfer_WalkToTrace(AIEntity pEntity){ float dis = Vector3.Distance (pEntity.AIPos, pEntity.PlayerPos); //视线方向 float angle=Vector3.Dot((pEntity.PlayerPos-pEntity.AIPos).normalized,pEntity.GetComponent<AIMove>().mDirection); if (dis < 20.0f && angle >= 0.2) { //根据tired值更改追击的可能性 return (20 - dis) * 0.1 *( 1-pEntity.GetComponent<myBossAI> ().tired / 100) * pEntity.GetComponent<myBossAI> ().tempHP / pEntity.GetComponent<myBossAI> ().HPValue; } else return 0.0f; } //从追击转化为攻击
void Shoot(AIEntity pEn){ Ray myRay; RaycastHit myHit; pEn.GetComponent<myBossAI> ().fire.Stop (); pEn.GetComponent<myBossAI> ().fire.Play (); myRay.origin = pEn.AIPos; myRay.direction = pEn.GetComponent<AIMove> ().mDirection; if (Physics.Raycast (myRay, out myHit, 100, pEn.GetComponent<myBossAI> ().ShootableMask)) { //因为不太清楚player的hp去哪里找好 //先用自己写的Enermy类来代替一下 EnemyDamage eDamage=myHit.collider.GetComponent<EnermyDamage>(); if (eDamage != null) { eDamage.Damage (10.0f); } } }
发现自己攻击写得比较不严谨,需要继续修改。
另外地面攻击的多样性的概率转换也需要思考一个合理的方案。