分享一个Unity中控制相机漫游的脚本,应用于智慧城市、数字孪生等场景操作。

直接上代码

using UnityEngine;[RequireComponent(typeof(Camera))]
public class FreeFlyCamera : MonoBehaviour
{#region UI[Space][SerializeField][Tooltip("The script is currently active")]private bool _active = true;[Space][SerializeField][Tooltip("Camera rotation by mouse movement is active")]private bool _enableRotation = true;[SerializeField][Tooltip("Sensitivity of mouse rotation")]private float _mouseSense = 1.8f;[Space][SerializeField][Tooltip("Camera zooming in/out by 'Mouse Scroll Wheel' is active")]private bool _enableTranslation = true;[SerializeField][Tooltip("Velocity of camera zooming in/out")]private float _translationSpeed = 55f;[Space][SerializeField][Tooltip("Camera movement by 'W','A','S','D','Q','E' keys is active")]private bool _enableMovement = true;[SerializeField][Tooltip("Camera movement speed")]private float _movementSpeed = 10f;[SerializeField][Tooltip("Speed of the quick camera movement when holding the 'Left Shift' key")]private float _boostedSpeed = 50f;[SerializeField][Tooltip("Boost speed")]private KeyCode _boostSpeed = KeyCode.LeftShift;[SerializeField][Tooltip("Move up")]private KeyCode _moveUp = KeyCode.E;[SerializeField][Tooltip("Move down")]private KeyCode _moveDown = KeyCode.Q;[Space][SerializeField][Tooltip("Acceleration at camera movement is active")]private bool _enableSpeedAcceleration = true;[SerializeField][Tooltip("Rate which is applied during camera movement")]private float _speedAccelerationFactor = 1.5f;[Space][SerializeField][Tooltip("This keypress will move the camera to initialization position")]private KeyCode _initPositonButton = KeyCode.R;#endregion UIprivate CursorLockMode _wantedMode;private float _currentIncrease = 1;private float _currentIncreaseMem = 0;private Vector3 _initPosition;private Vector3 _initRotation;#if UNITY_EDITORprivate void OnValidate(){if (_boostedSpeed < _movementSpeed)_boostedSpeed = _movementSpeed;}
#endifprivate void Start(){_initPosition = transform.position;_initRotation = transform.eulerAngles;}private void OnEnable(){if (_active)_wantedMode = CursorLockMode.Locked;}// Apply requested cursor stateprivate void SetCursorState(){if (Input.GetKeyDown(KeyCode.Escape)){Cursor.lockState = _wantedMode = CursorLockMode.None;}/*if (Input.GetMouseButtonDown(0)){_wantedMode = CursorLockMode.Locked;}*/// Apply cursor state//Cursor.lockState = _wantedMode;// Hide cursor when lockingCursor.visible = true;//(CursorLockMode.Locked != _wantedMode);}private void CalculateCurrentIncrease(bool moving){_currentIncrease = Time.deltaTime;if (!_enableSpeedAcceleration || _enableSpeedAcceleration && !moving){_currentIncreaseMem = 0;return;}_currentIncreaseMem += Time.deltaTime * (_speedAccelerationFactor - 1);_currentIncrease = Time.deltaTime + Mathf.Pow(_currentIncreaseMem, 3) * Time.deltaTime;}private void Update(){if (!_active)return;SetCursorState();/*if (Cursor.visible)return;*/// Translationif (_enableTranslation){transform.Translate(Vector3.forward * Input.mouseScrollDelta.y * Time.deltaTime * _translationSpeed);}// Movementif (_enableMovement){Vector3 deltaPosition = Vector3.zero;float currentSpeed = _movementSpeed;if (Input.GetKey(_boostSpeed))currentSpeed = _boostedSpeed;if (Input.GetKey(KeyCode.W))deltaPosition += transform.forward;if (Input.GetKey(KeyCode.S))deltaPosition -= transform.forward;if (Input.GetKey(KeyCode.A))deltaPosition -= transform.right;if (Input.GetKey(KeyCode.D))deltaPosition += transform.right;if (Input.GetKey(_moveUp))deltaPosition += transform.up;if (Input.GetKey(_moveDown))deltaPosition -= transform.up;// Calc accelerationCalculateCurrentIncrease(deltaPosition != Vector3.zero);transform.position += deltaPosition * currentSpeed * _currentIncrease;}if (Input.GetMouseButtonDown(0)){_enableRotation = true;}if(Input.GetMouseButtonUp(0)){_enableRotation = false;}// Rotationif (_enableRotation){// Pitchtransform.rotation *= Quaternion.AngleAxis(-Input.GetAxis("Mouse Y") * _mouseSense,Vector3.right);// Pawtransform.rotation = Quaternion.Euler(transform.eulerAngles.x,transform.eulerAngles.y + Input.GetAxis("Mouse X") * _mouseSense,transform.eulerAngles.z);}// Return to init positionif (Input.GetKeyDown(_initPositonButton)){transform.position = _initPosition;transform.eulerAngles = _initRotation;}}
}

将脚本挂到相机上即可。

Unity相机漫游脚本相关推荐

  1. Unity相机漫游脚本FreeCamera.CS

    Unity相机漫游脚本FreeCamera.CS

  2. Unity相机自由移动脚本

    实现WSAD移动方向,鼠标右键旋转角度,滚轮实现缩放 在此之前,我们先讲清楚几个比较容易混淆的点: 1:Transform.forward是Transform组件的一个Vector3类型的属性,代表游 ...

  3. Unity实现相机漫游功能

    创建一个相机,挂载这个脚本即可 public class FilmPlaybackMgr {Camera wanderCamera;bool isWanderCam = false;int Camer ...

  4. Unity SKFramework框架(十七)、FreeCameraController 上帝视角/自由视角相机控制脚本

    目录 一.简介 二.功能 1.键盘控制平移 2.鼠标控制平移 3.视角拉近拉远 4.绕视角中心旋转 5.视角聚焦 6.活动区域限制 7.闲置时绕视角中心旋转 三.核心变量 一.简介 FreeCamer ...

  5. unity 关闭自己脚本_太可了!这些领域可以把Unity玩的那么好,带你开启新世界...

    projects 作品 本期编辑:刺子 审核:OF君 Unity3D凭借 操作简单.易学. 灵活等优势,风靡全球. 从官网最新公布的数据来看, 其已占世界范围内45%的市场份额, 占据全球首位. 如今 ...

  6. 【Unity 题型】脚本开发

    知识涉及:Unity   脚本生命周期 要点 以下关于密封类的说法,正确的是 A. 密封类可以用做基类 B. 密封类可以使抽象类 C. 密封类永远不会有任何派生类 D. 密封类或密封方法可以重写或继承 ...

  7. Unity相机跟随以及子弹发射笔记

    相机移动 现在还有一个问题是:主角SpaceMarine移动的时候,会走出玩家的视线,所以这里让相机跟随着SpaceMarine移动. 步骤1. 创建和设置CameraMount 在层级(Hierar ...

  8. unity相机围绕模型转_围绕我们的业务模型和风险进行安全测试

    unity相机围绕模型转 When we create an environment and consider our security testing from development to pro ...

  9. Unity 相机固定角度平移至指定物体

    前言:这个也是我得一个朋友怎么做,朋友跟我说的方法,然后我就想记录下来,当个学习. 需求:相机固定视角(相机的高是15.x轴选转30.y轴旋转15),地图上有很多物体,点击后相机移动到指定物体(物体居 ...

最新文章

  1. 一款好用 mongodb 可视化工具
  2. (71)APC队列,KAPC结构,分析 TerminateThread ,QueueUserApc
  3. pcm 采样率转换_All Video Converter Pro for mac(音视频格式转换器)
  4. Java中的函数传递
  5. 利用C语言中的setjmp和longjmp,来实现异常捕获和协程
  6. 微软面试题:写程序找出二叉树的深度
  7. 【转载】网络通讯协议的国际斗争
  8. KVC 与 KVO 理解
  9. 使用BatteryHistorian分析和优化应用电量
  10. 浪曦_Struts2应用开发系列_第2讲.Struts2的类型转换-学习笔记
  11. 异常:Handler sending message to a Handler on a dead thread
  12. 屏幕尺寸、分辨率、像素密度三者关系
  13. SameSite 属性
  14. SQL 事务 begin tran、commit tran、rollback tran 的用法
  15. 聊聊Java面向对象(OOP)
  16. 物联网操作系统碎片化问题分析与思考
  17. 亚马逊ec2 ng 文件服务器,在亚马逊EC2云服务器上装完后访问不了
  18. 中国联通净增5G用户数超越中国电信,但夺回千年老二或是梦想
  19. JAVA毕业设计教师继续教育计算机源码+lw文档+系统+调试部署+数据库
  20. 深度学习阅读导航 | 15 YOLOv4:最佳速度与精确度的目标检测器

热门文章

  1. hbase的master启动失败 master running as process 9400. Stop it first.
  2. android 蓝牙相关的类,Android中BluetoothAdapter类简介
  3. 2022山东国际青少年眼睛健康产业展览会,护眼健康展9月开展
  4. 淘宝活动应该怎么参加吗?报名活动怎样容易通过?
  5. 走进游戏中的美术:游戏美术风格介绍
  6. 信息与计算科学跨考计算机,信息与计算科学考研的方向介绍
  7. 微星智控 - 群控软件
  8. 斯坦福大学啥课最火?读了这些书你就知道了!
  9. Vue - 每个页面单独设置 body 背景色(独立修改单个页面的背景色,不同页面设置不同的背景颜色)
  10. markdown文档插入表情符号支持的英文单词大全 官方