Unity之2D摄像机跟随

2023-10-27

Unity之2D摄像机跟随

在2D游戏制作过程中,摄像机的跟随主角移动是必不可少的。有代码实现,也有插件实现。下面分别讲述两种方法。

Unity中提供了专属的摄像机插件进行使用:

  • 官方Cinemachine插件(后面有相关组件介绍):

首先从unity中的window中的package manage中添加Cinemachine插件,完成后会出现Cinemachine如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QoPAgkSC-1631352596194)(C:\Users\86136\Desktop\Typora笔记\Unity笔记图片\1.png)]

并且在Cinemachine菜单中创建相关相机;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kmSKNadN-1631352547833)(C:\Users\86136\Desktop\Typora笔记\Unity笔记图片\屏幕截图 2021-09-11 165125.png)]

Cinemachine中的Virtual Camera(虚拟相机)可以说是最核心的组件。使用Cinemachine时,你需要记住一个准则:场景中一般只有一个Unity相机(除了需要制作分屏、画中画等效果的时候),上面挂着CinemachineBrain脚本;其他相机都是使用Cinemachine中的虚拟相机,可以有很多个。(平常使用这个较多)

菜单栏,选择Cinemachine > Create Virtual Camera。Unity会在场景中添加一个。Unity会在场景中添加一个GameObject,上面有一个Virtual Camera组件。如果你的Unity相机上没有CinemachineBrain脚本,Cinemachine也会自动添加CinemachineBrain脚本到Unity相机上。创建后如图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hk2BpEBb-1631352547835)(C:\Users\86136\Desktop\Typora笔记\Unity笔记图片\2.png)]

如果相机需要跟随物体移动,指定一个物体到Follow属性上。虚拟相机会自动将Unity相机的位置和Follow物体保持相对位置,包括Follow物体移动的时候。:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3g38IMjO-1631352547837)(C:\Users\86136\AppData\Roaming\Typora\typora-user-images\image-20210911165814414.png)]

将所需要跟随的物体拖拽到此即可

接着是边缘的检测:

相机的边缘检测需要添加Cinemachine Confiner组件,并且创建一个空物体来进行Polygon Collider的存放:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EEknQxx2-1631352547839)(C:\Users\86136\Desktop\Typora笔记\Unity笔记图片\image-20210911171015128.png)]

并且添加Polygon Collider 2D组件将需要显示的范围进行框起来:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D46IA2Sj-1631352547840)(C:\Users\86136\Desktop\Typora笔记\Unity笔记图片\11.png)]

接着回到虚拟相机中添加Confiner组件并将控制可视范围的空物体拖拽其上面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQ8lyLpy-1631352547840)(C:\Users\86136\AppData\Roaming\Typora\typora-user-images\image-20210911171354005.png)]

即可实现边缘检测,超出边缘不可见。

代码实现:

代码实现方法是最常用的方法之一,方便后续管理维护:

首先创建一个C#脚本,命名为CameraFollow:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wKmkLhoa-1631352547842)(C:\Users\86136\Desktop\Typora笔记\Unity笔记图片\image-20210911171835091.png)]

接着创建一个空物体,并将脚本挂在空物体,且将相机作为其子物体。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ctlFLyV7-1631352547843)(C:\Users\86136\Desktop\Typora笔记\Unity笔记图片\image-20210911172016513.png)]

其原理是将摄像机固定在一定范围,并且利用Lerp函数进行跟随目标移动,相关代码如下:

public class CamerFollow : MonoBehaviour
{
    public Transform target;
    public float smoothing;

    //定义两个位置进行限制相机移动
    public Vector2 minPosition;
    public Vector2 maxPosition;
    // Start is called before the first frame update
    void Start()
    {
        
    }
    void Update()
    {
        
    }
    void LateUpdate()
    {
        if (target != null)
        {
            Vector3 targetPos = target.position;
            targetPos.x = Mathf.Clamp(targetPos.x, minPosition.x, maxPosition.x);
            targetPos.y = Mathf.Clamp(targetPos.y, minPosition.y, maxPosition.y);
            transform.position = Vector3.Lerp(transform.position, targetPos, smoothing);
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qQAJk3J2-1631352547844)(C:\Users\86136\AppData\Roaming\Typora\typora-user-images\image-20210911172437592.png)]

拖拽需要跟随的目标,并且进行范围设定,此处范围限制可根据具体情况进行设定。如上即可代码实现摄像机跟随。

关于Lerp函数的使用,可以查看手册进行学习。

至此,实现摄像机的两种方法均已经实现,若有不足,望大家评论改正。

CinemachineVitualCamera组件的属性解读:

Solo:用于调试。选中这个按钮时,此虚拟相机会直接控制Unity相机显示在Game窗口中,用于相机的调试。(忽略优先级,但是需要所在GameOjbect是激活状态)
Game Window Guides:勾选时,Game窗口会显示辅助线,用于设置虚拟相机的各个属性。
Look At属性设置了物体,Aim设置为Composer或Group Composer或 Follow属性设置了物体,Body设置为Framing Composer
Save During Play:虚拟相机的属性在运行时的修改可以被保存下来,退出Play状态时不会被重置。
Priority优先级:虚拟相机的重要程度,用于Live镜头的选择。数值越高代表优先级越高。Cinemachine Brain会根据这个属性从所有激活的虚拟相机中选择活动的虚拟相机。在Timeline上使用时这个属性不生效。
Follow跟随目标:虚拟相机会跟随这个物体移动。Body属性基于这个目标物体更新Unity相机的位置。如果你想让相机保持它自己的位置不变,不要设置这个属性。
Look At瞄准:镜头瞄准的物体目标。Aim属性使用这个属性来更新Unity相机的旋转。如果你想相机保持原来的角度,不要设置这个属性。
Standby Update 待命时的更新方式,当虚拟相机物体没有被禁用,但是优先级不足时,虚拟相机处于待命状态。这个属性会影响性能,通常设置为Never是最好的,但是有时候可能需要虚拟相机更新来做一些镜头相关的计算判断。
  • Never 不更新
  • Always 每帧更新
  • Round Robin 循环更新:所有的待命虚拟相机循环更新,每帧更新一个相机(例如有10个待命的相机,第一帧更新第一个相机,第2帧更新第2个相机,…,第11帧更新第1个相机,以此类推)
Lens镜头设置:对应Unity相机中的属性,也可以从Preset中选择或者从现有的设置创建新的Preset。
Dutch镜头旋转。这个属性在Unity相机中是没有的,可以用来控制镜头的旋转。(在屏幕空间的旋转)

ens镜头设置:对应Unity相机中的属性,也可以从Preset中选择或者从现有的设置创建新的Preset。

Dutch镜头旋转。这个属性在Unity相机中是没有的,可以用来控制镜头的旋转。(在屏幕空间的旋转)
Transitions相机转换的相关设置:

Blend Hint混合方式:
None 无,默认线性混合
Spherical Position 根据Look At的物体球面旋转混合
Cylindrical Position 根据Look At的物体柱面旋转混合(水平方向圆弧,垂直方向线性)
Screen Space Aim When Target 在屏幕空间瞄准目标
Inherit Positon 下一个相机变成活动相机时,从上一个相机继承位置,即保持两个相机位置相同。
On Camera Live事件,相机变为活动时会触发对应的事件。
Body、Aim、Noise后面深入学习。
Extension:可以给虚拟相机添加额外的扩展。后面深入学习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity之2D摄像机跟随 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 使用 std::packaged_task/std::exception_ptr 时,线程清理程序报告数据争用

    我遇到了线程清理程序 TSan 的一些问题 抱怨某些生产代码中的数据争用 其中 std packaged task 通过将它们包装在 std function 中而移交给调度程序线程 对于这个问题 我简化了它在生产中的作用 同时触发 TSa
  • 在 C++ 中使用 matlab 结构(matlab 函数调用的返回值)(由 matlab 编译器生成的库)

    你好 我有一个相当简单的 matlab 函数 例如 function MYSTRUCT myfunc MYSTRUCT prop1 test MYSTRUCT prop2 foo MYSTRUCT prop3 42 end 我用 matla
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum

随机推荐

  • 前端三大件基础知识汇总【自用】

    一 HTML5和CSS3 HTML5 CSS3 二 Javascript基础 1 基础语法 2 Javascript 对象 3 DOM 4 Javascript 事件 5 BOM 补充 图片切换练习 1 clearInterval 可以接收
  • 《nginx》一、nginx核心指令

    nginx conf 配置文件主要分为三部分 全局块 events块 http块 1 全局块核心参数 user USERNAME GROUP 解释 指定运行nginx的worker子进程的属主和属组 其中属组可以不指定 示例 user ng
  • Java实现Apache sshd客户端(密码和公钥登录并执行命令)

    第一步 引入依赖
  • iPad 图标变小而分散 解决方法

    想必各位都遇到过这种情况吧 当你装了某个不正常cydia插件以后 ipad变成iphone界面 图标小而分散 状态栏变得花屏 而任何程序包括cydia都打不开时 请大家不要急着重新恢复ipad 可以按照我这个办法拯救一下 我也是今天4 3
  • 狂神说MyBatis02:CRUD操作及配置解析

    狂神说MyBatis系列连载课程 通俗易懂 基于MyBatis3 5 2版本 欢迎各位狂粉转发关注学习 视频同步文档 未经作者授权 禁止转载 CRUD操作 上集回顾 狂神说MyBatis01 第一个程序 namespace 将上面案例中的U
  • 云计算与大数据概论第七周

    大数据分析是指对规模巨大的数据进行分析 大数据可以概括为5个V 数据量大 Volume 速度快 Velocity 类型多 Variety 价值 Value 真实性 Veracity 大数据作为时下最火热的IT行业的词汇 随之而来的数据仓库
  • Linux下gdb编译调试程序

    Linux下gdb编译调试程序 前言 一 调试前的准备 二 gdb中断点的使用 三 gdb中运行调试程序 四 gdb中打印值和监控值 总结 参考 前言 本文记录调试工具gdb的一些基础使用方式 gdb是一个程序调试工具 注意 如果是程序语法
  • R语言ggplot2可视化绘制带有多个y轴的分面图

    R语言ggplot2可视化绘制带有多个y轴的分面图 在数据可视化中 分面图是一种常用的绘图方式 可以同时展示多个变量之间的关系 而ggplot2是R语言中一个强大的数据可视化包 可以用于创建精美的分面图 对于某些情况下 我们可能需要在分面图
  • Registry新建以及版本

    1 美图 2 添加新的schema 现在 我们可以访问Web UI了 让我们尝试向注册表添加新的架构 您的HDF版本中可能已经包含了一些模式 但是请继续并让我们添加另一个 单击 界面右上方的 符号 这将打开一个名为 Add New Sche
  • vue学习(十三) 删除对象数组中的某个元素

    html div v for循环就不写了 每一条数据最后都有一个删除的超链 prevent阻止默认的跳转行为 只执行点击事件 a href 删除 a div script
  • SQLi LABS Less-13 报错注入+布尔盲注

    第十三关是单引号 括号的字符型注入 推荐使用报错注入 布尔盲注 目录 一 功能分析 二 思路分析 三 解题步骤 方式一 报错注入 第一步 判断注入点 第二步 判断报错条件 第三步 脱库 方式二 布尔盲注 第一步 判断注入点类型 第二步 判断
  • RT-Thread Studio学习笔记之RTC——解决复位日期不保存问题

    目录 前言 RTC简介 在RT Thread Studio中开启RTC 1 打开RTC驱动 2 打开RTC的宏定义 3 使能RTC 4 下载验证 解决复位不保存年月日问题 操作步骤 调试验证 总结 前言 最近使用RT Thread Stud
  • 解决:win10下teamviewer检测为商业用途

    昨天在实验室用电脑连接了不在一个局域网的另一台机器后 teamviewer就显示 检测为商业用途 5分钟后会自动切断 且一段时间内无法再连接 回到宿舍用自己的笔记本连接实验室电脑后自己的笔记本上也出现了同样的问题 可能是昨天teamview
  • 2021 年全国职业院校技能大赛(中职组)网络安全竞赛 A 模块评分标准

    2021 年全国职业院校技能大赛 中职组 网络安全竞赛 A 模块评分标准 A 1 任务一 登录安全加固 Windows Linux 请对服务器 Windows Linux 按要求进行相应的设置 提高服务 器的安全性 1 密码策略 Windo
  • git 提示http报错

    curl 版本不对 sudo yum update y nss curl libcurl
  • 机器视觉1

    以下无需要参考 gt 直接跳过到官方文件篇 资源 64位 下载地址 资源 下载地址 opencv4 6 https opencv org releases cmake https cmake org download ffmpeglibs
  • 一起学RGBDSLAM系列_问题及解决

    一起学RGBDSLAM系列 问题及解决 http blog csdn net u012062327 本博客主要介绍的是跟人在学习高翔博士 一起学RGBDSLAM系列 中遇到的问题和解决方法 vslam入门系列见高博士blog主页 http
  • Linux的基本使用

    Linux作为一个开源的操作系统 其在服务器上 PC上 嵌入式设备上都是很好的操作系统 而大部分的公司也都在使用Linux操作系统 那么就让我们来一起学习一下Linux系统的基本使用 目录 一 Linux的常用指令 1 ls 2 pwd 3
  • HTML旅游景点网页作业制作——旅游中国11个页面(HTML+CSS+JavaScript)

    学生HTML静态网页基础水平制作 页面排版干净简洁 使用HTML CSS页面布局设计 web大学生网页设计作业源码 这是一个不错的旅游网页制作 画面精明 排版整洁 内容丰富 主题鲜明 非常适合初学者学习使用 这个实例比较全面 有助于同学的学
  • Unity之2D摄像机跟随

    Unity之2D摄像机跟随 在2D游戏制作过程中 摄像机的跟随主角移动是必不可少的 有代码实现 也有插件实现 下面分别讲述两种方法 Unity中提供了专属的摄像机插件进行使用 官方Cinemachine插件 后面有相关组件介绍 首先从uni