Unity实现2D游戏跟随摄像机(平滑移动)

news2025/1/14 18:24:48

文章目录

  • 玩家角色
  • 脚本
    • 字段
    • 跟随逻辑
  • 完整代码
  • 其他相关文章连接

玩家角色

首先创建一个可用的玩家角色,写好移动逻辑,如果要使用在Unity商店中购买的资源,可以点击Window菜单栏> Package Manager选项,来打开Package Manager窗口,如下所示,然后下载你需要的资源。
在这里插入图片描述
在这里插入图片描述

脚本

新建一个脚本,名叫FollowCamera,然后将该脚本挂载到Camera上。
在这里插入图片描述

字段

我们要创建的跟随摄像机具有平滑移动的功能,所以我们需要创建两个字段,一个字段用于表示跟随的物体,一个字段用于表示摄像机移动的平滑程度。
声明一个Transform类变量target,用于指定摄像机要跟随的目标物体,注意要声明成public的,这样我们可以在编辑器中将目标物体赋值给该变量。
声明一个float类型变量damping,用于指定跟随的平滑程度,数值越大表示跟随越平滑,默认值赋值为1。

public Transform target; // 跟随的目标物体
public float damping = 1; // 跟随的平滑程度

跟随逻辑

跟随逻辑的代码我们放在LateUpdate() 方法中实现,这个方法在每一帧最后被调用。

private void LateUpdate()
{
}

在LateUpdate() 方法中,首先判断目标物体是否存在(是否已经赋值给target变量),如果没有目标物体,不进行任何操作,避免报错。

if (target != null)
{
}

接下来计算摄像机应该移动的向量:

// 计算目标位置在屏幕上的坐标
Vector3 targetPosition = Camera.main.WorldToViewportPoint(target.position);
// 计算摄像机应该移动的向量
Vector3 delta = target.position - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, targetPosition.z));

首先,使用Camera.main.WorldToViewportPoint()方法将目标物体的位置转换为视口坐标(相对于摄像机的屏幕视图比例)。
然后,通过计算delta向量,获得目标物体在视口坐标系下的中心位置与屏幕中心位置之间的偏移量。使用Camera.main.ViewportToWorldPoint()方法将偏移量转换为世界坐标系下的偏移量。

接下来计算目标位置和移动摄像机。

// 计算摄像机的目标位置
Vector3 destination = transform.position + delta;
// 使用平滑阻尼移动摄像机
transform.position = Vector3.Lerp(transform.position, destination, damping * Time.deltaTime);

根据计算得到的摄像机的目标位置,使用Vector3.Lerp()方法以平滑阻尼的方式将摄像机移动到目标位置。

这样脚本就写好了。可以使摄像机平滑地跟随目标物体,并保持目标物体在摄像机的中心位置。通过调整damping变量的值,我们还可以控制跟随的平滑程度。

完整代码

using UnityEngine;

public class FollowCamera: MonoBehaviour
{
    public Transform target; // 跟随的目标物体
    public float damping = 1; // 跟随的平滑程度

    private void LateUpdate()
    {
        if (target != null)
        {
            // 计算目标位置在屏幕上的坐标
            Vector3 targetPosition = Camera.main.WorldToViewportPoint(target.position);
            // 计算摄像机应该移动的向量
            Vector3 delta = target.position - Camera.main.ViewportToWorldPoint(new Vector3(0.5f, 0.5f, targetPosition.z));
            // 计算摄像机的目标位置
            Vector3 destination = transform.position + delta;
            // 使用平滑阻尼移动摄像机
            transform.position = Vector3.Lerp(transform.position, destination, damping * Time.deltaTime);
        }
    }
}

其他相关文章连接

Unity2D实现左右移动的敌人角色
Unity创建一个可移动的2D角色

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/998624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSCP系列靶场-Esay-SunsetDecoy保姆级

OSCP系列靶场-Esay-SunsetDecoy保姆级 目录 OSCP系列靶场-Esay-SunsetDecoy保姆级总结准备工作信息收集-端口扫描目标开放端口收集目标端口对应服务探测 信息收集-端口测试22-SSH端口的信息收集22-SSH端口版本信息与MSF利用22-SSH协议支持的登录方式22-SSH手动登录尝试(无)22-S…

离子风蛇是什么?

离子风蛇是一种坐立式静电消除器,可手动将蛇管变形使风蛇指向目标方向,让离子气流直流吹向目标表面,方便移动,适用于工厂车间、电子行业、半导体行业、薄膜、卷料、分切等行业。可安放于各种工作区域,除静电除尘效果好…

【大虾送书第九期】速学Linux:系统应用从入门到精通

目录 🍭写在前面 🍭为什么学习Linux系统 🍭Linux系统的应用领域 🍬1.Linux在服务器的应用 🍬2.嵌入式Linux的应用 🍬3.桌面Linux的应用 🍭Linux的版本选择 &a…

你不能不了解的Java23中设计模式之【抽象工厂模式】

目录 一.介绍抽象工厂模式 1.概念 2.结构: 抽象工厂模式包含以下角色: 3.工作原理: 4.应用场景: 抽象工厂模式适用于以下情况: 5.使用方法: 二.具体实例通过抽象工厂模式实现计算器 1.创建Maven工程…

【C++--类和对象】构造函数析构函数

先来介绍一下类和对象中的六个默认成员函数:构造函数,析构函数,拷贝构造,赋值重载,普通对象取地址重载,const修饰对象取地址重载 这六类函数都是在我们没有显示定义的时候,编译器会自己生成的函…

有什么好用的电容笔?apple pencil替代品推荐

近年来,电容笔越来越成为人们日常生活中常见的数码产品之一。电容笔的便捷性得到了消费者的认可。它逐渐取代无纸化书写。那么到底电容笔哪个品牌好呢,电容笔哪一款最好用呢,今天小编给大家总结几款市面好用的电容笔,让我们一起来…

什么是SPA单页面,优缺点是什么?如何实现?

目录 一、SPA的优点 二、SPA的缺点 三、SPA和MPA的区别 四、如何实现SPA应用 单页面应用程序(SPA)是一种基于Web的软件架构,其中只有一个页面,通过不同的路由和组件来展示不同的内容。SPA的应用非常广泛,例如在网页…

PCB layout在布线上的设计规范有哪些?

PCB Layout是一项技术活,也是经验活,良好的PCB Layout布线可帮助工程师确保最终的电路板性能、可靠性和制造质量,因此是很多电子工程师的学习重点,下面我们来盘点下PCB Layout关于布线的规范有哪些。 1、地管的引脚接地越短越好&a…

YOLO目标检测——路标数据集+已标注voc和yolo格式标签下载分享

实际项目应用:自动驾驶、视频监控和安防、物体识别和分类、城市规划和地理信息系统等等数据集说明:YOLO路标目标检测数据集,真实场景的高质量图片数据,数据场景丰富,图片格式为jpg,共900张图片,…

DPText-DETR: 基于动态点query的场景文本检测,更高更快更鲁棒 | 京东探索研究院

针对场景文本检测任务,近期基于DEtection TRansformer (DETR) 框架预测控制点的研究工作较为活跃。在基于DETR的检测器中,query的构建方式至关重要,现有方法中较为粗糙的位置先验信息构建导致了较低的训练效率以及性能。除此之外,…

Tomcat源码:CoyoteAdapter、Valve#invoke、ApplicationFilterChain

前文: 《Tomcat源码:启动类Bootstrap与Catalina的加载》 《Tomcat源码:容器的生命周期管理与事件监听》 《Tomcat源码:StandardServer与StandardService》 《Tomcat源码:Container接口》 《Tomcat源码&#xff1a…

在32位Windows中,DLL是如何导出的?

32 位 Windows 的设计者不必担心将所有内容压缩到 256KB 的内存中。由于 Win32 中的模块基于需求分页,因此你所要做的就是将整个映像映射到内存中,然后运行访问所需的部分。 DLL中的常驻名(resident name)和非常驻名(non-resident name)之间没有区别&am…

5.4 【MySQL】页目录

记录在页中按照主键值由小到大顺序串联成一个单链表,如果我们想根据主键值查找页中的某条记录,可以这样查询: SELECT * FROM page_demo WHERE c1 3; 我们平常想从一本书中查找某个内容的时候,一般会先看目录,找到需…

Docker配置阿里云镜像加速器

Docker配置阿里云镜像加速器 《Docker安装详细步骤》:Docker安装详细步骤_周十一.的博客-CSDN博客、 在前面博文已经介绍了docker 的安装,因为某些原因,我们下载镜像比较慢,今天给大家介绍一下,如何配置阿里云的镜像加…

解决Ubuntu无法安装pycairo和PyGObject

环境:虚拟机Ubuntu20.04,vscode无法安装pycairo和PyGObject 虚拟机Ubuntu20.04,vscode中运行Anaconda搭建的vens 的Python3.8.10 首先在vscode中点击ctrlshiftp,选择Python3.8.10的环境,自动激活Python 最近在搞无人…

在Linux和Windows上安装seata

1 前言 官网地址:https://seata.io/ 源码地址:https://github.com/seata/seata 官网手册:https://seata.io/zh-cn/docs/ops/deploy-guide-beginner.html Seata,一款开源的分布式事务解决方案,致力于提供高性能和简…

STM32CubeProgrammer 用ST-LINK不能烧录 解决方法

如下图所示,连接ST-LINK后可以认出Serial number,点击Connect后,显示“Error : Data read failed”,点击Download后,显示“Error: failed to download Segment[0]”。 此为正常现象,因为芯片加密&#xff0…

docker 容器编排工具 docker-compose从0到精通

compose简介 Docker-Compose 项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Docker-Compose 项目由 Python 编写,调用 Docker 服务提供的API来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以…

redis高可用之主从复制、哨兵模式、集群的概述及部署

目录 redis集群有三种模式 一、主从复制 1、主从复制的概念 2、主从复制的作用 3、主从复制的流程 4、主从复制的缺陷 5、搭建redis主从复制 二、redis 哨兵模式 1、哨兵模式的概念 2、哨兵模式的作用 3、故障转移机制 4、搭建Redis 哨兵模式 三、redis集群 1、r…

iOS开发Swift-12-列表UI,TableViewController,动态响应Button勾选-待办事项App(1)

1.创建新项目 为项目添加图标 2.将Table View Controller添加到界面中 将箭头移动到Table View上来,代表它是首页(根页面).选中ViewController,点击Delete,对它进行删除.将代码ViewController.swift也删除掉. 新建一个Cocoa Touch Class. 将TableViewController的cla…