unity3D 使用欧拉角控制视野注意点
变量声明:
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 使用欧拉角控制视野注意点的更多相关文章
- 【unity3D】鼠标控制camera的移动、放大(俯视浏览效果、LOL摄像机移动效果)
在Unity开发中,用鼠标滚轮来实现摄像机的视野范围,鼠标左键拖拉控制摄像机的移动,代码如下: 1.俯视浏览效果 using UnityEngine; using System.Collections ...
- 【和我一起学习Unity3D】Unity3D的坐标控制
坐标这个东西,在Unity3D里面是分为几个类的,各自是Vector2,Vector3.Vector4:含义各自是:二维坐标系,三维坐标系,四维坐标系.一般做游戏呢,用到的最多的就是Vector3了. ...
- Unity3D 利用欧拉角实现实体的旋转
本文系作者原创,转载请注明出处 刚刚入门U3D,也是很多东西搞不懂,最先接触的就是自己尝试去获取键盘上的GetPress之类的事件了吧 官方的API DOC也是帮了不少忙,到处吸收了各位博主的文章也是 ...
- unity3d笔记:控制特效的播放速度
一般在游戏中,主角或者怪物会受到减速效果,或者攻击速度减慢等类似的状态.本身动作减速的同时,衔接在角色上的特效也需要改变相应的播放速度.一般特效有三个游戏组件: 关键点就是改变Ani ...
- unity3D角色代码控制问题
///////////////2015/07/06//////// ///////////////by xbw////////////// //////////////环境 unity4.6.1// ...
- unity3d之如何控制人物移动、旋转和动画播放
代码源自噩梦射手,记录一下方便后续使用,顺便将老师的解释给备注上去_(:з」∠)_ using UnityEngine; using UnitySampleAssets.CrossPlatformIn ...
- Unity3D Input 键盘控制
function Update (){ //Input.GetKey ("down") == Input.GetKey(KeyCode.DownArrow) if (Input.G ...
- Unity3D 事件
unity3d事件函数整理,事件,回调函数,消息处理 Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Star ...
- 開始Unity3D的学习之旅
前言:这个系列的文章纯属对自己学习的整理,非高手之作.但确实的记载了我作为一个没接触过3D游戏编程的大学生的心路历程.争取每周整理一次吧.之所以会開始学Unity3D,最基本的原因是由于在快放暑假的时 ...
随机推荐
- Codeforces_733D
D. Kostya the Sculptor time limit per test 3 seconds memory limit per test 256 megabytes input stand ...
- Gradle与Makefile构建工具的对比
随着Android Studio的普及,越来越多的Android开发者也要开始了解和学习Gradle这款强大的代码构建工具了.我们在学习和了解一项新事物的时候,最快速的方法往往是与已知的事物进行比较, ...
- Dispatch Queues 线程池
Dispatch Queues Dispatch queues are a C-based mechanism for executing custom tasks. A dispatch queue ...
- jmeter解决中文乱码问题
问题: 当响应数据或响应页面没有设置编码时,jmeter会按照jmeter.properties文件中,sampleresult.default.encoding 设置的格式解析默认ISO-8859- ...
- Redis 之消息发布与订阅(publish、subscribe)
使用办法: 订阅端: Subscribe 频道名称 发布端: publish 频道名称 发布内容 一般做群聊,聊天室,发布公告信息等.
- 9 Java 堆排序
堆是具有以下性质的完全二叉树,每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆:或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆.如下图: 同时,我们对堆中的结点按层进行编号,将这种逻 ...
- Python学习笔记——Matplot库
https://www.cnblogs.com/laoniubile/p/5893286.html 一.基本指令 import matplotlib.pyplot as plt plt.figure ...
- 逆元Inv(模板+应用)
逆元: 如果满足公式,则有a 是 b的逆元同时b也是a的逆元. 逆元的应用: 设c为b在对m取余的意义下的逆元: 在求解公式 (a / b) % m的时候,如果b可能会非常的大,所以会出现爆精度的问题 ...
- 原来PHP对象比数组用更少的内存
一直以为php的数组更节省内存,从来没有测试过,今天因为要读取一个大配置文件作为pool.做了一次测试: 得出结论是 使用对象保存数据更好,花费的内存是数组array的1/4. 测试代码 class ...
- 一个电商项目的Web服务化改造4:方案和架构,通用接口的定义和实现
最近一直在做一个电商项目,需要把原有单系统架构的项目,改造成基于服务的架构,SOA. 有点挑战,做完了,会有很大进步. 上一篇,我们明确了我们的"规范和约定". 从 ...