变量声明:

  public PlayerInput p;                  //表示控制代码用来获得用户是否按下
public float rotateSpeed = 50f; //旋转速度
private GameObject playerHandle; //游戏物体的父节点
private GameObject cameraHandle; //相机节点
public float euler=; //X轴的初始旋转角度

在学习中,使用欧拉角控制物体视野左右平移没有什么可注意的简单一句就可以

 playerHandle.transform.Rotate(Vector3.up, p.Dright2 * rotateSpeed * Time.deltaTime);

让主角视野上下移动并且设定一个范围时,比如旋转角在【-40,30】之间,则

  cameraHandle.transform.Rotate(Vector3.right, -p.Dup2 * rotateSpeed * Time.deltaTime);
cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(cameraHandle.transform.localEulerAngles.x,-,), , );

如此做是不是就可以完成了?

大错特错!

只有在【0,30】角度变换时运行效果如你所愿,但旋转角度一旦小于0,结果会出乎意料直接变成30.知道为什么吗?

在unity中旋转角(个人理解,错了请指出。)只能是正数。什么意思呢?

我们通过cameraHandle.transform.localEulerAngles.x 获得的X轴旋转角度只会是正数。那么负数如何表示呢?在unity中当其值为负数时,会再加360°,自然转换为正数。因为-30°效果和330°一样。所以当我们cameraHandle.transform.localEulerAngles.x获得-40时,其实获得到的是320,自然会转换成30(Mathf.Clamp())。

解决方法:

很简单,既然不能直接获取localEulerAngles.x的负数值,那么我们直接自定义一个Float值在每帧进行旋转角度计算。如下:

  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
euler = Mathf.Clamp(euler, -, );
cameraHandle.transform.localEulerAngles=new Vector3(euler , , );

如果简写成如下:

  euler -= p.Dup2 * rotateSpeed * Time.deltaTime;
//euler = Mathf.Clamp(euler, -40, 30);
//cameraHandle.transform.localEulerAngles=new Vector3(euler , 0, 0);
cameraHandle.transform.localEulerAngles = new Vector3(Mathf.Clamp(euler, -, ), , );

虽然看起来简洁,其实实际运行不好,因为euler的值,在我们一直按下旋转键时,会一直变化,只是transform.localEulerAngles值只会在【-40,30】,当euler过大,等于100时,当我按下向下视角时只有等到euler的数值变为小于30,才会发生变化,反之亦然。用户体验太差。

小白自我记录,有错之处请多包涵。

unity3D 使用欧拉角控制视野注意点的更多相关文章

  1. 【unity3D】鼠标控制camera的移动、放大(俯视浏览效果、LOL摄像机移动效果)

    在Unity开发中,用鼠标滚轮来实现摄像机的视野范围,鼠标左键拖拉控制摄像机的移动,代码如下: 1.俯视浏览效果 using UnityEngine; using System.Collections ...

  2. 【和我一起学习Unity3D】Unity3D的坐标控制

    坐标这个东西,在Unity3D里面是分为几个类的,各自是Vector2,Vector3.Vector4:含义各自是:二维坐标系,三维坐标系,四维坐标系.一般做游戏呢,用到的最多的就是Vector3了. ...

  3. Unity3D 利用欧拉角实现实体的旋转

    本文系作者原创,转载请注明出处 刚刚入门U3D,也是很多东西搞不懂,最先接触的就是自己尝试去获取键盘上的GetPress之类的事件了吧 官方的API DOC也是帮了不少忙,到处吸收了各位博主的文章也是 ...

  4. unity3d笔记:控制特效的播放速度

           一般在游戏中,主角或者怪物会受到减速效果,或者攻击速度减慢等类似的状态.本身动作减速的同时,衔接在角色上的特效也需要改变相应的播放速度.一般特效有三个游戏组件:   关键点就是改变Ani ...

  5. unity3D角色代码控制问题

    ///////////////2015/07/06//////// ///////////////by xbw////////////// //////////////环境 unity4.6.1// ...

  6. unity3d之如何控制人物移动、旋转和动画播放

    代码源自噩梦射手,记录一下方便后续使用,顺便将老师的解释给备注上去_(:з」∠)_ using UnityEngine; using UnitySampleAssets.CrossPlatformIn ...

  7. Unity3D Input 键盘控制

    function Update (){ //Input.GetKey ("down") == Input.GetKey(KeyCode.DownArrow) if (Input.G ...

  8. Unity3D 事件

    unity3d事件函数整理,事件,回调函数,消息处理 Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Star ...

  9. 開始Unity3D的学习之旅

    前言:这个系列的文章纯属对自己学习的整理,非高手之作.但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程.争取每周整理一次吧.之所以会開始学Unity3D,最基本的原因是由于在快放暑假的时 ...

随机推荐

  1. git怎么克隆远程仓库到本地仓库

    参考: https://blog.csdn.net/zhangzeshan/article/details/81564990 不知道为什么输入git的克隆地址就会提示密码错误 ,使用http地址就直接 ...

  2. iptables详解(2):iptables实际操作之规则查询

    所属分类:IPtables  Linux基础 在阅读这篇文章之前,请确保你已经阅读了如下文章,如下文章总结了iptables的相关概念,是阅读这篇文章的基础. 图文并茂理解iptables 如果你是一 ...

  3. Python 内置函数 day4

    import random s = 'abczfg' st= {3,4,9,1,8} print(dir(random))#打印模块内的方法,输出模块/变量可以调用的方法 print(dir(s))# ...

  4. 1 TaskQueue 实现Task 队列

    class Program { static void Main(string[] args) { List<Person> list = new List<Person>() ...

  5. .net 学习视频

    http://www.iqiyi.com/a_19rrh9jx9p.html http://www.cnblogs.com/aarond/p/SQLDispatcher.html  --读写分离 ht ...

  6. JS练习:替换式图片自动轮播

    代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  7. 第二节:Series基本属性及方法(下)

  8. 2.1 Java开发工具包

        Java专业术语                   术语名   缩写                                                             ...

  9. java 同时安装多版本问题

    java 同时安装多版本问题(转) http://www.cnblogs.com/SamuelSun/p/6022296.html http://blog.csdn.net/u013256622/ar ...

  10. Navicat premium连接Oracle报ORA-12514错误

    1:ORA-12514 原因:Service Name/SID中的值填的有问题,默认的是ORCL,这个值如果在安装Oracle的时候填的不是ORCL,那就会出现这个错误 解决方法:找到Oracle安装 ...