Unity 协程间的调用

游戏场景中,怪物时刻监测英雄的距离,当进入攻击圈时 要进行攻击,攻击肯定要是间断攻击。实现原理就用到了协程间的调用。如下:
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的检测协程,继续监测。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值