Unity Game窗口中还原Scene窗口摄像机操作
最近在弄AI,调试程序的时候总是要调整摄像机的视角。灰常不爽然后自己写了个脚本。比较习惯Scene窗口下的摄像机操作所以就仿造了一个一样的操作脚本。
首相我们要知道Scene下的摄像机的操作方式
1.WASD分别控制前后左右的位移,注意:位移是已当前视角为基准的。
2.QE分别控制上下,注意:这个是针对世界坐标的。
3.鼠标右键控制自由视角旋转。(难点)
对于第一条来说,主要的问题就是现在玩家朝向问题。我怎么知道我面向哪里。
Vector3 Face = transform.rotation * Vector3.forward;
Face = Face.normalized;
这段代码就是玩家的朝向,把目前玩家的旋转角度乘上向量的前方,就是玩家的面朝方向,因为我们就要方向,所以单位向量化了。
下面就是关于第一条的控制方式。
Vector3 Face = transform.rotation * Vector3.forward;
Face = Face.normalized; Vector3 Left = transform.rotation * Vector3.left;
Left = Left.normalized; Vector3 Right = transform.rotation * Vector3.right;
Right = Right.normalized; if (Input.GetKey("w"))
{
transform.position += Face * Speed * Time.deltaTime;
} if (Input.GetKey("a"))
{
transform.position += Left * Speed * Time.deltaTime;
} if (Input.GetKey("d"))
{
transform.position += Right * Speed * Time.deltaTime;
} if (Input.GetKey("s"))
{
transform.position -= Face * Speed * Time.deltaTime;
}
第二条就不用多说了吧。上代码
if (Input.GetKey("q"))
{
transform.position -= Vector3.up * Speed * Time.deltaTime;
} if (Input.GetKey("e"))
{
transform.position += Vector3.up * Speed * Time.deltaTime;
}
最难的第三条。心思了半天有两种解决方法,但都有缺陷
1)统一转换成Vector来计算
2)统一转换成Quaternion来计算
优缺点:
1)旋转时有卡顿不流畅,但是到位快
2)旋转时比第一种流畅一些也有些许卡顿,但到位不快甚至不到位。
对于这两种方式,主要的思路都是取鼠标滑动的单位向量然后乘以速度。
这两种都设计到一个比较坑爹的问题。
鼠标向上下滑动时:
针对鼠标来说是y轴加减
针对rotation来说是x轴减加
同理鼠标左右滑动时:
针对鼠标来说是x轴减加
针对rotation来说是y轴减加
所以这段代码就很重要
//_Rot是物体当前rotation值,MovePos是修改的值,最后得旋转后的值
_Rot.x -= MovePos.y * ; //*2是可以调节的速度,越大越快
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
然后对于第一种方式全部变为Vector处理我们就会用到Transform.eulerAngles;
代码为
Vector3 Save = Input.mousePosition;
Vector3 MovePos = Save - MouseDownPos;
MovePos = MovePos.normalized;
Vector3 _Rot = transform.rotation.eulerAngles;
_Rot.x -= MovePos.y * ;
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
transform.eulerAngles = _Rot;
Debug.Log(MovePos);
MouseDownPos = Save;
对于第二种方式全部变为Quaternion处理我们用Quaternion.Slerp
代码为
Vector3 Save = Input.mousePosition;
Vector3 MovePos = Save - MouseDownPos;
MovePos = MovePos.normalized;
Vector3 _Rot = transform.rotation.eulerAngles;
_Rot.x -= MovePos.y * ;
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
Quaternion MoveRot = Quaternion.Euler(_Rot);
transform.rotation = Quaternion.Slerp(transform.rotation, MoveRot, Time.deltaTime * );
MouseDownPos = Save;
最后给完整的Update代码
private float Speed = ;
private Vector3 MouseDownPos; void Update ()
{
Vector3 Face = transform.rotation * Vector3.forward;
Face = Face.normalized; Vector3 Left = transform.rotation * Vector3.left;
Left = Left.normalized; Vector3 Right = transform.rotation * Vector3.right;
Right = Right.normalized; //Debug.Log(transform.rotation * Vector3.forward + "," + transform.rotation * Vector3.left + "," + transform.rotation * Vector3.right); if (Input.GetMouseButtonDown())
{
MouseDownPos = Input.mousePosition;
} if (Input.GetMouseButton())
{
//Vector处理
Vector3 Save = Input.mousePosition;
Vector3 MovePos = Save - MouseDownPos;
MovePos = MovePos.normalized;
Vector3 _Rot = transform.rotation.eulerAngles;
_Rot.x -= MovePos.y * ;
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
transform.eulerAngles = _Rot;
Debug.Log(MovePos);
MouseDownPos = Save; //Quaternion处理
//Vector3 Save = Input.mousePosition;
//Vector3 MovePos = Save - MouseDownPos;
//MovePos = MovePos.normalized;
//Vector3 _Rot = transform.rotation.eulerAngles;
//_Rot.x -= MovePos.y * 2;
//_Rot.y += MovePos.x * 2;
//_Rot.z += MovePos.z * 2;
//Quaternion MoveRot = Quaternion.Euler(_Rot);
//transform.rotation = Quaternion.Slerp(transform.rotation, MoveRot, Time.deltaTime * 30);
//MouseDownPos = Save;
} if (Input.GetKey("w"))
{
transform.position += Face * Speed * Time.deltaTime;
} if (Input.GetKey("a"))
{
transform.position += Left * Speed * Time.deltaTime;
} if (Input.GetKey("d"))
{
transform.position += Right * Speed * Time.deltaTime;
} if (Input.GetKey("s"))
{
transform.position -= Face * Speed * Time.deltaTime;
} if (Input.GetKey("q"))
{
transform.position -= Vector3.up * Speed * Time.deltaTime;
} if (Input.GetKey("e"))
{
transform.position += Vector3.up * Speed * Time.deltaTime;
} }
Unity Game窗口中还原Scene窗口摄像机操作的更多相关文章
- Unity Game窗口中还原Scene窗口摄像机操作 强化版
之前写的那个版本看来真的是不行啊.最近研究了一下官方第一人称脚本,人家的平滑过渡真的是没得说.借鉴了一下,写出来了一个新的比较完美的控制. 之前我们的操作是通过鼠标输入的开始坐标和转动坐标.其实官方有 ...
- C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常,不存在从对象类型System.Windows.Forms.DateTimePicker到已知的托管提供程序本机类型的映射。
一:C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常 其实,这个问题与C#的垃圾回收有关.垃圾回收器管 理所有的托管对象,所有需要托管数据的.NET语言(包括 C#)都受运行库的 垃圾回收器 ...
- (转)C#在父窗口中调用子窗口的过程(无法访问已释放的对象)
C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象 笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中 ...
- Wpf窗口中打开WinForm窗口
获取wpf窗口对应的句柄窗口 using System; using System.Windows; using System.Windows.Interop; using IWin32Window ...
- C# A窗口内容显示在B窗口中的方法
HeScripts script = new HeScripts(); //A窗口中实例化B窗口 string okscripts = "test"; //设置字段内容 scrip ...
- C#中关闭子窗口而不释放子窗口对象的方法
1 在主窗口中实例化子窗口 在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象. Form2 f2 = new Form2(); 2 通过按钮来显示主窗口 在按钮中需要实现的是窗口的显示 priv ...
- 在SOUI中非半透明窗口如何实现圆角窗口?
如果SOUI的宿主窗口没有包含子窗口,直接使用窗口的半透明属性:translucent=1就可以解决了,整个窗口形状完全由背景图决定,可以实现完美的圆角. 然后窗口半透明时,窗口中的子窗口(非SWin ...
- jQuery 获取父窗口的元素 父窗口 子窗口(iframe)
$("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...
- C#关闭子窗口而不释放子窗口对象的问题解决
在网上找来一些方式,感觉还都不错,下面给出方式: 在线扫描相机的调试过程中,需要开辟调试界面来进行位置的配置.调试结束后,一种常用的方式是将调试参数保存并在下次启动时加载.另一种简单方式是直接使用该参 ...
随机推荐
- Java调用solrj5.5.3接口,查询数据
前期准备 搭建solr服务 参考上一篇,搭建solr搜索服务. 添加依赖 maven工程的话,添加如下依赖, <!-- https://mvnrepository.com/artifact/or ...
- php应用jquery做ajax操作
以下是全部代码: <html> <head> <title>jQuery Ajax 实例演示</title> </head> <scr ...
- Xamarin Android 所见即所得问题
运行Xamarin 时出现以下问题. The layout could not be loaded : The operation failed due to an internal error : ...
- Manacher's algorithm
Manacher's algorithm 以\(O(n)\)的线性时间求一个字符串的最大回文子串. 1. 预处理 一个最棘手的问题是需要考虑最长回文子串的长度为奇数和偶数的情况.我们通过在任意两个字符 ...
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- 第5章 Java数组
1.什么是数组 数组可以想象成一个巨大的盒子,这个盒子里面存放的是同一个数据类型的数据 例如:int[] scores = {78,68,94,93}; 2.如何使用Java中的数组 2.1申明数组 ...
- 第3章 Linux常用命令(4)_帮助、用户管理和解压缩命令
4. 帮助命令 4.1 获取帮助信息:man (1)man命令 命令名称 man(英语原义:manual) 命令所在路径 usr/bin/man 执行权限 所有用户 语法 man [级别] [命令或配 ...
- Struts2 OGNL案例
一>>原始类型与包装类型 先定义两个实体类User和Address User package cn.entity; public class User { private String n ...
- angular学习笔记(二十九)-$q服务
angular中的$q是用来处理异步的(主要当然是http交互啦~). $q采用的是promise式的异步编程.什么是promise异步编程呢? 异步编程最重要的核心就是回调,因为有回调函数,所以才构 ...
- NPM 无法下载任何包的原因,解决方法
前几天发现NPM 无法现在任何的包 通过npm i testPackage -ddd 发现 是卡在了 npm verb addRemoteTarball 这行,google后发现 是有多个tmp地址, ...