首页 >> 大全

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

2023-12-17 大全 25 作者:考证青年

效果图

遥感,分圆内圆外两种情况,在圆内遥感的位置等于鼠标位置,在圆外,遥感位置是在大圆边缘

(遥感位置=鼠标位置圆心位置的单位向量*相差半径+遥感初始位置)

角色旋转原理,人物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;}

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了