//释放技能 void CastSkill() { CancelInvoke("CastSkill"); CancelInvoke("AutoLookatTarget"); // 如果不是激活状态不往下运行 if (!gameObject.activeInHierarchy) { return; } //释放吟唱阶段的动作特效 SendEvent(SkillCellEventType.SE_DESTROY_ACTION_EFX, null); //销毁吟唱阶段数据 DestroyEfx(); //播放动作,特效,声音 SkillPlayParam param = new SkillPlayParam(); LuaTable skill_action = CoreEntry.gSkillMgr.GetSkillActon(m_skillID); if (skill_action == null) { Debug.LogError("skill_action is null...m_skillID = " + m_skillID); return; } if (skill_action != null) { param.action = skill_action.Get <string>("animation"); param.actionEfx = skill_action.Get <string>("skilleffect"); param.startTime = m_startPlayTimeSet; param.speed = m_speed; param.remainEfx = skill_action.Get <string>("remain"); } //播放声音 string sound1 = ""; string sound2 = ""; AudioCore.GenerateAudio(m_skillDesc.Get <int>("sound_id"), ref sound1); AudioCore.GenerateAudio(m_skillDesc.Get <int>("talk_sound_id"), ref sound2); param.sound = sound1; param.voice = sound2; StartCoroutine(PlayActionEfxSound(param, skill_action.Get <float>("skillEfxDelay"))); //技能元素 SkillClassDisplayDesc skillClass = m_gameDBMgr.GetSkillClassDisplayDesc(m_skillDesc.Get <int>("skillDisplayID")); if (skillClass == null) { Debug.LogError("===skillClass== is null==="); return; } bool isLocal = false; if (m_actor is PlayerObj || m_actor is PetObj) { isLocal = true; } for (int i = 0; i < skillClass.castStageDataList.Count; ++i) { if (null != m_actor && !isLocal) { if (skillClass.castStageDataList[i] is MovePosAttackDesc) { continue; } } GameObject cellObj = CoreEntry.gGameObjPoolMgr.InstantiateSkillCell(skillClass.castStageDataList[i].prefabPath); cellObj.transform.parent = transform; ISkillCell skillCell = cellObj.GetComponent <ISkillCell>(); skillCell.Init(skillClass.castStageDataList[i], this); skillCell.SetAoeState(m_bIsAoe); CheckSkillCell(skillCell); AddSkillCell(cellObj); } //技能结束时间 if (m_skillDesc.Get <int>("skill_end") > 0) { m_overTime = (m_skillDesc.Get <int>("skill_end") / 1000f - m_startPlayTimeSet) / m_speed; } else { m_overTime = (m_actor.GetActionLength(m_strActionName) - m_startPlayTimeSet) / m_speed; } //如果是不可打破机能,释放出后恢复动作 if (canBeBroke == false) { float time = (m_actor.GetActionLength(m_strActionName) - m_startPlayTimeSet) / m_speed; CancelInvoke("SkillAnimationIsOver"); Invoke("SkillAnimationIsOver", time); } LogMgr.UnityLog("overtime=" + m_overTime + ", skillid=" + m_skillID); //技能结束 Invoke("SkillEnd", m_overTime); }
public void ShowSkillScope() { SkillClassDisplayDesc skillClass = m_gameDBMgr.GetSkillClassDisplayDesc(m_skillDesc.Get <int>("skillDisplayID")); if (skillClass == null) { Debug.LogError("===skillClass== is null==="); return; } LuaTable skilleffect = ConfigManager.Instance.Skill.GetEffectConfig(m_skillID); if (skilleffect.Get <int>("range") == (int)SkillRangeType.SKILL_TARGET) // if ((int)m_skillDesc.atkType == (int)Configs.skillConfig.AtkTypeEnum.SINGLE) { m_bIsAoe = false; } //吟唱阶段 for (int i = 0; i < skillClass.prepareStageDataList.Count; ++i) { GameObject cellObj = CoreEntry.gGameObjPoolMgr.InstantiateSkillCell(skillClass.prepareStageDataList[i].prefabPath); cellObj.transform.parent = transform; ISkillCell skillCell = cellObj.GetComponent <ISkillCell>(); skillCell.Init(skillClass.prepareStageDataList[i], this); skillCell.SetAoeState(m_bIsAoe); AddSkillCell(cellObj); } //技能元素 for (int i = 0; i < skillClass.castStageDataList.Count; ++i) { GameObject cellObj = CoreEntry.gGameObjPoolMgr.InstantiateSkillCell(skillClass.castStageDataList[i].prefabPath); cellObj.transform.parent = transform; ISkillCell skillCell = cellObj.GetComponent <ISkillCell>(); skillCell.Init(skillClass.castStageDataList[i], this); skillCell.SetAoeState(m_bIsAoe); AddSkillCell(cellObj); } // 删除原来的预警贴花 if (m_actor.m_WarningefxObj != null) { Destroy(m_actor.m_WarningefxObj); m_actor.m_WarningefxObj = null; } // 读取新的预警贴花 for (int i = 0; i < m_skillCellObjectlist.Count; i++) { ISkillCell skillCell = m_skillCellObjectlist[i].GetComponent <ISkillCell>(); skillCell.ShowSkillScope(); if (m_actor.m_WarningefxObj != null) { break; } } if (m_actor.m_WarningefxObj != null) { EfxAttachActionPool efx = m_actor.m_WarningefxObj.GetComponent <EfxAttachActionPool>(); if (efx == null) { efx = m_actor.m_WarningefxObj.AddComponent <EfxAttachActionPool>(); } efx.Init(m_actor.transform, 100000f, true); } }
// Use this for initialization void Start() { IsOver = false; CancelInvoke("Start"); if (m_onlyShowSkillScope) { return; } m_AttackList.Clear(); compositedSkillCell = null; ShowBossSkillWarning(); SkillClassDisplayDesc skillClass = m_gameDBMgr.GetSkillClassDisplayDesc(m_skillDesc.Get <int>("skillDisplayID")); if (skillClass == null) { Debug.LogError("===skillClass== is null==="); return; } if (null != m_skilleffect && m_skilleffect.Get <int>("range") == (int)SkillRangeType.SKILL_TARGET) { m_bIsAoe = false; } if (skillClass.prepareStage == null || skillClass.prepareStage.open == false) { //直接进入释放技能阶段 CastSkill(); return; } //吟唱阶段 bool isLocal = false; if (m_actor is PlayerObj || m_actor is PetObj) { isLocal = true; } for (int i = 0; i < skillClass.prepareStageDataList.Count; ++i) { if (null != m_actor && !isLocal) { if (skillClass.prepareStageDataList[i] is MovePosAttackDesc) { continue; } } //GameObject cellObj = Instantiate( // CoreEntry.gResLoader.LoadResource(skillClass.prepareStageDataList[i].prefabPath)) as GameObject; GameObject cellObj = CoreEntry.gGameObjPoolMgr.InstantiateSkillCell(skillClass.prepareStageDataList[i].prefabPath); cellObj.transform.parent = transform; ISkillCell skillCell = cellObj.GetComponent <ISkillCell>(); skillCell.Init(skillClass.prepareStageDataList[i], this); skillCell.SetAoeState(m_bIsAoe); AddSkillCell(cellObj); } if (skillClass.prepareStage.isLookAtTarget) { InvokeRepeating("AutoLookatTarget", 0f, 0.1f); } m_prepareKeepTime = skillClass.prepareStage.keepTime; //吟唱结束,进入释放阶段 Invoke("CastSkill", skillClass.prepareStage.keepTime); Syncm_transform(); }