void SkillInit() { for (int i = 0; i < SkillIcon.Length; i++) { GameObject selectEff = SkillIcon[i].transform.parent.transform.FindChild("Selecteff").gameObject; selectEff.SetActive(false); } //액티브 스킬 셋팅 Dictionary <ushort, NetData._PartnerActiveSkillData> activeSkillList = CurData.ActiveSkillList; int activeCount = activeSkillList.Count; for (int i = 1; i < activeCount; i++)//0번은 평타. { uint skillId = activeSkillList[(ushort)i]._skillIndex; SkillTables.ActionInfo actionLowData = _LowDataMgr.instance.GetSkillActionLowData(skillId); if (actionLowData == null) { continue; } SkillIcon[i - 1].spriteName = _LowDataMgr.instance.GetLowDataIcon(actionLowData.Icon); SkillName[i - 1].text = _LowDataMgr.instance.GetStringSkillName(actionLowData.name); SkillLevel[i - 1].text = string.Format(_LowDataMgr.instance.GetStringCommon(1151), CurData.GetBuffSkillToSlot((ushort)i)._skillLevel); int idx = i; EventDelegate.Set(ActiveSkillTrigger[i - 1].onClick, delegate() { OnClickActiveSkill(idx - 1, activeSkillList[(ushort)idx]); }); //SkillDesc[i - 1].text = _LowDataMgr.instance.GetStringSkillName(actionLowData.descrpition); } //디폴트는 첫번째스킬 OnClickActiveSkill(0, activeSkillList[1]); }
/// <summary> 서버에서 스킬업그레이드 응답. </summary> public void OnPMsgCostumeSkillUp(NetData._CostumeData costume, int skillNumber) { GameObject skillViewObj = GetViewObj(ViewType.Skill); int arr = skillNumber - 1;//SkillLevelup.SelectSkillNum; Transform skillViewTf = skillViewObj.transform.FindChild("Skills"); UISprite icon = skillViewTf.FindChild(string.Format("BtnSkill_{0}/icon_d5", arr)).GetComponent <UISprite>(); UILabel level = skillViewTf.FindChild(string.Format("BtnSkill_{0}/level_d5", arr)).GetComponent <UILabel>(); UILabel name = skillViewTf.FindChild(string.Format("BtnSkill_{0}/name_d5", arr)).GetComponent <UILabel>(); SkillTables.ActionInfo actionLowData = _LowDataMgr.instance.GetSkillActionLowData(SkillLevelup.SkillId); if (actionLowData == null) { Debug.LogError("not found ActionInfo error " + SkillLevelup.SkillId); return; } ushort skillLevel = costume._skillLevel[arr]; icon.spriteName = _LowDataMgr.instance.GetLowDataIcon(actionLowData.Icon); level.text = string.Format(_LowDataMgr.instance.GetStringCommon(453), skillLevel); name.text = _LowDataMgr.instance.GetStringSkillName(actionLowData.name); SkillUpEff.SetActive(false); SkillUpEff.SetActive(true); UIEventTrigger uiTri = skillViewTf.FindChild(string.Format("BtnSkill_{0}", arr)).GetComponent <UIEventTrigger>(); EventDelegate.Set(uiTri.onClick, delegate() { SetSkillInfo(actionLowData, arr, skillLevel); }); SetSkillInfo(actionLowData, arr, skillLevel); if (IsMaxSkillup) { SkillTables.SkillLevelInfo nowLevelLowData = _LowDataMgr.GetSkillLevelData(actionLowData.idx, (byte)skillLevel);//지금 if (SkillMaxLv <= skillLevel || NetData.instance.GetAsset(AssetType.Gold) < nowLevelLowData.CostGold || NetData.instance.UserLevel < nowLevelLowData.LimitLv) { IsMaxSkillup = false; } else { OnClickSkillLevelup(true); } } SoundManager.instance.PlaySfxSound(eUISfx.UI_cos_skill_up, false); }
/// <summary> 파트너 액티브스킬 레벨업 응답 </summary> public void OnPMsgHeroSkillUpgradeSHandler() { NetData._PartnerActiveSkillData selectSkill = CurData.GetBuffSkillToSlot((ushort)(SelectActiveSkillIndex + 1)); if (selectSkill != null) { UIHelper.CreateEffectInGame(SkillLevelUpEffRoot, "Fx_partner_skillup_01"); CurSelectSkillLevel[1].GetComponent <TweenColor>().ResetToBeginning(); CurSelectSkillLevel[1].GetComponent <TweenColor>().PlayForward(); CurSelectSkillLevel[1].GetComponent <TweenScale>().ResetToBeginning(); CurSelectSkillLevel[1].GetComponent <TweenScale>().PlayForward(); TempCoroutine.instance.FrameDelay(1f, delegate() { DestroyImmediate(SkillLevelUpEffRoot.GetChild(0).gameObject); //액티브 스킬 셋팅 Dictionary <ushort, NetData._PartnerActiveSkillData> activeSkillList = CurData.ActiveSkillList; int activeCount = activeSkillList.Count; for (int i = 1; i < activeCount; i++)//0번은 평타. { uint skillId = activeSkillList[(ushort)i]._skillIndex; SkillTables.ActionInfo actionLowData = _LowDataMgr.instance.GetSkillActionLowData(skillId); if (actionLowData == null) { continue; } SkillIcon[i - 1].spriteName = _LowDataMgr.instance.GetLowDataIcon(actionLowData.Icon); SkillName[i - 1].text = _LowDataMgr.instance.GetStringSkillName(actionLowData.name); SkillLevel[i - 1].text = string.Format(_LowDataMgr.instance.GetStringCommon(1151), CurData.GetBuffSkillToSlot((ushort)i)._skillLevel); int idx = i; EventDelegate.Set(ActiveSkillTrigger[i - 1].onClick, delegate() { OnClickActiveSkill(idx - 1, activeSkillList[(ushort)idx]); }); } OnClickActiveSkill(SelectActiveSkillIndex, selectSkill); }); } else { Debug.LogError("CanNotFound SKillData"); } }
/* * /// <summary> * /// 스킬 뷰 초기화 함수 스킬 뷰로 올때마다 실행해준다 * /// </summary> * void SkillViewSetting() * { * SkillUpEff.SetActive(false); * NetData._CostumeData costumeData = UserInfo.GetEquipCostume(); * * GameObject skillViewObj = GetViewObj(ViewType.Skill); * if (skillViewObj == null) * return; * * Transform skillViewTf = skillViewObj.transform.FindChild("Skills"); * UILabel costumeName = skillViewObj.transform.FindChild("CostumeName").GetComponent<UILabel>(); * costumeName.text = costumeData.GetLocName(); * * ushort[] skillLevel = costumeData._skillLevel; * List<uint> skillList = costumeData.GetSkillList(); * int skillCount = skillList.Count; * for (int i = 0; i < skillCount; i++) * { * UIEventTrigger uiTri = skillViewTf.FindChild(string.Format("BtnSkill_{0}", i)).GetComponent<UIEventTrigger>(); * UISprite icon = skillViewTf.FindChild(string.Format("BtnSkill_{0}/icon_d5", i)).GetComponent<UISprite>(); * UILabel level = skillViewTf.FindChild(string.Format("BtnSkill_{0}/level_d5", i )).GetComponent<UILabel>(); * UILabel name = skillViewTf.FindChild( string.Format("BtnSkill_{0}/name_d5", i)).GetComponent<UILabel>(); * * SkillTables.ActionInfo actionLowData = _LowDataMgr.instance.GetSkillActionLowData(skillList[i]); * if (actionLowData == null) * { * Debug.LogError("SkillAction index error " + actionLowData.idx); * continue; * } * * int arr = i; * ushort s_level = skillLevel[i]; * * uiTri.collider.enabled = true; // ????? * icon.spriteName = _LowDataMgr.instance.GetLowDataIcon(actionLowData.Icon); * level.text = string.Format(_LowDataMgr.instance.GetStringCommon(453), skillLevel[i] ); * name.text = _LowDataMgr.instance.GetStringSkillName(actionLowData.name); * * EventDelegate.Set(uiTri.onClick, delegate() { SetSkillInfo(actionLowData, arr, s_level); } ); * } * * //기본으로 0번 선택해 놓는다. * SetSkillInfo(_LowDataMgr.instance.GetSkillActionLowData(skillList[0]), 0, skillLevel[0] ); * } */ /// <summary> /// 선택한 스킬에 대한 정보를 출력해준다. /// </summary> void SetSkillInfo(SkillTables.ActionInfo actionLowData, int arr, ushort skillLevel) { SkillLevelup.Init(); //일단 초기화하고 시작. SkillTables.SkillLevelInfo nowLevelLowData = _LowDataMgr.GetSkillLevelData(actionLowData.idx, (byte)skillLevel); //지금 if (nowLevelLowData == null) { Debug.LogError("skillLevel index error " + actionLowData.idx); return; } uint nextSkillDesc = 0; if (skillLevel < SkillMaxLv) //렙업 가능 상황. { SkillTables.SkillLevelInfo nextSkillLevel = _LowDataMgr.GetSkillLevelData(actionLowData.idx, (byte)(skillLevel + 1)); //다음 nextSkillDesc = nextSkillLevel.skilldesc; //다은꺼는 이거말고 쓸게없음. { SkillLevelup.SelectSkillNum = arr; SkillLevelup.SelectSkillLevel = skillLevel; SkillLevelup.SkillId = actionLowData.idx; } } else//최대 렙임. 렙업 불가능. { nextSkillDesc = nowLevelLowData.skilldesc; //SkillLevelup.IsCanNotLevelup = true; } //스킬 정보 셋팅 GameObject skillViewObj = GetViewObj(ViewType.Skill); if (skillViewObj == null) { return; } Transform skillInfoTf = skillViewObj.transform.FindChild("Info"); UILabel skillName = skillInfoTf.FindChild("skill_name_d5").GetComponent <UILabel>(); UILabel skillDesc = skillInfoTf.FindChild("description_d5").GetComponent <UILabel>(); UILabel nowData = skillInfoTf.FindChild("SkillData/Now/now").GetComponent <UILabel>(); UILabel nextData = skillInfoTf.FindChild("SkillData/Next/next").GetComponent <UILabel>(); UILabel needLevel = skillInfoTf.FindChild("Need/Level/value_d5").GetComponent <UILabel>(); UILabel needGold = skillInfoTf.FindChild("Need/Gold/value_d5").GetComponent <UILabel>(); skillName.text = _LowDataMgr.instance.GetStringSkillName(actionLowData.name); skillDesc.text = _LowDataMgr.instance.GetStringSkillName(actionLowData.descrpition); nowData.text = _LowDataMgr.instance.GetStringSkillName(nowLevelLowData.skilldesc); nextData.text = _LowDataMgr.instance.GetStringSkillName(nextSkillDesc); needLevel.text = string.Format("{0}", nowLevelLowData.LimitLv); //string.Format(_LowDataMgr.instance.GetStringCommon(453), needGold.text = string.Format("{0}", SceneManager.instance.NumberToString(nowLevelLowData.CostGold)); //nowLevelLowData.CostGold == 0 ? "0" : nowLevelLowData.CostGold.ToString("#,##") ); Transform btnTf = skillViewObj.transform.FindChild(string.Format("Skills/BtnSkill_{0}", arr)); SelectSkillEff.parent = btnTf; SelectSkillEff.localPosition = Vector3.zero; SelectSkillEff.localScale = Vector3.one; Transform upEffTf = SkillUpEff.transform; upEffTf.parent = btnTf; upEffTf.localScale = Vector3.one; upEffTf.localPosition = Vector3.zero; }
/// <summary> /// 액티브스킬칸 누름/// </summary> void OnClickActiveSkill(int index, NetData._PartnerActiveSkillData selectSkill) { SelectActiveSkillIndex = index; for (int i = 0; i < SkillIcon.Length; i++) { GameObject selectEff = SkillIcon[i].transform.parent.transform.FindChild("Selecteff").gameObject; selectEff.SetActive(i == index); } SkillTables.ActionInfo actionLowData = _LowDataMgr.instance.GetSkillActionLowData(selectSkill._skillIndex); if (actionLowData == null) { return; } SkillTables.SkillLevelInfo levelLowData = _LowDataMgr.GetSkillLevelData(selectSkill._skillIndex, selectSkill._skillLevel); CurSelectSkillDec.text = _LowDataMgr.instance.GetStringSkillName(actionLowData.descrpition); Transform SkillView = ViewObj[(int)ViewType.Skill].transform; //만렙인지 체크 SkillTables.SkillLevelInfo nextLevelLowData = null; int maxSkillLevel = _LowDataMgr.instance.GetEtcTableValue <int>(EtcID.PartnerMaxSkillLevel); if (selectSkill._skillLevel < maxSkillLevel) { SkillView.FindChild("arrow").gameObject.SetActive(true); SkillView.FindChild("name").gameObject.SetActive(true); nextLevelLowData = _LowDataMgr.GetSkillLevelData(selectSkill._skillIndex, (byte)(selectSkill._skillLevel + 1)); CurSelectSkillLevel[1].text = string.Format(_LowDataMgr.instance.GetStringCommon(1151), selectSkill._skillLevel + 1); //스킬재료아이템 SkillLevelUpMaterialSlot.SetLowDataItemSlot(nextLevelLowData.SkillLevelUpItem1, 0, (lowDataId) => { OpenDetailPopup(null, nextLevelLowData.SkillLevelUpItem1); //UIMgr.OpenClickPopup((uint)lowDataId, SkillLevelUpMaterialSlot.transform.position); }); int nowAmount = UserInfo.GetItemCountForItemId(nextLevelLowData.SkillLevelUpItem1, (byte)eItemType.USE); bool isSuccess = true; if (nowAmount < nextLevelLowData.SkillLevelUpItem1Count || NetData.instance.GetAsset(AssetType.Gold) < nextLevelLowData.CostGold) { isSuccess = false; } SkillLevelUpRoot.FindChild("value").GetComponent <UILabel>().text = string.Format(_LowDataMgr.instance.GetStringCommon(1167), nowAmount, nextLevelLowData.SkillLevelUpItem1Count); SkillLevelUpRoot.FindChild("value").GetComponent <UILabel>().color = nowAmount < nextLevelLowData.SkillLevelUpItem1Count ? Color.red : Color.white; SkillLevelUpRoot.FindChild("Lock").gameObject.SetActive(nowAmount < nextLevelLowData.SkillLevelUpItem1Count); if (isSuccess) { BtnSkillLevelUp.transform.FindChild("Btn_on").gameObject.SetActive(true); BtnSkillLevelUp.transform.FindChild("Btn_off").gameObject.SetActive(false); BtnSkillLevelUp.transform.FindChild("Btn_on/price").GetComponent <UILabel>().text = string.Format("x{0}", nextLevelLowData.CostGold); } else { BtnSkillLevelUp.transform.FindChild("Btn_on").gameObject.SetActive(false); BtnSkillLevelUp.transform.FindChild("Btn_off").gameObject.SetActive(true); BtnSkillLevelUp.transform.FindChild("Btn_off/price").GetComponent <UILabel>().text = string.Format("x{0}", nextLevelLowData.CostGold); } SkillLevelUpRoot.gameObject.SetActive(true); BtnSkillLevelUp.transform.gameObject.SetActive(true); CurSelectSkillLevel[1].transform.parent.gameObject.SetActive(true); CurSelectSkilDamage[0].text = string.Format(_LowDataMgr.instance.GetStringCommon(1166), GetSkillDamage(levelLowData.factorRate.list, (float)levelLowData.factor).ToString()); CurSelectSkilDamage[1].text = string.Format(_LowDataMgr.instance.GetStringCommon(1166), GetSkillDamage(nextLevelLowData.factorRate.list, (float)nextLevelLowData.factor).ToString()); SkillMaxLevel.SetActive(false); //위치변경도 있어야함 CurSelectSkillLevel[0].transform.parent.transform.localPosition = new Vector3(-138, -3, 0); EventDelegate.Set(BtnSkillLevelUp.onClick, delegate() { if (!isSuccess) { string msg = ""; if (nowAmount < nextLevelLowData.SkillLevelUpItem1Count) { msg = _LowDataMgr.instance.GetStringCommon(1173); //재료부족 } else if (NetData.instance.GetAsset(AssetType.Gold) < nextLevelLowData.CostGold) { msg = _LowDataMgr.instance.GetStringCommon(1174); //골드부족 } UIMgr.instance.AddPopup(_LowDataMgr.instance.GetStringCommon(141), msg, _LowDataMgr.instance.GetStringCommon(117)); return; } NetworkClient.instance.SendPMsgHeroSkillUpgradeC(CurData._partnerIndex, SelectActiveSkillIndex + 1); }); } else { //만렙일경우 //현재 레벨만 표기 SkillView.FindChild("arrow").gameObject.SetActive(false); SkillView.FindChild("name").gameObject.SetActive(false); SkillLevelUpRoot.gameObject.SetActive(false); BtnSkillLevelUp.transform.gameObject.SetActive(false); CurSelectSkillLevel[1].transform.parent.gameObject.SetActive(false); //위치변경도 있어야함 CurSelectSkilDamage[0].text = string.Format(_LowDataMgr.instance.GetStringCommon(1166), GetSkillDamage(levelLowData.factorRate.list, (float)levelLowData.factor).ToString()); CurSelectSkillLevel[0].transform.parent.transform.localPosition = new Vector3(0, -3, 0); SkillMaxLevel.SetActive(true); } CurSelectSkillLevel[0].text = string.Format(_LowDataMgr.instance.GetStringCommon(1151), selectSkill._skillLevel); CurSelectSkillLevel[1].gameObject.transform.localScale = Vector3.one; }
//< 실질적 스킬 적용 public static void ApplySkill(SkillType skillType, AbilityData _ability, Unit _Caster, Unit _Target, bool normal = false) { float affectValue = CalcAffectValue(_ability, _Caster, _Target); switch (skillType) { case SkillType.Attack: //일반 공격 case SkillType.AttackBuff: if (_Target != null) { //SkillTables.ActionInfo _action = _LowDataMgr.GetSkillAction(_ability.Idx); //슈퍼아머 계산은 먼저 해야함 //if (_ability != null) //{ // uint beforeSuperArmor = _Target.CharInfo.SuperArmor; // //슈퍼아머값 감소 // if (_Target.CharInfo.SuperArmor <= _ability.superArmorDmg) // { // _Target.CharInfo.SuperArmor = 0; // //0일경우만 회복을 시키고 아닐경우는 무시하자 // if (_Target.SuperRecoveryTick == 0f) // { // if(beforeSuperArmor!=0) // { // Transform effTrans = G_GameInfo.SpawnEffect("Fx_SuperArmor_Delete", _Target.cachedTransform.position, Quaternion.Euler(Vector3.zero)); // if (effTrans != null) // { // FxMakerPoolItem poolItem = effTrans.GetComponent<FxMakerPoolItem>(); // if (poolItem == null) // { // poolItem = effTrans.gameObject.AddComponent<FxMakerPoolItem>(); // poolItem.destroyTime = 10; // } // poolItem.Owner = _Target; // poolItem.SetAttach(_Target.transform); // } // SoundManager.instance.PlaySfxUnitSound(0, _Target._audioSource, _Target.cachedTransform, true); // } // _Target.SuperRecoveryTick = _Target.CharInfo.SuperArmor_RecoveryTime; // } // } // else // { // _Target.CharInfo.SuperArmor = _Target.CharInfo.SuperArmor - _ability.superArmorDmg; // } // //공격자측의 슈퍼아머 회복 // _Caster.CharInfo.SuperArmor += _ability.superArmorRecovery; // _Caster.CharInfo.SuperArmor = (uint)Mathf.Clamp(_Caster.CharInfo.SuperArmor, 0, _Caster.CharInfo.MaxSuperArmor); //} //if (_ability.callBuffIdx != 0) //{ // if (_Target != null && _Target.BuffCtlr != null) // { // _Target.BuffCtlr.AttachBuff(_Caster, _Target, _Caster.SkillCtlr.__SkillGroupInfo.GetBuff(_ability.callBuffIdx, _ability.Idx), _ability.rate, _ability.durationTime); // } //} _Target.TakeDamage(_Caster, 1.0f, affectValue, _ability.ignoreDef, eAttackType.All, !normal, _ability, false, false); } break; case SkillType.Projecttile: //발사체 발사 SkillTables.ProjectTileInfo _projecttiledata = _LowDataMgr.GetSkillProjectTileData(_ability.callAbilityIdx); Vector3 dirVec = _Caster.transform.forward; if (_projecttiledata.startType == 3) { Transform[] temp = _Caster.GetComponentsInChildren <Transform>(true); for (int i = 0; i < temp.Length; i++) { if (temp[i] != null && temp[i].name.Equals("cast_dummy_01")) { Vector3 temp1 = _Caster.cachedTransform.position; Vector3 temp2 = temp[i].position; temp1.y = 0; temp2.y = 0; Vector3 temppos = temp1 - temp2; float distance = temppos.magnitude; dirVec = temppos / distance; break; } } } //< 발사체 생성 if (SceneManager.instance.IsRTNetwork && (_Caster.m_rUUID == NetData.instance._userInfo._charUUID)) { //발사체 생성 서버로 보내주자 NetworkClient.instance.SendPMsgBattleAddProjectTileC((int)_ability.Idx, _ability.notiIdx, (int)_ability.callAbilityIdx, _Caster.BeforePosX, _Caster.BeforePosY, _Caster.BeforePosX, _Caster.BeforePosY, 10f, 10f, dirVec); break; } else { _Caster.SpawnProjectile(_LowDataMgr.GetSkillProjectTileData(_ability.callAbilityIdx), (int)affectValue, _Caster.TeamID, dirVec, _Caster, _Target, _ability, 0, normal); break; } case SkillType.Buff: //< 버프 생성 //황비홍 프로젝트 - 버프일단 무시 if (_Target != null && _Target.BuffCtlr != null) { _Target.BuffCtlr.AttachBuff(_Caster, _Target, _Caster.SkillCtlr.__SkillGroupInfo.GetBuff(_ability.callBuffIdx, _ability.Idx), _ability.rate, _ability.durationTime); //< 주변적들에게 모두 넉백(자신에게 사용하는 버프만) if (_Target == _Caster) { List <Unit> targetList = GetTargetList(1, _Caster); SkillTables.ActionInfo _action = _LowDataMgr.GetSkillAction(_ability.Idx); float radius = (ushort)(_ability.radius + _action.range); for (int i = 0; i < targetList.Count; i++) { if (targetList[i] == null || targetList[i].IsDie) { continue; } if (!MathHelper.IsInRange((targetList[i].transform.position - _Caster.transform.position), radius, _Caster.Radius, targetList[i].Radius)) { continue; } targetList[i].SetPush(_ability.pushpower, _Caster.gameObject, 1); } } } break; case SkillType.Heal: //체력 회복 또는 감소 if (affectValue > 0 && _Target != null) { _Target.SetHp(_Caster, affectValue); } break; case SkillType.EffectSkill: //< 해당 적 위치에 이펙트 바로 호출하여 공격 //황비홍 프로젝트 - 이펙트 스킬 일단 무시 /* * if (_Target != null && _ability.targetEffect != "0") * { * //if (SimulationGameInfo.SimulationGameCheck) * // UnitSimulation.UseSkillNames.Add(_ability.targetEffect); * * _Target.SpawnEffect(_ability.targetEffect, 1, _Target.transform, null, false, (skillCastingEff) => * { * //< 사운드 실행 * if (_ability.targetSound > 0) * SoundHelper.PlaySfxSound(_ability.targetSound, 1.5f); * * //< 각도만 캐스터 방향으로 보정해준다 * skillCastingEff.transform.localRotation = _Caster.transform.localRotation; * * // 1. 이펙트 자식중에 충돌체가 있는지 찾도록 한다. * Collider[] existCol = skillCastingEff.GetComponentsInChildren<Collider>(true); * if (null != existCol) * { * for (int j = 0; j < existCol.Length; j++) * SetTriggerEvent(existCol[j], _Caster, affectValue, _ability); * } * * //< 이펙트에 듀플리케이트가 있을경우 연결해줌 * NcDuplicator _NcDuplicator = skillCastingEff.GetComponentInChildren<NcDuplicator>(); * if (_NcDuplicator != null) * { * _NcDuplicator._CallBack = (trn) => * { * Collider[] existCol2 = trn.gameObject.GetComponentsInChildren<Collider>(true); * if (null != existCol2) * { * for (int j = 0; j < existCol2.Length; j++) * SetTriggerEvent(existCol2[j], _Caster, affectValue, _ability); * } * }; * } * }, _Caster.Model.Main.transform.localScale.x); * } */ break; } }