/// <summary> /// 初始化 /// </summary> /// <param name="attacker">攻击者数据</param> /// <param name="effectKey">子弹预设key(或path)</param> /// <param name="releasePos">子弹飞行起点</param> /// <param name="targetObj">子弹目标单位</param> /// <param name="scopeRaduis">范围半径</param> /// <param name="speed">子弹飞行速度</param> /// <param name="durTime">范围特效持续时间</param> /// <param name="taType">子弹飞行轨迹</param> /// <param name="callback">攻击结束回调</param> /// <param name="callbackForEveryOne">每个单位被击回调</param> public PointToObjScopeGeneralAttack(PositionObject attacker, string[] effectKey, Vector3 releasePos, GameObject targetObj, float scopeRaduis, float speed, float durTime, TrajectoryAlgorithmType taType, Action callback, Action <GameObject> callbackForEveryOne = null) { if (attacker == null) { //throw new Exception("攻击者集群数据为空"); return; } var key1 = effectKey[0]; var key2 = effectKey[1]; // 范围伤害 Action scopeDemage = () => { var positionScopeAttack = new PositionScopeGeneralAttack(attacker, key2, targetObj.transform.position, scopeRaduis, durTime, callback, callbackForEveryOne); positionScopeAttack.Begin(); }; var effectData = attacker.AllData.EffectData; var muzzleEffect = effectData.MuzzleFlashEffect; var muzzleDurTime = effectData.MuzzleFlashEffectTime; if (muzzleDurTime > 0) { // 对每个单位播受击特效 var muzzleAngle = Utils.GetAngleWithZ(attacker.MapCellObj.transform.forward); // TODO 使用挂点 EffectsFactory.Single.CreatePointEffect(muzzleEffect, ParentManager.Single.GetParent(ParentManager.BallisticParent).transform, attacker.MapCellObj.transform.position, new Vector3(1, 1, 1), muzzleDurTime, 0, null, Utils.EffectLayer, new Vector2(0, muzzleAngle)).Begin(); } // 飞行轨迹 effect = EffectsFactory.Single.CreatePointToObjEffect(key1, ParentManager.Single.GetParent(ParentManager.BallisticParent).transform, releasePos, targetObj, new Vector3(1, 1, 1), speed, taType, scopeDemage, Utils.EffectLayer); }
/// <summary> /// 创建连线特效 /// </summary> /// <param name="effectKey">特效Key</param> /// <param name="parent">特效父级</param> /// <param name="receiveObj">结束对象</param> /// <param name="durTime">持续时间</param> /// <param name="completeCallback">结束回调</param> /// <param name="effectLayer">特效渲染层级</param> /// <returns></returns> public EffectBehaviorAbstract CreateLinerEffect(string effectKey, Transform parent, GameObject receiveObj, float durTime, Action completeCallback = null, int effectLayer = 0) { EffectBehaviorAbstract result = null; result = new LinerEffect(effectKey, parent, receiveObj, durTime, completeCallback, effectLayer); return(result); }
/// <summary> /// 创建点对点特效 /// 特效会从start按照速度与轨迹飞到目标对象位置 /// </summary> /// <returns>特效对象</returns> public EffectBehaviorAbstract CreatePointToObjEffect(string effectKey, Transform parent, Vector3 position, GameObject targetObj, Vector3 scale, float speed, TrajectoryAlgorithmType flytype = TrajectoryAlgorithmType.Line, Action completeCallback = null, int effectLayer = 0) { EffectBehaviorAbstract result = null; result = new PointToTargetEffect(effectKey, parent, position, targetObj, scale, speed, flytype, completeCallback, effectLayer); return(result); }
/// <summary> /// 生成行为节点 /// </summary> /// <param name="paramsPacker">数据包装类</param> /// <returns>行为节点</returns> public override IFormula GetFormula(FormulaParamsPacker paramsPacker) { if (paramsPacker == null) { return(null); } // 替换替换符数据 ReplaceData(paramsPacker); // 数据本地化 var myFormulaType = FormulaType; var myReleasePos = ReleasePos; var myReceivePos = ReceivePos; IFormula result = null; result = new Formula((callback, scope) => { // 获取目标位置 var sourcePos = GetPosByType(myReleasePos, paramsPacker, scope); var targetPos = GetPosByType(myReceivePos, paramsPacker, scope); EffectBehaviorAbstract effect = null; if (ReceivePos == 3) { effect = EffectsFactory.Single.CreateLinerEffect(EffectKey, // TODO 应该使用挂点 paramsPacker.ReleaseMember.ClusterData.transform , paramsPacker.ReceiverMenber.ClusterData.gameObject , DurTime, callback, Utils.EffectLayer); } else { effect = EffectsFactory.Single.CreateLinerEffect(EffectKey, ParentManager.Instance().GetParent(ParentManager.BallisticParent).transform, sourcePos, targetPos, DurTime, callback, Utils.EffectLayer); } effect.Begin(); }, myFormulaType); return(result); }
/// <summary> /// 创建点特效 /// 特效只在一个位置上 /// </summary> /// <param name="effectKey"></param> /// <param name="parent"></param> /// <param name="position"></param> /// <param name="scale"></param> /// <param name="durTime"></param> /// <param name="speed"></param> /// <param name="completeCallback">完成回调</param> /// <param name="effectLayer">特效所在渲染层</param> /// <param name="rotate">x,y旋转量</param> /// <returns>特效对象</returns> public EffectBehaviorAbstract CreatePointEffect(string effectKey, Transform parent, Vector3 position, Vector3 scale, float durTime, float speed, Action completeCallback = null, int effectLayer = 0, Vector2 rotate = new Vector2()) { EffectBehaviorAbstract result = null; result = new PointEffect(effectKey, parent, position, scale, durTime, speed, completeCallback, effectLayer, rotate); return(result); }
/// <summary> /// /// </summary> /// <param name="attacker">攻击者数据</param> /// <param name="beAttackMember">被攻击者数据</param> /// <param name="effectKey">子弹预设key(或path)</param> /// <param name="releasePos">子弹飞行起点</param> /// <param name="targetObj">子弹目标单位</param> /// <param name="speed">子弹飞行速度</param> /// <param name="taType">子弹飞行轨迹</param> /// <param name="callback">攻击结束回调</param> public NormalGeneralAttack(PositionObject attacker, PositionObject beAttackMember, string effectKey, Vector3 releasePos, GameObject targetObj, float speed, TrajectoryAlgorithmType taType, Action <GameObject> callback) { if (attacker == null || beAttackMember == null) { //throw new Exception("被攻击者或攻击者数据为空"); return; } // 特效数据 var effectData = beAttackMember.AllData.EffectData; Action demage = () => { //var attackerDisplayOwner = FightUnitManager.Single.GetElementByPositionObject(attacker); //var beAttackerDisplayOwner = FightUnitManager.Single.GetElementByPositionObject(beAttackMember); //if (beAttackerDisplayOwner == null // || attackerDisplayOwner == null // || null == beAttackerDisplayOwner.ClusterData) //{ // return; //} // 判断是否命中 //var isMiss = HurtResult.AdjustIsMiss(attackerDisplayOwner, beAttackerDisplayOwner); //if (!isMiss) //{ // // 计算伤害 // // TODO 伤害计算加入Buff与技能的计算 // //var hurt = HurtResult.GetHurt(attackerDisplayOwner, beAttackerDisplayOwner); // //// 记录被击触发 记录扣血 伤害结算时结算 // //SkillManager.Single.SetTriggerData(new TriggerData() // //{ // // HealthChangeValue = hurt, // // ReceiveMember = attackerDisplayOwner, // // ReleaseMember = beAttackerDisplayOwner, // // TypeLevel1 = TriggerLevel1.Fight, // // TypeLevel2 = TriggerLevel2.BeAttack, // // DemageType = DemageType.NormalAttackDemage, // // IsCrit = HurtResult.IsCrit // //}); // //// 命中时检测技能 // //SkillManager.Single.SetTriggerData(new TriggerData() // //{ // // // 将造成的伤害带回 // // HealthChangeValue = hurt, // // ReceiveMember = beAttackerDisplayOwner, // // ReleaseMember = attackerDisplayOwner, // // TypeLevel1 = TriggerLevel1.Fight, // // TypeLevel2 = TriggerLevel2.Hit, // // DemageType = DemageType.NormalAttackDemage // //}); // var getHitEffect = effectData.GetHitByBulletEffect; // var getHitDurTime = 0f; // // 分辨特效类型 // switch (effectData.BulletType) // { // case 1: // getHitEffect = effectData.GetHitByBulletEffect; // getHitDurTime = effectData.GetHitByBulletEffectTime; // break; // case 2: // getHitEffect = effectData.GetHitByBombEffect; // getHitDurTime = effectData.GetHitByBombEffectTime; // break; // } // if (getHitDurTime > 0) // { // // 对每个单位播受击特效 // // 计算旋转角度 // var beAttackAngle = Utils.GetAngleWithZ(attacker.MapCellObj.gameObject.transform.forward) + 180; // // TODO 使用挂点 // EffectsFactory.Single.CreatePointEffect(getHitEffect, // ParentManager.Single.GetParent(ParentManager.BallisticParent).transform, // beAttackMember.MapCellObj.transform.position, // new Vector3(1, 1, 1), // getHitDurTime, // 0, // null, // Utils.EffectLayer, // new Vector2(0, beAttackAngle)).Begin(); // } //} //else //{ // //// 闪避时事件 // //SkillManager.Single.SetTriggerData(new TriggerData() // //{ // // ReceiveMember = attackerDisplayOwner, // // ReleaseMember = beAttackerDisplayOwner, // // TypeLevel1 = TriggerLevel1.Fight, // // TypeLevel2 = TriggerLevel2.Dodge // //}); // //var beAttackVOBase = beAttackerDisplayOwner.ClusterData.AllData.MemberData; // // 抛出miss事件 // //FightManager.Single.DoHealthChangeAction(beAttackerDisplayOwner.GameObj, beAttackVOBase.TotalHp, // // beAttackVOBase.CurrentHP, 0f, FightManager.HurtType.Miss, beAttackVOBase.ObjID.ObjType); //} }; // 枪口火焰 var muzzleEffect = effectData.MuzzleFlashEffect; var muzzleDurTime = effectData.MuzzleFlashEffectTime; if (muzzleDurTime > 0) { // 对每个单位播枪口火焰特效 // 计算角度 var muzzleAngle = Utils.GetAngleWithZ(attacker.MapCellObj.transform.forward); // TODO 使用挂点 EffectsFactory.Single.CreatePointEffect(muzzleEffect, ParentManager.Single.GetParent(ParentManager.BallisticParent).transform, attacker.MapCellObj.transform.position, new Vector3(1, 1, 1), muzzleDurTime, 0, null, Utils.EffectLayer, new Vector2(0, muzzleAngle)).Begin(); } Action action = () => { if (callback != null && beAttackMember != null) { callback(beAttackMember.MapCellObj); } }; effect = EffectsFactory.Single.CreatePointToObjEffect(effectKey, ParentManager.Single.GetParent(ParentManager.BallisticParent).transform, releasePos, targetObj, new Vector3(1, 1, 1), speed, taType, demage + action, Utils.EffectLayer); }