我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用UnityRTS怎么实现一个相机移动缩放功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用UnityRTS怎么实现一个相机移动缩放功能

本篇文章为大家展示了使用UnityRTS怎么实现一个相机移动缩放功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

相机的层级关系(移动的操作是对父物体进行操作,而缩放是对子物体主相机的操作):

使用UnityRTS怎么实现一个相机移动缩放功能

以此场景为例,自己设置的一些参数,主要是移动速度,边界、缩放限制等。

使用UnityRTS怎么实现一个相机移动缩放功能

代码如下(挂载到相机的父物体上)。有两种鼠标的控制方式,一种是边界检测,一种是鼠标拖动。这个代码是完整版的,也就是键盘也可以控制相机移动缩放的,如果只需要鼠标控制的,请往下看:

using UnityEngine; /// <summary>/// /// * Writer:June/// */// * Data:2021.3.9/// */// * Function:RTS模式的相机移动/// */// * Remarks:/// /// </summary> public class CameraMoveControl : MonoBehaviour{  #region 移动  /// <summary>  /// 移动速度  /// </summary>  private float panSpeed;  /// <summary>  /// 正常速度  /// </summary>  [SerializeField] private float normalSpeed;  /// <summary>  /// 按shift加速  /// </summary>  [SerializeField] private float speedUp;  /// <summary>  /// 缓冲时间  /// </summary>  [SerializeField] private float moveTime;  private Vector3 newPos;  /// <summary>  /// 边界限制  /// </summary>  [SerializeField] private float xLimMin, xLimMax;  /// <summary>  /// 这里的Y是指屏幕上下平移的限制  /// </summary>  [SerializeField] private float yLimMin, yLimMax;  //-----------------------------------------------鼠标拖动操作相关字段----------------------------------------------------  private Camera mainCamrea;  private Vector3 startPoint, currentPoint;  #endregion   #region 缩放  /// <summary>  /// 主摄像机的位置组件  /// </summary>  private Transform mainCamreaTF;  /// <summary>  /// 缩放向量  /// tips:相机的放大缩小改变的是相机自身坐标的yz值  /// </summary>  [SerializeField] private Vector3 zoomV3;    /// <summary>  /// 缩放最大最小值  /// </summary>  [SerializeField] private Vector3 zoomMin, zoomMax;  private Vector3 newMainCamreaPos;  /// <summary>  /// 缩放时间  /// </summary>  [SerializeField] private float zoomTime;  #endregion   private void Start()  {    //判断是否有子物体    mainCamreaTF = transform.childCount > 0 ? transform.GetChild(0) : null;    if (mainCamreaTF) newMainCamreaPos = mainCamreaTF.localPosition;    mainCamrea = Camera.main;  }    private void Update()  {    //按左shift加速    panSpeed = Input.GetKey(KeyCode.LeftShift) ? speedUp : normalSpeed;    //移动    ControlCamreaMove();    //缩放    ControlCamreaZoom();  }   /// <summary>  /// 控制相机缩放  /// </summary>  private void ControlCamreaZoom()  {    if (mainCamreaTF)    {      if (Input.GetKey(KeyCode.R)) newMainCamreaPos += zoomV3 * Time.deltaTime;//放大      if (Input.GetKey(KeyCode.F)) newMainCamreaPos -= zoomV3 * Time.deltaTime;//缩小      newMainCamreaPos += Input.GetAxis("Mouse ScrollWheel") * zoomV3;      ZoomLimit(ref newMainCamreaPos);      //刷新最终位置      mainCamreaTF.localPosition = Vector3.Lerp(mainCamreaTF.localPosition, newMainCamreaPos, zoomTime * Time.deltaTime);    }  }    /// <summary>  /// 控制相机移动  /// </summary>  private void ControlCamreaMove()  {    Vector3 movePos = transform.position;    newPos.Set(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));     #region 鼠标操作    #region 方式1(鼠标到达边缘,检测后操作相机移动)    //Vector2 mousePos = Input.mousePosition;    //鼠标在四个边缘检测    //if (mousePos.x > Screen.width * 0.9f && mousePos.x < Screen.width) newPos.x = 1;    //if (mousePos.x < Screen.width * 0.1f && mousePos.x > 0) newPos.x = -1;    //if (mousePos.y > Screen.height * 0.9f && mousePos.y < Screen.height) newPos.z = 1;    //if (mousePos.y < Screen.height * 0.1f && mousePos.y > 0) newPos.z = -1;     movePos += newPos.normalized * panSpeed * Time.deltaTime;    #endregion     #region 方式2(鼠标右键拖动控制相机移动)    //首先判断相机是否为空    if (mainCamrea)    {      //鼠标右键按下时记录起始位置      if (Input.GetMouseButtonDown(1))      {        //新建的世界坐标系下的平面,用于检测射线        Plane plane = new Plane(Vector3.up, Vector3.zero);        Ray ray = mainCamrea.ScreenPointToRay(Input.mousePosition);        float distance;        if (plane.Raycast(ray, out distance))         {          //获取碰撞位置          startPoint = ray.GetPoint(distance);        }      }      //鼠标右键一直按下时记录当前点位置      if (Input.GetMouseButton(1))      {        Plane plane = new Plane(Vector3.up, Vector3.zero);        Ray ray = mainCamrea.ScreenPointToRay(Input.mousePosition);        float distance;        if (plane.Raycast(ray, out distance))        {          currentPoint = ray.GetPoint(distance);        }        movePos += (startPoint - currentPoint);      }    }    #endregion    #endregion     BoundaryLimit(ref movePos);    transform.position = Vector3.Lerp(transform.position, movePos, moveTime);  }    /// <summary>  /// 边界限制  /// </summary>  /// <param name="_pos">要限制的目标向量</param>  private void BoundaryLimit(ref Vector3 _pos)  {    _pos.x = Mathf.Clamp(_pos.x, xLimMin, xLimMax);    _pos.z = Mathf.Clamp(_pos.z, yLimMin, yLimMax);  }    /// <summary>  /// 缩放限制  /// </summary>  /// <param name="_v3">要限制的目标向量</param>  private void ZoomLimit(ref Vector3 _v3)  {    _v3.y = Mathf.Clamp(_v3.y, zoomMin.y, zoomMax.y);    _v3.z = Mathf.Clamp(_v3.z, zoomMin.z, zoomMax.z);  }}

这个代码是后来我觉得其实没必要用键盘来操控相机,根据我玩过的一些类似游戏,比较多都是鼠标操作的,所以删了键盘操作的部分:

using UnityEngine; /// <summary>/// /// * Writer:June/// */// * Data:2021.3.9/// */// * Function:RTS模式的相机移动/// */// * Remarks:/// /// </summary> public class CameraMoveControl : MonoBehaviour{  #region 移动  /// <summary>  /// 移动速度  /// </summary>  private float panSpeed;  /// <summary>  /// 正常速度  /// </summary>  [SerializeField] private float normalSpeed;  /// <summary>  /// 按shift加速  /// </summary>  [SerializeField] private float speedUp;  /// <summary>  /// 缓冲时间  /// </summary>  [SerializeField] private float moveTime;  private Vector3 newPos;  /// <summary>  /// 边界限制  /// </summary>  [SerializeField] private float xLimMin, xLimMax;  /// <summary>  /// 这里的Y是指屏幕上下平移的限制  /// </summary>  [SerializeField] private float yLimMin, yLimMax;  //-----------------------------------------------鼠标拖动操作相关字段----------------------------------------------------  private Camera mainCamrea;  private Vector3 startPoint, currentPoint;  #endregion   #region 缩放  /// <summary>  /// 主摄像机的位置组件  /// </summary>  private Transform mainCamreaTF;  /// <summary>  /// 缩放向量  /// tips:相机的放大缩小改变的是相机自身坐标的yz值  /// </summary>  [SerializeField] private Vector3 zoomV3;    /// <summary>  /// 缩放最大最小值  /// </summary>  [SerializeField] private Vector3 zoomMin, zoomMax;  private Vector3 newMainCamreaPos;  /// <summary>  /// 缩放时间  /// </summary>  [SerializeField] private float zoomTime;  #endregion   private void Start()  {    //判断是否有子物体    mainCamreaTF = transform.childCount > 0 ? transform.GetChild(0) : null;    if (mainCamreaTF) newMainCamreaPos = mainCamreaTF.localPosition;    mainCamrea = Camera.main;  }    private void Update()  {    //按左shift加速    panSpeed = Input.GetKey(KeyCode.LeftShift) ? speedUp : normalSpeed;    //移动    ControlCamreaMove();    //缩放    ControlCamreaZoom();  }   /// <summary>  /// 控制相机缩放  /// </summary>  private void ControlCamreaZoom()  {    if (mainCamreaTF)    {      newMainCamreaPos += Input.GetAxis("Mouse ScrollWheel") * zoomV3;      ZoomLimit(ref newMainCamreaPos);      //刷新最终位置      mainCamreaTF.localPosition = Vector3.Lerp(mainCamreaTF.localPosition, newMainCamreaPos, zoomTime * Time.deltaTime);    }  }    /// <summary>  /// 控制相机移动  /// </summary>  private void ControlCamreaMove()  {    Vector3 movePos = transform.position;    newPos = Vector3.zero;    #region 鼠标操作    #region 方式1(鼠标到达边缘,检测后操作相机移动)    Vector2 mousePos = Input.mousePosition;    //鼠标在四个边缘检测    if (mousePos.x > Screen.width * 0.9f && mousePos.x < Screen.width) newPos.x = 1;    if (mousePos.x < Screen.width * 0.1f && mousePos.x > 0) newPos.x = -1;    if (mousePos.y > Screen.height * 0.9f && mousePos.y < Screen.height) newPos.z = 1;    if (mousePos.y < Screen.height * 0.1f && mousePos.y > 0) newPos.z = -1;    movePos += newPos.normalized * panSpeed * Time.deltaTime;    #endregion     #region 方式2(鼠标右键拖动控制相机移动)    //首先判断相机是否为空    if (mainCamrea)    {      //鼠标右键按下时记录起始位置      if (Input.GetMouseButtonDown(1))      {        //新建的世界坐标系下的平面,用于检测射线        Plane plane = new Plane(Vector3.up, Vector3.zero);        Ray ray = mainCamrea.ScreenPointToRay(Input.mousePosition);        float distance;        if (plane.Raycast(ray, out distance))        {          //获取碰撞位置          startPoint = ray.GetPoint(distance);        }      }      //鼠标右键一直按下时记录当前点位置      if (Input.GetMouseButton(1))      {        Plane plane = new Plane(Vector3.up, Vector3.zero);        Ray ray = mainCamrea.ScreenPointToRay(Input.mousePosition);        float distance;        if (plane.Raycast(ray, out distance))        {          currentPoint = ray.GetPoint(distance);        }        movePos += (startPoint - currentPoint);      }    }    #endregion    #endregion     BoundaryLimit(ref movePos);    transform.position = Vector3.Lerp(transform.position, movePos, moveTime);  }    /// <summary>  /// 边界限制  /// </summary>  /// <param name="_pos">要限制的目标向量</param>  private void BoundaryLimit(ref Vector3 _pos)  {    _pos.x = Mathf.Clamp(_pos.x, xLimMin, xLimMax);    _pos.z = Mathf.Clamp(_pos.z, yLimMin, yLimMax);  }    /// <summary>  /// 缩放限制  /// </summary>  /// <param name="_v3">要限制的目标向量</param>  private void ZoomLimit(ref Vector3 _v3)  {    _v3.y = Mathf.Clamp(_v3.y, zoomMin.y, zoomMax.y);    _v3.z = Mathf.Clamp(_v3.z, zoomMin.z, zoomMax.z);  }}

上述内容就是使用UnityRTS怎么实现一个相机移动缩放功能,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用UnityRTS怎么实现一个相机移动缩放功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用UnityRTS怎么实现一个相机移动缩放功能

本篇文章为大家展示了使用UnityRTS怎么实现一个相机移动缩放功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。相机的层级关系(移动的操作是对父物体进行操作,而缩放是对子物体主相机的操作):以此场
2023-06-09

使用iframe怎么实现一个移动端缩放效果

今天就跟大家聊聊有关使用iframe怎么实现一个移动端缩放效果,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。这是我习惯用的meta头部,使页面宽度根据设备宽度自适应变化
2023-06-09

使用canvas怎么实现一个放大镜功能

使用canvas怎么实现一个放大镜功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 1. 什么是离屏技术?canvas 学习和滤镜实现 介绍过 drawImage 接口。除了
2023-06-09

Android应用中怎么实现一个图片预览缩放功能

Android应用中怎么实现一个图片预览缩放功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体实现方法如下2023-05-31

怎么在Android 中利用camera2 API 实现一个相机功能

怎么在Android 中利用camera2 API 实现一个相机功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。流程因为 camera2 提供的接口比较多,虽然很灵活,但是也
2023-05-31

Android应用中怎么实现一个照相功能

本篇文章为大家展示了Android应用中怎么实现一个照相功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android 照相在android中,照相功能系统已经提供,在app中可以直接使用。当手机
2023-05-31

Android应用中怎么实现一个手机震动功能

本篇文章给大家分享的是有关Android应用中怎么实现一个手机震动功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现方法如下:import android.app.Acti
2023-05-31

使用java怎么实现一个动态验证码功能

使用java怎么实现一个动态验证码功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java可以用来干什么Java主要应用于:1. web开发;2. Andro
2023-06-06

怎么在Android中利用ImageView实现一个放大缩小动画

这期内容当中小编将会给大家带来有关怎么在Android中利用ImageView实现一个放大缩小动画,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1.配置文件直接添加当直接在布局文件中添加图片的话,可以在自
2023-05-31

使用java怎么实现一个ATM功能

使用java怎么实现一个ATM功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的特点有哪些Java的特点有哪些1.Java语言作为静态面向对象编程语言
2023-06-14

使用CSS3怎么实现一个弹幕功能

本篇文章给大家分享的是有关使用CSS3怎么实现一个弹幕功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.首先创建弹幕区域
2023-06-08

使用Python怎么实现一个词云功能

使用Python怎么实现一个词云功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言
2023-06-14

使用Django怎么实现一个分页功能

这篇文章主要为大家详细介绍了使用Django怎么实现一个分页功能,文中示例代码介绍的非常详细,具有一定的参考价值,发现的小伙伴们可以参考一下:创建项目创建APP,添加APP这些就不在多说我们这次重点来看到视图函数下面是路由设置视图函数继承T
2023-06-06

使用ajax怎么实现一个登录功能

本篇文章给大家分享的是有关使用ajax怎么实现一个登录功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。ajax的优点:1、最大的一点是页面无刷新,用户的体验非常好。2、使用异
2023-06-08

使用canvas怎么实现一个拼图功能

使用canvas怎么实现一个拼图功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现的思路其实挺简单的,主要是通过服务端获取图片链接,图片宽度,图片高度,然后
2023-06-09

使用canvas怎么实现一个滤镜功能

使用canvas怎么实现一个滤镜功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1 了解 canvas?1.1 什么是 canvas?这个 HTML 元素是为
2023-06-09

使用JavaScript怎么实现一个圆角功能

使用JavaScript怎么实现一个圆角功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。找在IE下实现css3效果的圆角时找到的一个实例,没有测试,不知道使用起来怎么样,
2023-06-08

怎么用PHP+Ajax实现手机移动端发红包功能

本篇内容介绍了“怎么用PHP+Ajax实现手机移动端发红包功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!基本流程:当输入完红包数量和总金
2023-06-04

怎么利用java语言实现一个哈夫曼压缩功能

本篇文章给大家分享的是有关怎么利用java语言实现一个哈夫曼压缩功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。哈夫曼压缩的原理: 通过统计文件中每个字节出现的频率,将8位的
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录