void OnSetChaClass(params object[] param) { excel_cha_class chaClass = param[0] as excel_cha_class; if (chaClass == null) { return; } if (btnTriggers == null) { return; } for (int i = 0; i < chaClass.skillIDs.Length && i < btnTriggers.Length; ++i) { int skillID = chaClass.skillIDs[i]; excel_skill_list skillList = excel_skill_list.Find(skillID); if (skillList == null) { Debug.LogError("UIFight技能初始化失败,未找到ID为" + skillID + "的技能数据"); continue; } EventTriggerListener listener = btnTriggers[i]; GameObject go = listener.gameObject; SkillBtnData skillBtnData = new SkillBtnData(); Transform joystick = go.transform.Find("Joystick"); if (joystick != null) { skillBtnData.joystick = joystick.transform; } Transform joystickBG = go.transform.Find("Joystick_BG"); if (joystickBG != null) { skillBtnData.joystickBG = joystickBG.gameObject; } skillBtnData.btnImage = go.GetComponent <Image>(); skillBtnData.maxRadius = 64.0f; skillBtnData.opType = (SkillPreOpType)skillList.skillPreOpType; skillBtnData.opData1 = skillList.skillPreOpData1; skillBtnData.opData2 = skillList.skillPreOpData2; skillBtnData.skillID = skillID; skillDatas.Add(go, skillBtnData); listener.onDrag += OnSkillBtnDrag; listener.onPointerDown += OnSkillBtnPress; listener.onPointerUp += OnSkillBtnRelease; } }
// 技能图标拖拽中; private void OnSkillBtnDrag(GameObject btn) { SkillBtnData data = null; if (!skillDatas.TryGetValue(btn, out data)) { return; } if (data.opType != SkillPreOpType.TargetDirLine && data.opType != SkillPreOpType.TargetDirFan && data.opType != SkillPreOpType.TargetPos) { return; } Vector3 touchPos = GetPointPos(); Vector3 pos = data.joystick.position; pos.x = touchPos.x; pos.y = touchPos.y; Vector3 btnPos = btn.transform.position; Vector2 delta = new Vector2(pos.x - btnPos.x, pos.y - btnPos.y); float r = delta.magnitude; if (r >= data.maxRadius) { Vector2 dir2D = delta.normalized; Vector2 finalPos = dir2D * data.maxRadius; pos.x = btnPos.x + finalPos.x; pos.y = btnPos.y + finalPos.y; } data.joystick.position = pos; Player player = GameController.mMainPlayer; if (player == null) { return; } Quaternion rot = MobaMainCamera.MainCamera.transform.rotation; Vector3 dir = new Vector3(delta.x, 0.0f, delta.y); dir = rot * dir; dir.y = 0.0f; dir.Normalize(); if (data.opType == SkillPreOpType.TargetDirLine || data.opType == SkillPreOpType.TargetDirFan) { float dist = data.opData1 * 0.001f; Vector3 v = player.Position; v += dist * dir; if (data.warning != null) { data.warning.transform.forward = dir; } } else if (data.opType == SkillPreOpType.TargetPos) { float dist = data.opData1 * 0.001f; float t = r / data.maxRadius; t = Mathf.Clamp01(t); dist = dist * t; Vector3 v = player.Position; v += dist * dir; if (data.warning != null) { data.warning.transform.position = v; } } }
// 技能图标开始拖拽(放开); private void OnSkillBtnRelease(GameObject btn) { SkillBtnData data = null; if (!skillDatas.TryGetValue(btn, out data)) { return; } if (data.warning != null) { data.warning.Release(); } data.joystickBG.SetActive(false); data.btnImage.enabled = true; if (data.opType == SkillPreOpType.Click) { DoSkill(data.skillID, true, Vector3.zero); } if (data.opType != SkillPreOpType.TargetDirLine && data.opType != SkillPreOpType.TargetDirFan && data.opType != SkillPreOpType.TargetPos) { return; } data.joystick.gameObject.SetActive(false); Vector3 pos = data.joystick.position; Vector3 btnPos = btn.transform.position; Vector2 endPos = new Vector2(pos.x, pos.y); Vector3 delta = new Vector3(pos.x - btnPos.x, 0.0f, pos.y - btnPos.y); data.joystick.transform.localPosition = Vector3.zero; if (endPos == data.startPos) { return; } data.startPos = Vector2.zero; Player player = GameController.mMainPlayer; if (player == null) { return; } Quaternion rot = MobaMainCamera.MainCamera.transform.rotation; Vector3 dir = delta; dir = rot * dir; dir.y = 0.0f; dir.Normalize(); if (data.opType == SkillPreOpType.TargetDirLine || data.opType == SkillPreOpType.TargetDirFan) { float dist = data.opData1 * 0.001f; Vector3 v = player.Position; v += dist * dir; DoSkill(data.skillID, false, v); } else if (data.opType == SkillPreOpType.TargetPos) { float dist = data.opData1 * 0.001f; float r = delta.magnitude; float t = r / data.maxRadius; t = Mathf.Clamp01(t); Vector3 v = player.Position; dist = dist * t; v += dist * dir; DoSkill(data.skillID, false, v); } }
// 技能图标开始拖拽(按下); private void OnSkillBtnPress(GameObject btn) { SkillBtnData data = null; if (!skillDatas.TryGetValue(btn, out data)) { return; } data.btnImage.enabled = false; data.joystickBG.SetActive(true); if (data.opType != SkillPreOpType.TargetDirLine && data.opType != SkillPreOpType.TargetDirFan && data.opType != SkillPreOpType.TargetPos) { return; } data.joystick.gameObject.SetActive(true); Vector3 touchPos = GetPointPos(); data.joystick.position = touchPos; data.startPos = new Vector2(touchPos.x, touchPos.y); Player player = GameController.mMainPlayer; if (player == null) { return; } if (data.opType == SkillPreOpType.TargetDirLine) { float dist = data.opData1 * 0.001f; float width = data.opData2 * 0.001f; SkillWarning.CreateSkillWarning("GUI/SkillWarning/Prefabs/warning_line", SkillWarningType.PreOpRect, width, dist, -1.0f, player.Position, player.transform.rotation, true, player.transform, (o) => { o.NavLayer = player.NavLayer; data.warning = o; }); } else if (data.opType == SkillPreOpType.TargetDirFan) { float dist = data.opData1 * 0.001f; float angle = (float)data.opData2; SkillWarning.CreateSkillWarning("GUI/SkillWarning/Prefabs/warning_fan", SkillWarningType.PreOpFan, dist, angle, -1.0f, player.Position, player.transform.rotation, true, player.transform, (o) => { o.NavLayer = player.NavLayer; data.warning = o; }); } else if (data.opType == SkillPreOpType.TargetPos) { float radius = data.opData2 * 0.001f; SkillWarning.CreateSkillWarning("GUI/SkillWarning/Prefabs/warning_circle", SkillWarningType.PreOpCircle, radius, radius, -1.0f, player.Position, player.transform.rotation, true, player.transform, (o) => { o.NavLayer = player.NavLayer; data.warning = o; }); } }