第六周2

这周的工作:

关于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);
			}
		}

	}

发现自己攻击写得比较不严谨,需要继续修改。

另外地面攻击的多样性的概率转换也需要思考一个合理的方案。

猜你喜欢

转载自blog.csdn.net/vancooler/article/details/80216606