解决unity rotate旋转物体 限制物体旋转角度的大坑

今天可是遇到一个很简单的需求,但是却让我蛋疼了半天。

滑动屏幕控制物体旋转,但是旋转的角度要在-60到60之间。

乍一听这简直是小儿科啊。

判断一下角度不就行了。相比这四元数,欧拉角虽然有时会出现万向锁,但是简洁明了啊。

这不,我就中了一个简洁明了的大坑。

图中,如果你以为transform.eulerAngles =(-1,0,90)

那就大错特错了。

因为对于旋转来说。360度是一个循环。-1° 也可以算是就是359°

而且unity就是这样认为的。面板上虽然显示的是-1。但是他运行时是359。

这就让我的判断出了问题。

 if(angle>60)

 transform.eulerAngles = new Vector3(60, transform.eulerAngles.y, transform.eulerAngles.z);
 if(angle<-60)

 transform.eulerAngles = new Vector3(-60, transform.eulerAngles.y, transform.eulerAngles.z);

这样你就会发现 你的物体处并不受控制,有时候还会出现一种奇葩的状态。

因为当x的值小于0后,他又变回359了。这样又走到第一个if里面了。

那要怎么办呢。解决方法就是:你不是负数 我把你变成负数。

 public float CheckAngle(float value)
 {
 float angle = value - 180;

 if (angle > 0)
 return angle - 180;

 return angle + 180;
 }

通过这个方法,将他的角度在变回负数。

可以看到 图中 x的值是-26但是输出实际上是333。经过方法的转换才能成为显示的值。

这样就可以计算了。

2011年就有人提出这个问题了。在官方论坛下2016年还有回答。看来真是坑了不少人。

补充:Unity RotateAround固定旋转

当前显示的为本地坐标系

//旋转视野
void rotateVeiw()
{
float x=Input.GetAxis("Mouse X");
float y=Input.GetAxis("Mouse Y");
//函数参数(旋转点,旋转轴,旋转量)

旋转效果相当于旋转轴平移到旋转点上后 沿此轴旋转相应的量。

例上图,如果沿本地坐标的Y轴旋转 则会出现旋转偏移到地下的情况。

必须使用下式 沿世界坐标的y轴旋转

transform.RotateAround(plear.position,Vector3.up,x);

当单纯的左右旋转时,x轴都为固定的,所以没有区别。

但当左右移动后,本地坐标的x轴和世界坐标的x轴有出入。

例如:此时如果选用世界坐标x轴,则左右移动后的x轴还是固定的,左右移动移动一定的量后

世界就会开始倾斜:如下图所示:

所以此时我们应采用 本地坐标轴x

transform.RotateAround(plear.position, transform.right, y);
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Unity 实现给物体替换材质球

    下面先看一下效果图 using UnityEngine; using System.Collections; public class textMesh : MonoBehaviour { public Material meshRender = null; public Renderer rend; public Texture texture; void Start () { //把名字为bangongshi4 的材质球放到Resources文件夹下 meshRender = Resourc

  • Unity 如何获取鼠标停留位置下的物体

    根据UGUI的射线检测机制获取当前鼠标下的UI: /// <summary> /// 获取鼠标停留处UI /// </summary> /// <param name="canvas"></param> /// <returns></returns> public GameObject GetOverUI(GameObject canvas) { PointerEventData pointerEventData

  • Unity3d 使用Gizmos画一个圆圈

    Gizmos是场景视图里的一个可视化调试工具. 在做项目过程中.我们常常会用到它,比如:绘制一条射线等. Unity3D 4.2版本号截至.眼下仅仅提供了绘制射线,线段,网格球体,实体球体,网格立方体,实体立方体,图标.GUI纹理,以及摄像机线框. 假设须要绘制一个圆环还须要自己写代码 using UnityEngine; using System; public class HeGizmosCircle : MonoBehaviour { public Transform m_Transfor

  • unity 如何使用LineRenderer 动态划线

    我就废话不多说了,大家还是直接看代码吧~ private LineRenderer line1; //画线 line1 = this.gameObject.AddComponent<LineRenderer>(); //只有设置了材质 setColor才有作用 line1.material = new Material(Shader.Find("Particles/Additive")); line1.SetVertexCount(2);//设置两点 line1.SetCo

  • unity 实现摄像机绕某点旋转一周

    在Update函数中执行: if (turnAround) { playerCamera.RotateAround(transform.localPosition, transform.up, Time.deltaTime * rotateSpeed); degree += Time.deltaTime * rotateSpeed; if (degree >= 360) { turnAround = false; degree = 0; } } 补充:unity 摄像机围绕某个物体进行旋转放大缩

  • Unity解析gif动态图操作

    工作需求,要播放一张gif图片,又不想转成视频播放,就开始研究怎样解析gif,在网上也看了不少教程,最后根据自己需求写了个脚本. 首先,Unity是不支持gif的(至少我没找到方法),而又要在NGUI中显示gif图片.所以就想到了将gif解析成序列帧再去循环播放. 有人说可以找软件解析,然后导入Unity做动画,最终我没有采用,自己再Unity中以代码解析,然后播放的. 代码如下 (在Awake中解析的,因为要在其他脚本调用,实时解析的话,到时候会花费一会时间): using System.Co

  • Unity 通过LineRenderer绘制两点之间的直线操作

    我就废话不多说了,大家还是直接看代码吧~ private LineRenderer line; //画线 line = this.gameObject.AddComponent<LineRenderer>(); //只有设置了材质 setColor才有作用 line.material = new Material(Shader.Find("Particles/Additive")); line.SetVertexCount(2);//设置两点 line.SetColors(

  • unity AudioSource播放完声音后要执行的函数或条件操作

    将脚本挂在要判断声音是否播放完毕的物体上 using System.Collections; using UnityEngine; using UnityEngine.Events; [RequireComponent(typeof(AudioSource))] public class AudioManager : MonoBehaviour { public static AudioManager instence = null; private AudioSource _audio; vo

  • Unity之绕轴进行旋转的操作

    先上一张效果图 using UnityEngine; using System.Collections; public class TestRotateRound : MonoBehaviour { public GameObject Sphere; private float curtTime = 0.0f; void Update() { //使用C#封装好的代码RotateAround gameObject.transform.RotateAround(Sphere.transform.p

  • Unity3D实现播放gif图功能

    Unity是不识别Gif格式图的,需要我们使用c#将gif里多帧图转化为Texture2D格式.需要使用System.Drawing.dll.此dll在unity安装目录下就可以找到.由于unity没有gif格式的文件,所以我们无法在面板指定,需要动态加载.所以将gif图放在StreamingAssets文件夹下.以下为源代码: using System; using System.Collections; using System.Collections.Generic; using Syst

随机推荐