之前写的那个版本看来真的是不行啊。最近研究了一下官方第一人称脚本,人家的平滑过渡真的是没得说。借鉴了一下,写出来了一个新的比较完美的控制。

之前我们的操作是通过鼠标输入的开始坐标和转动坐标。其实官方有一个函数~

 float yRot = Input.GetAxis("Mouse X");
float xRot = Input.GetAxis("Mouse Y");

这就分别能获取到鼠标的X轴操作和Y轴操作了。

那为什么用yRot获取X轴,xRot获取Y轴呢?

左面是鼠标的顶视图,右边是Unity中的三维坐标。可以观察到,鼠标X轴的平移对应的就是Unity中Y轴的旋转。Y轴同理。

但是还是不能照搬官方的写法,因为官方的写法针对的是自身坐标,就是Local。(注:LocalPosition并不等于物体的Local坐标)

Scene窗口的摄像机是针对World的旋转。

这里就需要转换一下。

首先我们先得到摄像机的目前旋转角度,我们在Start初始化一下

     void Start()
{
CameraR = Camera.main.transform.rotation.eulerAngles;
}

在Update中用Vector3的形式修改旋转

             //官方脚本
float yRot = Input.GetAxis("Mouse X");
float xRot = Input.GetAxis("Mouse Y"); Vector3 R = CameraR + new Vector3(-xRot, yRot, 0f); //加上旋转距离 CameraR = Vector3.Slerp(CameraR, R, 100f * Time.deltaTime);//平滑过渡 transform.rotation = Quaternion.Euler(CameraR);

给出完整脚本

 using UnityEngine;
using System.Collections; public class CameraCotrel : MonoBehaviour { private float Speed = 100f;
private Vector3 CameraR; void Start()
{
CameraR = Camera.main.transform.rotation.eulerAngles;
} 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; if (Input.GetMouseButton())
{
//官方脚本
float yRot = Input.GetAxis("Mouse X");
float xRot = Input.GetAxis("Mouse Y"); Vector3 R = CameraR + new Vector3(-xRot, yRot, 0f); CameraR = Vector3.Slerp(CameraR, R, Speed * Time.deltaTime); transform.rotation = Quaternion.Euler(CameraR);
} 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窗口摄像机操作 强化版的更多相关文章

  1. Unity Game窗口中还原Scene窗口摄像机操作

    最近在弄AI,调试程序的时候总是要调整摄像机的视角.灰常不爽然后自己写了个脚本.比较习惯Scene窗口下的摄像机操作所以就仿造了一个一样的操作脚本. 首相我们要知道Scene下的摄像机的操作方式 1. ...

  2. C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常,不存在从对象类型System.Windows.Forms.DateTimePicker到已知的托管提供程序本机类型的映射。

    一:C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常 其实,这个问题与C#的垃圾回收有关.垃圾回收器管 理所有的托管对象,所有需要托管数据的.NET语言(包括 C#)都受运行库的 垃圾回收器 ...

  3. (转)C#在父窗口中调用子窗口的过程(无法访问已释放的对象)

    C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象   笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中 ...

  4. Wpf窗口中打开WinForm窗口

    获取wpf窗口对应的句柄窗口 using System; using System.Windows; using System.Windows.Interop; using IWin32Window ...

  5. python 中调用windows系统api操作剪贴版

    # -*- coding: utf-8 -*- ''' Created on 2013-11-26 @author: Chengshaoling ''' import win32clipboard a ...

  6. C# A窗口内容显示在B窗口中的方法

    HeScripts script = new HeScripts(); //A窗口中实例化B窗口 string okscripts = "test"; //设置字段内容 scrip ...

  7. C#中关闭子窗口而不释放子窗口对象的方法

    1 在主窗口中实例化子窗口 在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象. Form2 f2 = new Form2(); 2 通过按钮来显示主窗口 在按钮中需要实现的是窗口的显示 priv ...

  8. 在SOUI中非半透明窗口如何实现圆角窗口?

    如果SOUI的宿主窗口没有包含子窗口,直接使用窗口的半透明属性:translucent=1就可以解决了,整个窗口形状完全由背景图决定,可以实现完美的圆角. 然后窗口半透明时,窗口中的子窗口(非SWin ...

  9. jQuery 获取父窗口的元素 父窗口 子窗口(iframe)

    $("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...

随机推荐

  1. linux的基本语法及一些设置

    rm -r note.txt //delete网络配置进入 vi /etc/sysconfig/network-scripts/ifcfg-teh0修改配置DEVICE=eth0BOOTPROTO=d ...

  2. SAP CRM 客户控制器与数据绑定

    当用户从视图离开时,视图将失去它的数据.解决这个问题,需要引入客户控制器(Custom Controller)(译者注:SAP CRM客户端中,不同地方的Custom Controller会翻译为“客 ...

  3. iOS 消息处理之performSelector

    ////  RootViewController.h//  DSCategories////  Created by dasheng on 15/12/17.//  Copyright © 2015年 ...

  4. css选择器的使用详解

    -.css选择器的分类: 二.常用选择器详解: 1.标签选择器: 语法: 标签名 { 属性:属性值; } 代码示例: h1 { color: #ccc; font-size: 28px; } 2.类选 ...

  5. word 2010 建立多级结构和目录

    点击“开始”中的“样式”中右下角按钮   点击弹出窗口中最下方第三个按钮   点击“推荐”选项卡,再选择要显示的标题,然后点击“显示”.然后按照需要,分别把“标题3”“标题4”等显示.最后点确定即可. ...

  6. ORACLE RETURNING 用法总结

    ORACLE RETURNING 用法总结 场景 在存储过程.PL/SQL块里需要返回INSERT.DELETE.UPDATE.MERGE等DML语句执行后的信息时使用,合理使用returning能够 ...

  7. 实现从Oracle增量同步数据到GreenPlum

    简介: GreenPlum是一个基于PostgreSQL数据库开发的MPP架构的数据库仓库,适用于OLAP系统,支持50PB(1PB=1000TB)级海量数据的存储和处理. 背景: 目前有一个业务是需 ...

  8. USACO . Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...

  9. mac 键盘映射 karabiner

    mac 键盘映射 karabiner 今天在vim编辑的时候觉得用mac的方向键有点麻烦 需要移动我的小右手,然后就搜个映射方案. 百度出来了 karabiner. 官网 安装什么的就不说了, 安完了 ...

  10. UI内侧错题

    此题考察的是JQuery UI下的menu插件的使用,ui-menu表示菜单的外层容器,如果菜单包含图标,该元素会另外带一个 ui-menu-icons class.故A B选项错误.ui-menu- ...