Unity 制作虚拟遥感操控人物旋转移动实现+案例

效果图
【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();//没有点击时 把遥感隐藏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;}