using Games.Scene; using Games.SkillModle; using GCGame; using GCGame.Table; using UnityEngine; using UnityEngine.EventSystems; // 注:暂时使用这个公用物体作为SkillButton同时按下的过滤器 // 如果玩家同时按下多个SkillButton,后触发的SkillButton将因为无法获得SkillSelect而被忽略 public class SkillSelectUi : MonoBehaviour { public Vector2 AttackPoint { get; private set; } private RectTransform _rectTransform; public RectTransform centerYellow; public RectTransform centerBackYellow; public RectTransform centerRed; public RectTransform centerBackRed; public RectTransform relaxArea; private bool _isEnterRelex; private RectTransform _centerObj; private RectTransform _centerBackObj; private int? _currentFingerId; private void Awake() { _rectTransform = (RectTransform) transform; } private void Start() { ChangeCircleObj(-1); } void ChangeCircleObj(int index) { if (index == -1) { _centerObj = null; _centerBackObj = null; centerRed.gameObject.SetActive(false); centerYellow.gameObject.SetActive(false); centerBackYellow.gameObject.SetActive(false); centerBackRed.gameObject.SetActive(false); relaxArea.gameObject.SetActive(false); } else { relaxArea.gameObject.SetActive(true); Vector3 pos = Vector3.zero; if (_centerObj != null) { pos = _centerObj.position; } _centerObj = (index == 1 ? centerYellow : centerRed); _centerObj.position = pos; if (_centerBackObj != null) pos = _centerBackObj.position; _centerBackObj = (index == 1 ? centerBackYellow : centerBackRed); _centerBackObj.position = pos; centerRed.gameObject.SetActive(index != 1); centerYellow.gameObject.SetActive(index == 1); centerBackYellow.gameObject.SetActive(index == 1); centerBackRed.gameObject.SetActive(index != 1); } } public bool StartSelect(PointerEventData eventData, RectTransform btnRect, OwnSkillData ownSkill) { var result = false; if (_currentFingerId == null) { _currentFingerId = eventData.pointerId; centerYellow.sizeDelta = btnRect.sizeDelta * 0.66f; centerRed.sizeDelta = btnRect.sizeDelta * 0.66f; centerBackRed.sizeDelta = btnRect.sizeDelta * 2; centerBackYellow.sizeDelta = btnRect.sizeDelta * 2; // 默认刚输入时不处于取消状态 _isEnterRelex = false; ChangeCircleObj(1); // 默认刚按下时使用自动搜索的目标,因此小球位置和实际技能位置可能不匹配 Vector3 pointVec = Utils.PositionToRectLocal(_rectTransform, eventData.position); _centerObj.localPosition = pointVec; _centerBackObj.position = btnRect.position; ReSetBackPos(btnRect); // 配置初始化的目标位置 var mainPlayer = Singleton.Instance.MainPlayer; var skillEx = ownSkill.ComboExTableFinal; if (skillEx.IsTargetGround()) { var target = mainPlayer.InitAttackTarget(skillEx); if (target != null) AttackPoint = (target.Position - mainPlayer.Position).RemoveY(); else { // 如果是陷阱,则默认位置为角色脚下,如果不是陷阱,则默认位置为角色正前方1米 var selector = skillEx.GetSkillSelector(); AttackPoint = selector.RangCenter > 0 ? Vector2.zero : mainPlayer.ObjTransform.forward.RemoveY(); } } else AttackPoint = Vector2.zero; GameManager.gameManager.ActiveScene.ShowSkillCircleEffect(skillEx, AttackPoint); result = true; } return result; } public void MoveSelect(PointerEventData eventData, Tab_SkillEx skillEx) { if (IsSameFinger(eventData.pointerId)) { // 先更新是否处于取消区域 var cancelVec = (Vector2)Utils.PositionToRectLocal(relaxArea, eventData.position); var isCancel = cancelVec.sqrMagnitude < (relaxArea.sizeDelta.x * 0.5f).ToSquare(); if (isCancel != _isEnterRelex) { _isEnterRelex = isCancel; ChangeCircleObj(_isEnterRelex ? 0 : 1); } // 更新摇杆位置 var pointVec = (Vector2)Utils.PositionToRectLocal(_centerBackObj, eventData.position); var radius = _centerBackObj.sizeDelta.x / 2; if (pointVec != Vector2.zero) pointVec = pointVec.normalized * Mathf.Min(radius, pointVec.magnitude); _centerObj.anchoredPosition = _centerBackObj.anchoredPosition + pointVec; // 只有对地面攻击技能需要更新攻击方向 if (skillEx.IsTargetGround()) { var mainPlayer = Singleton.Instance.MainPlayer; var cameraTrans = (SceneLogic.CameraController != null && SceneLogic.CameraController.MainCamera != null) ? SceneLogic.CameraController.MainCamera.transform : null; if (mainPlayer != null && cameraTrans != null) { var relativePos = pointVec / radius * skillEx.Radius; var x = Vector3.Cross(Vector3.up, cameraTrans.forward); var z = Vector3.Cross(x, Vector3.up); AttackPoint = relativePos.x * x.RemoveY().normalized + relativePos.y * z.RemoveY().normalized; } } GameManager.gameManager.ActiveScene.UpdateSkillCirclePos(AttackPoint, _isEnterRelex); } } public bool EndSelect(int pointerId) { var result = false; if (IsSameFinger(pointerId)) { result = !_isEnterRelex; ReSetFinger(); } return result; } void ReSetBackPos(RectTransform rect) { Vector3 pos = _centerBackObj.localPosition; var absX = _centerBackObj.localPosition.x / Mathf.Abs(_centerBackObj.localPosition.x); var absY = _centerBackObj.localPosition.y / Mathf.Abs(_centerBackObj.localPosition.y); if (Mathf.Abs(pos.x) + _centerBackObj.rect.width / 2 > _rectTransform.rect.width / 2) _centerBackObj.localPosition = new Vector3(_centerBackObj.localPosition.x - absX * rect.rect.width / 2, _centerBackObj.localPosition.y, _centerBackObj.localPosition.z); if (Mathf.Abs(pos.y) + _centerBackObj.rect.height / 2 > _rectTransform.rect.height / 2) _centerBackObj.localPosition = new Vector3(_centerBackObj.localPosition.x, _centerBackObj.localPosition.y - absY * rect.rect.height / 2, _centerBackObj.localPosition.z); } private bool IsSameFinger(int eventFingerId) { return _currentFingerId == eventFingerId; } void ReSetFinger() { _currentFingerId = null; ChangeCircleObj(-1); _isEnterRelex = false; GameManager.gameManager.ActiveScene.HideSkillCircleEffect(); } }