public static void DoLoopEvent(SkillStage stage, int curTick) { excel_skill_stage stageInfo = stage.mStageInfo; if (stageInfo.events == null) { return; } for (int i = 0; i < stageInfo.events.Length; ++i) { int eventID = stageInfo.events[i]; excel_skill_event eventInfo = excel_skill_event.Find(eventID); if ((int)SkillEventTriggerType.Loop != eventInfo.triggerType) { continue; } if (!IsEventTrait(SkillEventTrait.Server, eventInfo)) { continue; } int tick = curTick - eventInfo.triggerParam1; if (tick >= 0 && eventInfo.triggerParam2 > 0 && tick % eventInfo.triggerParam2 == 0) { SkillEventRegister.SkillEventMethod e = null; SkillEventType type = (SkillEventType)eventInfo.eventType; if (!SkillEventRegister.events.TryGetValue(type, out e)) { continue; } e(stage.mSkillContext.mOwner, null, stage.mSkillContext, eventInfo); } } }
static void SkillMove(Character cha, ChildObject childObj, SkillContext context, excel_skill_event e) { if (cha == null) { return; } SkillMoveDataType type = (SkillMoveDataType)e.evnetParam1; if (type == SkillMoveDataType.MoveType1) { float time = (float)e.evnetParam2 * 0.001f; SkillMove skillMove = IAction.CreateAction <SkillMove>(); skillMove.Init1(cha, context.TargetPos, time); cha.AddAction(skillMove); } else if (type == SkillMoveDataType.MoveType2) { float time = (float)e.evnetParam2 * 0.001f; float speed = (float)e.evnetParam3 * 0.001f; Vector3 dir = context.TargetPos - cha.Position; SkillMove skillMove = IAction.CreateAction <SkillMove>(); skillMove.Init2(cha, dir, speed, time); cha.AddAction(skillMove); } context.SetSkillContextFlag(SkillContextFlag.SyncPosOnSkillEnd, true); }
public void DoLoopEvent() { if (mEvents == null) { return; } for (int i = 0; i < mEvents.Count; ++i) { excel_skill_event eventInfo = mEvents[i]; if (eventInfo.triggerType != (int)SkillEventTriggerType.Loop) { continue; } if (!IsServerEvent(eventInfo)) { continue; } int tick = mTick - eventInfo.triggerParam1; if (tick >= 0 && eventInfo.triggerParam2 > 0 && tick % eventInfo.triggerParam2 == 0) { SkillEventRegister.SkillEventMethod e = null; SkillEventType type = (SkillEventType)eventInfo.eventType; if (!SkillEventRegister.events.TryGetValue(type, out e)) { continue; } e(null, this, mContext, eventInfo); } } }
static void SkillMoveEvent(excel_skill_event e) { int[] values = Enum.GetValues(typeof(SkillMoveDataType)) as int[]; string[] texts = new string[values.Length]; for (int i = 0; i < values.Length; ++i) { SkillMoveDataType t = (SkillMoveDataType)values[i]; texts[i] = t.ToDescription(); } e.evnetParam1 = EditorGUILayout.IntPopup("移动类型", e.evnetParam1, texts, values); SkillMoveDataType moveType = (SkillMoveDataType)e.evnetParam1; if (moveType == SkillMoveDataType.MoveType1) { float time = (float)e.evnetParam2 * 0.001f; time = EditorGUILayout.FloatField("移动时间", time); e.evnetParam2 = (int)(time * 1000.0f); } else if (moveType == SkillMoveDataType.MoveType2) { float time = (float)e.evnetParam2 * 0.001f; time = EditorGUILayout.FloatField("移动时间(s)", time); e.evnetParam2 = (int)(time * 1000.0f); float speed = (float)e.evnetParam3 * 0.001f; speed = EditorGUILayout.FloatField("移动速度(m/s)", speed); e.evnetParam3 = (int)(speed * 1000.0f); } }
static void CreateChildObject(excel_skill_event e) { GUIContent c = new GUIContent("子物体ID", "child_object_list的ID"); e.evnetParam1 = EditorGUILayout.IntField(c, e.evnetParam1); bool multi = (e.evnetParam2 > 0); multi = EditorGUILayout.Toggle("发射多个子物体", multi); if (multi) { e.evnetParam3 = EditorGUILayout.IntField("子物体个数", e.evnetParam3); e.evnetParam4 = EditorGUILayout.IntField("间隔角度", e.evnetParam4); } Vector3 offset = new Vector3( (float)e.evnetParam5 * 0.001f, (float)e.evnetParam6 * 0.001f, (float)e.evnetParam7 * 0.001f ); offset = EditorGUILayout.Vector3Field("初始偏移位置", offset); e.evnetParam5 = (int)(offset.x * 1000.0f); e.evnetParam6 = (int)(offset.y * 1000.0f); e.evnetParam7 = (int)(offset.z * 1000.0f); }
static void PlayAnimation(excel_skill_event e) { GUIContent c = new GUIContent("动画ID", "anim_list的ID"); e.evnetParam1 = EditorGUILayout.IntField(c, e.evnetParam1); string[] traitTxts = new string[] { "循环播放", "逆向播放", "只播上身动画", "高优先级动画" }; e.evnetParam2 = MaskField("播动画特性", e.evnetParam2, traitTxts); e.evnetParam3 = EditorGUILayout.IntField("起始帧", e.evnetParam3); bool chgSpeed = e.evnetParam4 > 0; chgSpeed = EditorGUILayout.ToggleLeft("改变速度", chgSpeed); e.evnetParam4 = chgSpeed ? 1 : 0; if (chgSpeed) { c = new GUIContent("动画速度", "1.0是正常速度"); float speed = (float)e.evnetParam5 * 0.001f; speed = EditorGUILayout.FloatField(c, speed); e.evnetParam5 = (int)(speed * 1000.0f); } }
protected void Init(Transform parentObj) { mLifeStartTime = Time.ElapsedSeconds; mParentObj = parentObj; InitPos(parentObj); InitDir(); mTick = 0; mEvents = new List <excel_skill_event>(); for (int i = 0; i < mData.events.Length; ++i) { int evtID = mData.events[i]; excel_skill_event evt = excel_skill_event.Find(evtID); if (evt == null) { continue; } mEvents.Add(evt); } DoEvent(SkillEventTriggerType.StageBegin); Vector3 v = Position; v.y += ((float)mData.yOffset * 0.001f); Position = v; }
void DoEvent(SkillEventTriggerType triggerType, int param1 = -1, int param2 = -1) { if (mEvents == null) { return; } for (int i = 0; i < mEvents.Count; ++i) { excel_skill_event eventInfo = mEvents[i]; if (!IsServerEvent(eventInfo)) { continue; } if ((ushort)triggerType != eventInfo.triggerType) { continue; } if (param1 != -1 && param1 != eventInfo.triggerParam1) { continue; } if (param2 != -1 && param2 != eventInfo.triggerParam2) { continue; } SkillEventRegister.SkillEventMethod e = null; SkillEventType type = (SkillEventType)eventInfo.eventType; if (!SkillEventRegister.events.TryGetValue(type, out e)) { continue; } e(null, this, mContext, eventInfo); } }
bool IsServerEvent(excel_skill_event evt) { int exePort = (int)evt.trait; if ((exePort & (1 << (int)SkillEventTrait.Server)) != 0) { return(true); } return(false); }
public static bool IsEventTrait(SkillEventTrait trait, excel_skill_event eventInfo) { if (eventInfo == null) { return(false); } int flag = 1 << (int)trait; if ((eventInfo.trait & flag) != 0) { return(true); } return(false); }
public static void DoEvent(SkillStage stage, SkillEventTriggerType triggerType, int param1 = -1, int param2 = -1) { excel_skill_stage stageInfo = stage.mStageInfo; if (stageInfo.events == null) { return; } for (int i = 0; i < stageInfo.events.Length; ++i) { int eventID = stageInfo.events[i]; excel_skill_event eventInfo = excel_skill_event.Find(eventID); if ((int)triggerType != eventInfo.triggerType) { continue; } if (!IsEventTrait(SkillEventTrait.Server, eventInfo)) { continue; } if (param1 != -1 && param1 != eventInfo.triggerParam1) { continue; } if (param2 != -1 && param2 != eventInfo.triggerParam2) { continue; } SkillEventRegister.SkillEventMethod e = null; SkillEventType type = (SkillEventType)eventInfo.eventType; if (!SkillEventRegister.events.TryGetValue(type, out e)) { continue; } e(stage.Owner, null, stage.mSkillContext, eventInfo); } }
static void ResetTargePos(excel_skill_event e) { int[] values = Enum.GetValues(typeof(SkillSelectCharactorType)) as int[]; string[] texts = new string[values.Length]; for (int i = 0; i < values.Length; ++i) { SkillSelectCharactorType t = (SkillSelectCharactorType)values[i]; texts[i] = t.ToDescription(); } e.evnetParam1 = EditorGUILayout.IntPopup("目标", e.evnetParam1, texts, values); texts = new string[] { "技能施放者到目标的方向", "目标正前方" }; values = new int[] { 0, 1 }; e.evnetParam4 = EditorGUILayout.IntPopup("偏移朝向", e.evnetParam4, texts, values); e.evnetParam2 = EditorGUILayout.IntSlider("偏移朝向附加角度", e.evnetParam2, 0, 180); e.evnetParam3 = EditorGUILayout.IntSlider("偏移朝向附加角度随机范围", e.evnetParam3, 0, 180); float dist = (float)e.evnetParam5 * 0.001f; dist = EditorGUILayout.FloatField("偏移距离", dist); e.evnetParam5 = (int)(dist * 1000.0f); texts = new string[] { "无", "边界检测", "是否在导航上" }; values = new int[] { (int)TargetPosTestType.None, (int)TargetPosTestType.LineTest, (int)TargetPosTestType.TargetInNav }; e.evnetParam6 = EditorGUILayout.IntPopup("导航检测", e.evnetParam6, texts, values); }
static void TowardTargetPos(Character cha, ChildObject childObj, SkillContext context, excel_skill_event e) { Vector3 ownerPos = Vector3.zero; if (cha != null) { ownerPos = cha.Position; } //else if (childObject != null) // ownerPos = childObject.Position; else { return; } Vector3 dir = context.TargetPos - ownerPos; if (cha != null) { cha.Direction = dir; } //else if (childObject != null) // childObject.Direction = dir; }
static void PlayAnimation(Character cha, ChildObject childObject, SkillContext context, excel_skill_event e) { if (cha == null) { return; } int id = e.evnetParam1; int trait = e.evnetParam2; bool loop = ((trait & 0x1) != 0); bool reverse = ((trait & 0x2) != 0); bool onlyup = ((trait & 0x4) != 0); bool highPriority = ((trait & 0x8) != 0); float time = 0.03333f * (float)e.evnetParam3; float speed = 1.0f; if (e.evnetParam4 > 0) { speed = (float)e.evnetParam5 * 0.001f; } AnimPlayType animType = AnimPlayType.General; if (onlyup) { animType = AnimPlayType.Up; cha.PlayAnimation(id, animType, speed, loop, reverse, 0.0f, time); } else { if (highPriority) { cha.PlayPriorityAnimation(id, AnimPriority.Skill, speed, loop, reverse, 0.0f, time); } else { cha.PlayAnimation(id, AnimPlayType.General, speed, loop, reverse, 0.0f, time); } } context.mPlayingAnimations.Add(id); }
static void Hit(excel_skill_event e) { e.evnetParam1 = EditorGUILayout.IntField("判定ID", e.evnetParam1); }
static void Hit(Character cha, ChildObject childObj, SkillContext context, excel_skill_event e) { int hitID = e.evnetParam1; SkillHit.Hit(context.mOwner, hitID, context); }
static void CreateChildObject(Character cha, ChildObject childObject, SkillContext context, excel_skill_event e) { Vector3 offset = new Vector3( (float)e.evnetParam5 * 0.001f, (float)e.evnetParam6 * 0.001f, (float)e.evnetParam7 * 0.001f ); Transform t = null; if (cha != null) { t = cha.transform; } else if (childObject != null) { t = childObject.transform; } if (t == null) { return; } if (e.evnetParam2 == 0) { ChildObject co = ChildObject.CreateChildObject(e.evnetParam1, context, t); if (co == null) { Debug.LogError("子物体发射失败,技能事件ID: " + e.id + "; 子物体ID: " + e.evnetParam1); return; } co.Position += co.transform.forward * offset.z; co.Position += co.transform.right * offset.x; co.Position += co.transform.up * offset.y; // context.mChildObjects.Add(co); } else { int num = e.evnetParam3; if (num <= 1) { Debug.LogError("发射数量小于等于1,请修改事件为发射单个子物体,技能事件ID: " + e.id); } float angle = (float)e.evnetParam4; float div = (num <= 1 ? 0.0f : 1.0f / (float)(num - 1)); float half = (num <= 1 ? 0.0f : angle * 0.5f); float targetPosDist = (context.TargetPos - context.mOwner.Position).Length(); Vector3 origTargetPos = context.TargetPos; for (int i = 0; i < num; ++i) { float yaw = angle * (float)i * div - half; Quaternion q = Quaternion.AngleAxis(yaw, Vector3.up); Vector3 dir = q * context.mOwner.Direction; context.TargetPos = context.mOwner.Position + dir.normalize * targetPosDist; ChildObject co = ChildObject.CreateChildObject(e.evnetParam1, context, t); if (co == null) { Debug.LogError("子物体发射失败,技能事件ID: " + e.id + "; 子物体ID: " + e.evnetParam1); return; } co.transform.forward = q * co.transform.forward; co.Position += co.transform.forward * offset.z; co.Position += co.transform.right * offset.x; co.Position += co.transform.up * offset.y; // context.mChildObjects.Add(co); } } }
static void ResetTargePos(Character cha, ChildObject childObject, SkillContext context, excel_skill_event e) { SkillSelectCharactorType selType = (SkillSelectCharactorType)e.evnetParam1; Character selTarget = context.SelectCharactorByType(selType); if (selTarget == null) { return; } float fAngle = (float)e.evnetParam2; if (e.evnetParam3 > 0) { float fAngleR = (float)e.evnetParam3 * 2.0f; float fPct = UnityEngine.Random.Range(0.0f, 1.0f); fAngle += fPct * fAngleR - fAngleR; } Quaternion q = Quaternion.AngleAxis(fAngle, Vector3.up); Vector3 dir = selTarget.Direction; if (e.evnetParam4 > 0 && context.mOwner != selTarget) { dir = selTarget.Position - context.mOwner.Position; dir.y = 0.0f; dir.Normalize(); } dir = q * dir; float dist = (float)e.evnetParam5 * 0.001f; Vector3 targetPos = selTarget.Position + dir * dist; TargetPosTestType testType = (TargetPosTestType)e.evnetParam6; switch (testType) { case TargetPosTestType.None: break; case TargetPosTestType.LineTest: { uint layer = NavigationSystem.GetLayer(context.mOwner.Position); if (NavigationSystem.LineCast(context.mOwner.Position, targetPos, layer, out targetPos)) { break; } break; } case TargetPosTestType.TargetInNav: { if (!NavigationSystem.IsInNavigation(targetPos)) { targetPos = selTarget.Position; } break; } } context.TargetPos = targetPos; }