Unity 制作虚拟遥感操控人物旋转移动实现+案例 您所在的位置:网站首页 unity如何控制物体移动 Unity 制作虚拟遥感操控人物旋转移动实现+案例

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

2023-08-12 07:53| 来源: 网络整理| 查看: 265

效果图

在这里插入图片描述 遥感,分圆内圆外两种情况,在圆内遥感的位置等于鼠标位置,在圆外,遥感位置是在大圆边缘 (遥感位置=鼠标位置圆心位置的单位向量*相差半径+遥感初始位置)在这里插入图片描述

角色旋转原理,人物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 //圆外 遥感位置在大圆边上 //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; } }

StoneCtrl提供一个旋转自身方法

public void RotatePlayer(float angle) { Vector3 tmpAngle = transform.localEulerAngles; tmpAngle.y = angle; transform.localEulerAngles = tmpAngle; }


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有