效果图
遥感,分圆内圆外两种情况,在圆内遥感的位置等于鼠标位置,在圆外,遥感位置是在大圆边缘
(遥感位置=鼠标位置圆心位置的单位向量*相差半径+遥感初始位置)
角色旋转原理,人物z轴对用遥感y轴,形成一种映射。人物提供一个自身旋转转的方法,遥感可以计算出角度,得出角度之后把值付给人物,使人物旋转
代码我大部分都标记了,在这就不多解释了,自行看代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class EEasyTouch : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IDragHandler
{
public void OnBeginDrag(PointerEventData eventData)
{
//开始拖拽时显示
group.alpha = 1;
//结合我上一篇FSM框架的应用 很简单
StoneCtrl.Instance.ChangeStoneAnimation(StoneCtrl.StoneStates.StoneWalk);
}
public void OnDrag(PointerEventData eventData)
{
Vector2 deltaPos = eventData.position - orignPos;
float deltaDistance = Vector3.Distance(eventData.position, orignPos);
//遥感在大圆内
if (deltaDistance <= radius)
{
//圆内 遥感位置=鼠标位置
transform.position = eventData.position;
}
//在圆外
else
{
//圆外 遥感位置在大圆边上
//delta的单位向量*半径+圆心初始位置得出在大圆边境上的位置
transform.position = deltaPos.normalized * radius + orignPos;
}
//遥感xy轴对应 stone的xz 形成一种映射 使stone旋转
//求出弧度
//为什么要用tan-----去看三角函数曲线,tan对应的是一个值,sincos可能对应多个值
float tmpAngle = Mathf.Atan2(deltaPos.y, deltaPos.x);
tmpAngle = Mathf.Rad2Deg * tmpAngle;
//Debug.Log("tmpAngle====" + tmpAngle);
Vector3 tmpEuler = transform.localEulerAngles;
tmpEuler.z = tmpAngle;
//改变z值,使其旋转
transform.localEulerAngles = tmpEuler;
//外界提供Stone旋转方法
StoneCtrl.Instance.RotatePlayer(90 - tmpAngle);
}
public void OnEndDrag(PointerEventData eventData)
{
//结束拖拽隐藏遥感
group.alpha = 0;
//回归原位
transform.position = orignPos;
StoneCtrl.Instance.ChangeStoneAnimation(StoneCtrl.StoneStates.StoneIdle);
}
//大小
float smallSize;
float bigSize;
//活动半径
float radius;
//遥感初始位置
Vector2 orignPos;
CanvasGroup group;
private void Start()
{
group = GetComponent<CanvasGroup>();
//没有点击时 把遥感隐藏
group.alpha = 0;
smallSize = ((RectTransform)transform).sizeDelta.x * 0.5f;
bigSize = ((RectTransform)transform.parent).sizeDelta.x * 0.5f;
radius = bigSize - smallSize;
//记录初始位置
orignPos =transform.position;
}
}
StoneCtrl提供一个旋转自身方法
public void RotatePlayer(float angle)
{
Vector3 tmpAngle = transform.localEulerAngles;
tmpAngle.y = angle;
transform.localEulerAngles = tmpAngle;
}