变量声明:

  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. ionic 创建某个文件下的page

    ionic g page 文件名 --pagesDir src/pages/about

  2. 手把手从python安装到setuptools、pip工具安装

    一.python安装1.基础开发库 apt-get install gccapt-get install openssl libssl-dev 2.安装数据库和开发库 apt-get install ...

  3. swift-新手必看的基础部分

    Swift 是一门开发 iOS, OS X 和 watchOS 应用的新语言.然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的. 常量和变量 ...

  4. JavaScript学习笔记之DOM介绍

    目录 1.简介 2.方法 3.属性 4.访问节点 5.修改节点 6.添加节点 7.删除节点 8.替换节点 9.改变 CSS 1.简介 文档对象模型(Document Object Model,DOM) ...

  5. 7-15 QQ帐户的申请与登陆

    7-15 QQ帐户的申请与登陆(25 分) 实现QQ新帐户申请和老帐户登陆的简化版功能.最大挑战是:据说现在的QQ号码已经有10位数了. 输入格式: 输入首先给出一个正整数N(≤10​5​​),随后给 ...

  6. 303. Range Sum Query - Immutable(动态规划)

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  7. hdu2013 蟠桃记【C++】

    蟠桃记 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  8. LightOJ - 1148 - Mad Counting

    先上题目: 1148 - Mad Counting   PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory Limit: 3 ...

  9. Bootstrap基础--文本对齐风格

    在排版中离不开文本的对齐方式.在CSS中常常使用text-align来实现文本的对齐风格的设置.其中主要有四种风格: ☑  左对齐,取值left ☑  居中对齐,取值center ☑  右对齐,取值r ...

  10. PHP array_intersect_key()

    定义和用法 array_intersect_key() 函数使用键名比较计算数组的交集. array_intersect_key() 返回一个数组,该数组包含了所有出现在被比较的数组中并同时出现在所有 ...