public override void Update() { if (Input.GetKeyDown(KeyCode.Q)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputAbilitys[KeyCode.Q] as SkillAbility; EnterPreview(); } if (Input.GetKeyDown(KeyCode.W)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputAbilitys[KeyCode.W] as SkillAbility; EnterPreview(); } if (Input.GetKeyDown(KeyCode.E)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputAbilitys[KeyCode.E] as SkillAbility; EnterPreview(); } if (Input.GetMouseButtonDown((int)UnityEngine.UIElements.MouseButton.RightMouse)) { CancelPreview(); } if (Previewing) { } }
public virtual void UseSkill(ushort abilityIndex, bool normal) { //< 내 스킬의 어빌리티 인지 검증(평타일경우 스킬인덱스는 0이므로, +1을 안시켜줌) //if (!normal) // _slot = (uint)(slot + 1); //if (!SkillCtr._SkillGroupInfo.GetAbilityContainsKey(_slot, abilityIndex)) // return; //< 스킬 사용 //List<SkillTablesLowData.AbilityInfo> skillList = null; //if (normal) // skillList = SkillCtr._SkillGroupInfo.GetAbility(_slot, abilityIndex); //else /* * if(Caster.UnitType == UnitType.Unit) * { * byte temp = (Caster as Pc).syncData.SkillData[_slot]._SkillLevel; * skillList = SkillCtr._SkillGroupInfo.GetAbility(_slot, abilityIndex, (uint)temp); * } * else * { * skillList = SkillCtr._SkillGroupInfo.GetAbility(_slot, abilityIndex, null ); * } */ //skillList = SkillCtr._SkillGroupInfo.GetAbility(_slot, abilityIndex, Caster.UnitType == UnitType.Unit ? (Caster as Pc).syncData.SkillLvDatas : null); //skillList = SkillCtr._SkillGroupInfo.GetAbility(_slot, abilityIndex, Caster.UnitType == UnitType.Unit ? (Caster as Pc).syncData.SkillLvDatas : null); //< 플레이어에 리더라면 화면에 띄워줌 //if (!normal && Caster.UnitType == UnitType.Unit && Caster.isLeader) //{ //LocaleLowData.DataInfo localeName = LowDataMgr.GetLocale(GetSkillActionInfo().name); //LocaleLowData.DataInfo localedesc = LowDataMgr.GetLocale(skillList[0].skillDec); //if (localeName != null && localedesc != null) //{ ////스킬사용시 해당 스킬의 설명과 아이콘에 관한 정보를 HUD로 전달 ////EventListner.instance.TriggerEvent("HUD_MSG", string.Format("{0}\n{1}", localeName.title, localedesc.title)); ////EventListner.instance.TriggerEvent("HUD_MSG_ICON", GetSkillActionInfo().icon); //} //} //for (int i = 0; i < skillList.Count; i++) //SkillAbility.ActiveSkill(SkillCtr.__SkillGroupInfo.AbilityDic[_slot][abilityIndex], Caster, true); AbilityData ability = SkillCtr.__SkillGroupInfo.GetAbility(GetSkillActionInfo().idx, (uint)abilityIndex); if (ability != null) { SkillAbility.ActiveSkill(ability, Caster, normal); } else { Debug.Log(string.Format("AbilityNotFound:skillIdx:{0},AbilityIdx:{1}", GetSkillActionInfo().idx, abilityIndex)); } }
public void SpellSkill() { PreProcess(); if (SkillExecution == null) { SkillAbility.ApplyAbilityEffectsTo(Target); } else { Hero.Instance.StopMove(); if (SkillExecution.InputCombatEntity != null) { Hero.Instance.transform.GetChild(0).LookAt(SkillExecution.InputCombatEntity.Position); } else if (SkillExecution.InputPoint != null) { Hero.Instance.transform.GetChild(0).LookAt(SkillExecution.InputPoint); } else { Hero.Instance.transform.GetChild(0).localEulerAngles = new Vector3(0, SkillExecution.InputDirection, 0); } SkillExecution.BeginExecute(); } PostProcess(); }
public void OnLock() { foreach (var item in EntityChannels) { SkillAbility.ApplyEffectTo(item.Key, SkillAbility.SkillConfig.Effects[0]); SkillAbility.ApplyEffectTo(item.Key, SkillAbility.SkillConfig.Effects[1]); } EndExecute(); }
public void OnLock() { #if !EGAMEPLAY_EXCEL foreach (var item in EntityChannels) { SkillAbility.ApplyEffectTo(item.Key, SkillAbility.SkillConfig.Effects[0]); SkillAbility.ApplyEffectTo(item.Key, SkillAbility.SkillConfig.Effects[1]); } #endif EndExecute(); }
public void SpellSkill() { PreProcess(); if (SkillAbilityExecution == null) { SkillAbility.ApplyAbilityEffectsTo(Target); } else { SkillAbilityExecution.BeginExecute(); } PostProcess(); }
public override void Update() { if (Input.GetKeyDown(KeyCode.Q)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputSkills[KeyCode.Q]; EnterPreview(); } if (Input.GetKeyDown(KeyCode.W)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputSkills[KeyCode.W]; EnterPreview(); } if (Input.GetKeyDown(KeyCode.E)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputSkills[KeyCode.E]; EnterPreview(); } #if !EGAMEPLAY_EXCEL if (Input.GetKeyDown(KeyCode.R)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputSkills[KeyCode.R]; EnterPreview(); } if (Input.GetKeyDown(KeyCode.T)) { UnityEngine.Cursor.visible = false; PreviewingSkill = GetEntity <CombatEntity>().InputSkills[KeyCode.T]; EnterPreview(); } if (Input.GetKeyDown(KeyCode.Y)) { PreviewingSkill = GetEntity <CombatEntity>().InputSkills[KeyCode.Y]; OnInputTarget(PreviewingSkill.OwnerEntity); //EnterPreview(); } #endif if (Input.GetMouseButtonDown((int)UnityEngine.UIElements.MouseButton.RightMouse)) { CancelPreview(); } if (Previewing) { } }
public override void BeginExecute() { var channelPrefab = SkillExecutionAsset.transform.Find("Channel"); for (int i = SkillTargets.Count - 1; i >= 0; i--) { var item = SkillTargets[i]; var channel = GameObject.Instantiate(channelPrefab); var lineRenderer = channel.GetComponent <LineRenderer>(); lineRenderer.SetPosition(1, item.Position); EntityChannels.Add(item, lineRenderer); } foreach (var item in EntityChannels) { SkillAbility.ApplyEffectTo(item.Key, SkillAbility.SkillConfig.Effects[2]); } }
public void SpellSkill() { PreProcess(); if (SkillExecution == null) { SkillAbility.ApplyAbilityEffectsTo(Target); PostProcess(); ApplyAction(); } else { if (SkillTargets.Count > 0) { SkillExecution.SkillTargets.AddRange(SkillTargets); } SkillExecution.BeginExecute(); AddComponent <UpdateComponent>(); } }
//< 버프 적용 void AffectBuff(float affectValue, System.Action <bool> _callback) { //< 스턴일경우에는 체크 if ((BuffType)buffInfo.buffType == BuffType.Stun) { //< 상대가 푸쉬 상태라면 대기하고있음 //if (Target.FSM.Current_State == UnitState.Push) //{ //Caster.StartCoroutine(PushReadyUpdate(() => //{ //_callback(SkillAbility.BuffApplySkill(true, buffInfo, Caster, Target, affectValue, this)); //})); //} //else _callback(SkillAbility.BuffApplySkill(true, buffInfo, Caster, Target, affectValue, this)); } else { _callback(SkillAbility.BuffApplySkill(true, buffInfo, Caster, Target, affectValue, this)); } }
// Start is called before the first frame update void Start() { Instance = this; CombatEntity = EntityFactory.Create <CombatEntity>(); CombatEntity.AddComponent <SkillPreviewComponent>(); //CombatEntity.GetComponent<MotionComponent>().Enable = false; SkillConfigObject config = Resources.Load <SkillConfigObject>("SkillConfigs/Skill_1001_黑火球术"); SkillAbility abilityA = CombatEntity.AttachSkill <Skill1001Entity>(config); CombatEntity.BindSkillInput(abilityA, KeyCode.Q); config = Resources.Load <SkillConfigObject>("SkillConfigs/Skill_1002_炎爆"); abilityA = CombatEntity.AttachSkill <Skill1002Entity>(config); CombatEntity.BindSkillInput(abilityA, KeyCode.W); config = Resources.Load <SkillConfigObject>("SkillConfigs/Skill_1004_血红激光炮"); abilityA = CombatEntity.AttachSkill <Skill1004Ability>(config); CombatEntity.BindSkillInput(abilityA, KeyCode.E); AnimTimer.MaxTime = AnimTime; }
/// 스킬 이펙트에 존재하는 충돌체의 TriggerEnter에 연결되어 액션을 수행할 함수 void FireToTarget(Unit _Target, ForwardTriggerEvent _TriggerEvent) { //황비홍 프로젝트 - 발사체 적용중 //if (!EffectCallAbility) // return; if (null != _Target) { for (int i = 0; i < _TriggerEvent.SkillAbilityLists.Count; i++) { if (SceneManager.instance.IsRTNetwork) { if (parent.IsLeader || (parent.IsPartner == true && parent.TeamID == G_GameInfo.PlayerController.Leader.TeamID)) { System.Collections.Generic.List <ulong> a_list = new System.Collections.Generic.List <ulong>(); a_list.Add(_Target.m_rUUID); if (a_list.Count <= 0) { a_list.Add(ulong.MaxValue); } //iFunClient.instance.ReqDamage(parent.m_rUUID, _LowDataMgr.GetSkillAction(_TriggerEvent.SkillAbilityLists[i].Idx).idx, _TriggerEvent.SkillAbilityLists[i].notiIdx, parent.transform.position, parent.transform.eulerAngles.y, a_list); //--> 피격 대상인 놈들을 모두 찾는다. } } else { //< 공격 SkillAbility.ApplySkill(SkillType.Attack, _TriggerEvent.SkillAbilityLists[i], parent, _Target, true); /* * //< 버프 호출이있을시 버프호출 * if (_TriggerEvent.SkillAbilityLists[i].callBuffIdx != 0 && _Target.BuffCtlr != null) * _Target.BuffCtlr.AttachBuff(parent, _Target, parent.SkillCtlr.__SkillGroupInfo.GetBuff(_TriggerEvent.SkillAbilityLists[i].callBuffIdx, _TriggerEvent.SkillAbilityLists[i].Idx), _TriggerEvent.SkillAbilityLists[i]); */ } } } }
//< 버프를 완전히 제거 한다. public void DetachBuff() { Live = false; //< 적용된 능력 제거 SkillAbility.BuffApplySkill(false, buffInfo, Caster, Target, affectedValue, this); DeleteUnit(); //< 버프컨트롤러에서 삭제 controller.DetachBuff(this); //< 이펙트가 있을시 삭제 SetEffect(false); //< 무적관련 버프일경우에는 남아있는 무적 버프가있을시 이펙트를 켜준다. switch ((BuffType)buffInfo.buffType) { case BuffType.AllImmune: case BuffType.AttackImmune: case BuffType.SkillImmune: controller.SetImmuneEffect(true); break; } }
public void BindSkillInput(SkillAbility abilityEntity, KeyCode keyCode) { InputSkills.Add(keyCode, abilityEntity); abilityEntity.TryActivateAbility(); }
/// 이미 스킬애니메이션은 시작됐고, 실제 스킬 데이터가 적용되어야 하는 시점에 불리는 함수. public void SkillUse(int verifyId) { if (MyUnit == null) { return; } if (MyUnit.CurrentState == UnitState.Dying || MyUnit.CurrentState == UnitState.Dead || MyUnit.CharInfo.Hp <= 0) { return; } if (callBack != null) { callBack(verifyId); } if (!SceneManager.instance.IsRTNetwork || (SceneManager.instance.IsRTNetwork && (MyUnit.m_rUUID == NetData.instance._userInfo._charUUID))) { if (MyUnit.CurrentState == UnitState.Attack || MyUnit.CurrentState == UnitState.ManualAttack) { AbilityData ability = MyUnit.SkillCtlr.__SkillGroupInfo.GetAbility(MyUnit.UseSkillIdx, (uint)verifyId); if (ability != null) { SkillAbility.ActiveSkill(ability, MyUnit, true); } else { Debug.Log("Notfound AbilityData : " + MyUnit.UseSkillIdx + ", " + verifyId); } //MyUnit.StartSkill((uint)verifyId, true); } else if (MyUnit.CurrentState == UnitState.Skill) { AbilityData ability = MyUnit.SkillCtlr.__SkillGroupInfo.GetAbility(MyUnit.UseSkillIdx, (uint)verifyId); if (ability != null) { SkillAbility.ActiveSkill(ability, MyUnit, false); } else { Debug.Log("Notfound AbilityData : " + MyUnit.UseSkillIdx + ", " + verifyId); } //MyUnit.StartSkill((uint)verifyId, false); } } Sw.PMsgRoleAttackRecvS attackData = MyUnit.DamageDequeue(); if (attackData != null) { //표시할 데이터가 있으면 일단 그냥 표시 for (int i = 0; i < attackData.CInfo.Count; i++) { Unit target = null; Unit attacker = null; if (attackData.CInfo[i].UnTargetType == (int)Sw.ROLE_TYPE.ROLE_TYPE_USER) { target = G_GameInfo.CharacterMgr.FindRoomUnit((ulong)attackData.CInfo[i].UllTargetId); } else if (attackData.CInfo[i].UnTargetType == (int)Sw.ROLE_TYPE.ROLE_TYPE_NPC) { target = G_GameInfo.CharacterMgr.FindRoomNPC((ulong)attackData.CInfo[i].UllTargetId); } if (attackData.UnAttackerType == (int)Sw.ROLE_TYPE.ROLE_TYPE_USER) { attacker = G_GameInfo.CharacterMgr.FindRoomUnit((ulong)attackData.UllAttackerId); } else if (attackData.UnAttackerType == (int)Sw.ROLE_TYPE.ROLE_TYPE_NPC) { attacker = G_GameInfo.CharacterMgr.FindRoomNPC((ulong)attackData.UllAttackerId); } if (attacker != null) { attacker.CharInfo.SuperArmor = (uint)attackData.UnSuperArmor; } if (target != null) { if (attackData.CInfo[i].UnDodge == 1) { //회피 if (G_GameInfo.GameInfo.BoardPanel != null) { G_GameInfo.GameInfo.BoardPanel.ShowBuff(target.gameObject, target.gameObject, _LowDataMgr.instance.GetStringCommon(21)); } } else if (attackData.CInfo[i].UnCritical == 1) { if (NetData.instance._userInfo._charUUID == (ulong)attackData.CInfo[i].UllTargetId) { //해당유닛이 내유닛이다. target.ShowDamagedFx(target, (int)attackData.CInfo[i].UnDamage, true, true, false, eDamResistType.None); } else { //아니다 target.ShowDamagedFx(target, (int)attackData.CInfo[i].UnDamage, false, true, false, eDamResistType.None); } target.StartFlickerFx(); target.CharInfo.Hp = attackData.CInfo[i].UnTargetHp; } else { if (NetData.instance._userInfo._charUUID == (ulong)attackData.CInfo[i].UllTargetId) { //해당유닛이 내유닛이다. target.ShowDamagedFx(target, (int)attackData.CInfo[i].UnDamage, true, false, false, eDamResistType.None); } else { target.ShowDamagedFx(target, (int)attackData.CInfo[i].UnDamage, false, false, false, eDamResistType.None); } target.StartFlickerFx(); target.CharInfo.Hp = attackData.CInfo[i].UnTargetHp; } target.CharInfo.SuperArmor = (uint)attackData.CInfo[i].UnTargetSuperArmor; } } } /* * if (MyUnit.CurrentState == UnitState.Attack || MyUnit.CurrentState == UnitState.ManualAttack) * { * //< 콤보 예외처리 * int combo = MyUnit.CurCombo; * if(MyUnit.CurrentState == UnitState.Attack || MyUnit.CurrentState == UnitState.ManualAttack) * { * if (MyUnit.CurCombo == 1) * combo = 1; * else if (MyUnit.CurCombo == 2) * combo = 2; * else if (MyUnit.CurCombo == 3) * combo = 3; * else if (MyUnit.CurCombo == 0) * combo = 4; * * //Debug.Log(string.Format("combo count:{0}, MyUnit.CurCombo:{1}", combo, MyUnit.CurCombo)); * } * * //< 스킬 시전 * //MyUnit.StartSkill(0, (uint)combo, true); * * //MyUnit.StartSkill(0, (uint)combo); * Debug.Log(string.Format("verifyId:{0}, MyUnit.UseSkillSlot:{1}", verifyId, MyUnit.UseSkillSlot)); * MyUnit.StartSkill((uint)verifyId, true); * } * else if (MyUnit.CurrentState == UnitState.Skill) * { * //< 스킬을 시전한다. * //Debug.Log("UseSkillSlot " + MyUnit.UseSkillSlot + " , verifyId " + verifyId); * MyUnit.StartSkill((uint)verifyId, false); * } */ }
//< 버프 추가 //public void AttachBuff(Unit caster, Unit target, SkillTables.BuffInfo _buffInfo, AbilityData _ability) public void AttachBuff(Unit caster, Unit target, SkillTables.BuffInfo _buffInfo, uint _BuffRate, float _BuffDuration) { if (_buffInfo == null) { return; } // LOGEX.LogEx("BuffController.AttachBuff()", LOGEX.LogType.NONE, LOGEX.ColorType.PURPLE); //< 일단 확률을 먼저 검사한다. ushort ran = (ushort)Random.Range(0, 10000); if ((ushort)ran > _BuffRate) { BuffInfoStringShow(caster, target, _buffInfo, "抵抗"); return; } //< 적용할 수치를 계산한다. //버프의 데미지율은 천분율이라 0.001곱하는데 이건좀... float affectValue; if (SceneManager.instance.IsRTNetwork) { affectValue = 1; } else { affectValue = SkillAbility.CalcAffectValue(_buffInfo, caster, target, 0.001f); } //< 같은 타입의 버프가 존재하는지 검사 bool accrue = false; for (int i = 0; i < BuffDic.Count; i++) { //< 같은 버프를 또 쓸경우 중첩됨 if (BuffDic[i].buffInfo.Indx == _buffInfo.Indx) { BuffDic[i].OnAttach(this, caster, target, _buffInfo, affectValue, (BuffDurationType)_buffInfo.buffAbility, _BuffDuration); accrue = true; break; } } //< 중첩되는 버프가 없다면 새로 만들어서 넣어줌 if (!accrue) { //< 새버프 생성 Buff newBuff = new Buff(); BuffDic.Add(newBuff); newBuff.OnAttach(this, caster, target, _buffInfo, affectValue, (BuffDurationType)_buffInfo.buffAbility, _BuffDuration); } if (AddBuffCallBack != null) { AddBuffCallBack(); } //< 게임패널에서 업데이트하기 위함 EventListner.instance.TriggerEvent("BuffUpdate"); }
// Start is called before the first frame update void Start() { Instance = this; CombatEntity = Entity.CreateWithParent <CombatEntity>(CombatContext.Instance); CombatEntity.AddComponent <SkillPreviewComponent>(); //CombatEntity.GetComponent<MotionComponent>().Enable = false; #if EGAMEPLAY_EXCEL var config = ConfigHelper.Get <SkillConfig>(1001); SkillAbility ability = CombatEntity.AttachSkill <SkillAbility>(config); CombatEntity.BindSkillInput(ability, KeyCode.Q); config = ConfigHelper.Get <SkillConfig>(1002); ability = CombatEntity.AttachSkill <SkillAbility>(config); CombatEntity.BindSkillInput(ability, KeyCode.W); config = ConfigHelper.Get <SkillConfig>(1004); ability = CombatEntity.AttachSkill <SkillAbility>(config); CombatEntity.BindSkillInput(ability, KeyCode.E); #else SkillConfigObject config = Resources.Load <SkillConfigObject>("SkillConfigs/Skill_1001_黑火球术"); SkillAbility ability = CombatEntity.AttachSkill <SkillAbility>(config); CombatEntity.BindSkillInput(ability, KeyCode.Q); config = Resources.Load <SkillConfigObject>("SkillConfigs/Skill_1002_炎爆"); ability = CombatEntity.AttachSkill <SkillAbility>(config); CombatEntity.BindSkillInput(ability, KeyCode.W); config = Resources.Load <SkillConfigObject>("SkillConfigs/Skill_1004_血红激光炮"); ability = CombatEntity.AttachSkill <SkillAbility>(config); CombatEntity.BindSkillInput(ability, KeyCode.E); config = Resources.Load <SkillConfigObject>("SkillConfigs/Skill_1005_火弹"); ability = CombatEntity.AttachSkill <SkillAbility>(config); CombatEntity.BindSkillInput(ability, KeyCode.R); #endif for (int i = InventoryPanelTrm.childCount; i > 0; i--) { GameObject.Destroy(InventoryPanelTrm.GetChild(i - 1).gameObject); } var allItemConfigs = ConfigHelper.GetAll <EquipmentConfig>(); foreach (var item in allItemConfigs) { var itemObj = GameObject.Instantiate(ItemPrefab); itemObj.transform.parent = InventoryPanelTrm; itemObj.transform.Find("Icon").GetComponent <UnityEngine.UI.Image>().sprite = Resources.Load <Sprite>($"Icons/{item.Value.Name}"); var text = itemObj.transform.Find("Text").GetComponent <UnityEngine.UI.Text>(); text.text = $"+{item.Value.Value}"; if (item.Value.Attribute == "AttackPower") { text.color = Color.red; } itemObj.GetComponent <UnityEngine.UI.Button>().onClick.AddListener(() => { if (EquipmentPanelTrm.childCount >= 4) { return; } var equipObj = GameObject.Instantiate(ItemPrefab); equipObj.transform.parent = EquipmentPanelTrm; equipObj.transform.Find("Icon").GetComponent <UnityEngine.UI.Image>().sprite = Resources.Load <Sprite>($"Icons/{item.Value.Name}"); var equipText = equipObj.transform.Find("Text").GetComponent <UnityEngine.UI.Text>(); equipText.text = $"+{item.Value.Value}"; if (item.Value.Attribute == "AttackPower") { equipText.color = Color.red; } var itemData = Entity.CreateWithParent <ItemData>(CombatEntity); equipObj.name = $"{itemData.Id}"; itemData.ConfigId = item.Value.Id; CombatEntity.AddItemData(itemData); equipObj.GetComponent <UnityEngine.UI.Button>().onClick.AddListener(() => { var id = long.Parse(equipObj.name); CombatEntity.RemoveItemData(id); GameObject.Destroy(equipObj); }); }); } AnimTimer.MaxTime = AnimTime; }