IEnumerator gotoEnemy() { while (true) { yield return null; GameObject firstenemy = FightRoleManager._instance.findAttackEnemy(this, EAttackStragety.EAttackStragety_Nearest, isAttackEnemy(casterdata.skilldata)); if (firstenemy != null) { float dist = FightRoleManager._instance.getFightRoleDistance(this, firstenemy.GetComponent<DBaseFightRole>()) - firstenemy.GetComponent<DBaseFightRole>().roleRadius; if (dist > casterdata.skilldata.minAttackDist) { Vector3 destpoint = FightRoleManager._instance.getAttackPointByDist(this, firstenemy.GetComponent<DBaseFightRole>(), casterdata.skilldata.minAttackDist); gotoDestination(destpoint); if (FightRoleManager._instance.isCollisionOther(this)) { // gotoDestination(rolePosition); isCasteringSkill = false; break; } } else { // agent.enabled = true; gotoDestination(rolePosition); roleModel.transform.LookAt(firstenemy.GetComponent<DBaseFightRole>().roleModel.transform, Vector3.up); // animatorControl.resetToIdle(); if (casterdata.skilldata.isNeedAppoint) { skillstep = ESkillStep.Selecting; } else { if (casterdata.skilldata.isUseMoveEff) StartCoroutine(ShowMoveEffectToEnemy(firstenemy)); else StartCoroutine(showBeantonMov()); if (casterdata.skilldata.isShakeCamera) Invoke("shakeCamera", casterdata.skilldata.shakeTime); StartCoroutine(showAttackMov()); } break; } } else { //agent.enabled = true; gotoDestination(rolePosition); animatorControl.resetToIdle(); isCasteringSkill = false; break; } } }
IEnumerator OnLockMultiTarget() { // CursorManager.instance.SetNormal(); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitinfo; LayerMask mask = 1 << LayerMask.NameToLayer("GroundLayer"); bool isCollider = Physics.Raycast(ray, out hitinfo, 1000, mask); if (isCollider && hitinfo.collider.tag == Tags.ground) { roleModel.transform.LookAt(hitinfo.point,Vector3.up); StartCoroutine(showAttackMov()); yield return null; skillstep = ESkillStep.None; if (casterdata.skilldata.isUseMoveEff) { //开始播放移到特效 StartCoroutine(ShowMoveEffect(hitinfo.point)); } else if (!string.IsNullOrEmpty(casterdata.skilldata.explodeEffUrl)) { showExplodeEff(hitinfo.point); } } else skillstep = ESkillStep.None; }
//使用技能发动攻击 public bool useSkill(DSkillBaseData baseSkilldata) { if (!canUseSkillNow()) return false; if (baseSkilldata != null) { GameObject firstenemy = FightRoleManager._instance.findAttackEnemy(this, EAttackStragety.EAttackStragety_Nearest, isAttackEnemy(baseSkilldata)); if (firstenemy != null) { isCasteringSkill = true; casterdata = new SkillCasterData(); casterdata.castRole = gameObject; casterdata.skilldata = baseSkilldata; float dist = FightRoleManager._instance.getFightRoleDistance(this, firstenemy.GetComponent<DBaseFightRole>()); roleModel.transform.LookAt(firstenemy.GetComponent<DBaseFightRole>().roleModel.transform, Vector3.up); if (skillManager != null) { skillManager.useSkill(baseSkilldata); } if (dist > DefaultSkillParam.PathFindingDist)//当距离大于可自动寻路距离,不作攻击,只表现一下施放动作和特性 { StartCoroutine(showAttackMov()); } else if (dist > baseSkilldata.minAttackDist) { StartCoroutine(gotoEnemy()); } else { //roleModel.transform.LookAt(firstenemy.transform, Vector3.up); if (casterdata.skilldata.isNeedAppoint) { skillstep = ESkillStep.Selecting; } else { if (casterdata.skilldata.isUseMoveEff) StartCoroutine(ShowMoveEffectToEnemy(firstenemy)); else StartCoroutine(showBeantonMov()); if (casterdata.skilldata.isShakeCamera) Invoke("shakeCamera", casterdata.skilldata.shakeTime); StartCoroutine(showAttackMov()); } } } else { if (skillManager != null) { skillManager.useSkill(baseSkilldata); } isCasteringSkill = true; casterdata = new SkillCasterData(); casterdata.castRole = gameObject; casterdata.skilldata = baseSkilldata; StartCoroutine(showAttackMov()); return true; } } return false; }