184 lines
7.4 KiB
C#
184 lines
7.4 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|