Files
JJBB/Assets/Project/Script/GUI/SkillBar/SkillSelectUi.cs

184 lines
7.4 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
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<ObjManager>.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<ObjManager>.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();
}
}