Unity 制作虚拟遥感操控人物旋转移动实现+案例
效果图
遥感,分圆内圆外两种情况,在圆内遥感的位置等于鼠标位置,在圆外,遥感位置是在大圆边缘
(遥感位置=鼠标位置圆心位置的单位向量*相差半径+遥感初始位置)
角色旋转原理,人物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;}}
提供一个旋转自身方法
public void RotatePlayer(float angle){Vector3 tmpAngle = transform.localEulerAngles;tmpAngle.y = angle;transform.localEulerAngles = tmpAngle;}