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();
|
||
}
|
||
} |