游戏场景中,怪物时刻监测英雄的距离,当进入攻击圈时 要进行攻击,攻击肯定要是间断攻击。实现原理就用到了协程间的调用。如下:
void Start()
{
if (playerUiPrefab != null)
{
GameObject _uiGo = Instantiate(playerUiPrefab);
_uiGo.SendMessage(“SetTarget”, this, SendMessageOptions.RequireReceiver);
}
//存储当前蜘蛛的位置状态
mm_timer = mmattackSpeed; //初始攻击速度
gameObject.GetComponent().CrossFade(“Idle”);
thisT = this.transform; //第一次调用脚本,缓存当前的位置
inisposition = this.transform.position;
StartCoroutine(AINavMesh());
}
IEnumerator AINavMesh()
{
while (true)
{
foreach (GameObject playerobj in GameObject.FindGameObjectsWithTag("Player"))
{
if (playerobj != null && Vector2.Distance(new Vector2(thisT.position.x, thisT.position.z), new Vector2(playerobj.gameObject.transform.position.x, playerobj.gameObject.transform.position.z)) <= 2f)
{
Debug.Log("侦测到敌人,开始追击!!!");
yield return StartCoroutine(AIFollowHero(playerobj));
}
}
if (Vector3.Distance(inisposition, transform.position) >0.5f)
{
gameObject.GetComponent<Animation>().CrossFade("Run");
Quaternion wantedRotate = Quaternion.LookRotation(inisposition - thisT.position);
thisT.rotation = Quaternion.Slerp(thisT.rotation, wantedRotate, 10f * Time.deltaTime);
Vector3 dir = inisposition - transform.position;
transform.Translate(dir.normalized * Time.deltaTime * speed*0.1f,Space.World);
//PlayAnimation(1);//播放移动动画
}
yield return new WaitForEndOfFrame();
}
}
IEnumerator AIFollowHero(GameObject mage)
{
while (true)
{
// Debug.Log(inisposition + "inisposition*******************");
// Debug.Log(Vector2.Distance(new Vector2(spidertransform_ini.position.x, spidertransform_ini.position.z), new Vector2(mage.gameObject.transform.position.x, mage.gameObject.transform.position.z))+ "Vector2.Distance(new Vector2(spidertransform_ini.position.x, spidertransform_ini.position.z), new Vector2(mage.gameObject.transform.position.x, mage.gameObject.transform.position.z))");
if (Vector2.Distance(new Vector2(inisposition.x, inisposition.z), new Vector2(mage.gameObject.transform.position.x, mage.gameObject.transform.position.z)) > 2f)
{
Debug.Log("敌人已走远,放弃攻击!!!");
// isattack = false;
yield break;
}
if (Vector3.Distance(new Vector3(mage.transform.position.x, transform.position.y, mage.transform.position.z), transform.position) > 1f)
{
Quaternion wantedRotate = Quaternion.LookRotation(new Vector3(mage.transform.position.x, thisT.position.y, mage.transform.position.z) - thisT.position);
thisT.rotation = Quaternion.Slerp(thisT.rotation, wantedRotate, 20f * Time.deltaTime);
//播放行走动画
gameObject.GetComponent<Animation>().CrossFade("Run");
Vector3 dir = new Vector3(mage.transform.position.x, thisT.position.y, mage.transform.position.z) - thisT.position;
thisT.Translate(dir.normalized * Time.deltaTime * speed * 0.2f,Space.World);
// isattack = false;
}
if (Vector3.Distance(new Vector3(mage.transform.position.x, transform.position.y, mage.transform.position.z), transform.position) <= 1f)
{
gameObject.GetComponent<Animation>().CrossFade("Attack");
while (true)
{
mm_timer -= Time.deltaTime;//间断性攻击
if (mm_timer > 0) yield return null;
if (mm_timer <= 0)
{
Debug.Log("***************" + mm_timer);
mm_timer = mmattackSpeed;
if (mage.GetPhotonView().IsMine)
{
mage.gameObject.GetComponent<PhotonView>().RPC("damageHealth", Photon.Pun.RpcTarget.AllViaServer, 0.1f, PlayerAcotornumber);
}
yield return StartCoroutine(AINavMesh());
}
}
}
yield return new WaitForEndOfFrame();
}
}
yield return StartCoroutine(AINavMesh());表示当进行攻击时,攻击后再进入AI的检测协程,继续监测。