当前位置: 首页 > news >正文

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程

        制作场景之间的切换

1.代码思路

        (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场景,然后把它卸载掉

        (2)每次创建一个新的场景之后都要去Build Settings当中,将所有创建的场景都添加到这个列表当中

        (3)由于游戏的场景是逐一叠加的,那么异步加载的模式就为Additive(在原有的场景当中叠加)

        (4)场景之间切换是通过碰撞触发的,需要指定切换后的场景和坐标

        (5)切换场景需要用一个新的脚本来控制,它所需要的变量有目标场景名,目标坐标,要注意在卸载场景的时候人物是不能被玩家控制的,还需要注意的是,在传送过程中选中物品的情况(举起物品),也就是说要在卸载场景之前,恢复player的基本动画(AnimatorOverride.cs),取消物品的高亮显示(InventoryUI.cs)

2.代码实现

TransitionManager.cs

namespace FuliFarm.Transition
{public class TransitionManager : MonoBehaviour{//游戏开始的场景public string startSceneName = string.Empty;private void Start(){StartCoroutine(LoadSceneSetActive(startSceneName));}private void OnEnable(){EventHandler.TransitionEvent += OnTransitionEvent;}private void OnDisable(){EventHandler.TransitionEvent -= OnTransitionEvent;}private void OnTransitionEvent(string sceneToGo, Vector3 positionToGo){StartCoroutine(Transition(sceneToGo, positionToGo));}/// <summary>/// 卸载一个场景,加载另外一个场景/// </summary>/// <param name="sceneName">目标场景</param>/// <param name="targetPosition">目标位置</param>/// <returns></returns>private IEnumerator Transition(string sceneName, Vector3 targetPosition){//呼叫卸载场景之前要做的事EventHandler.CallBeforeSceneUnloadEvent();yield return SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene());yield return LoadSceneSetActive(sceneName);//移动人物坐标EventHandler.CallMoveToPosition(targetPosition);//呼叫加载场景之后的事件EventHandler.CallAfterSceneLoadedEvent();}/// <summary>/// 加载场景并设置为激活/// </summary>/// <param name="sceneName">场景名</param>/// <returns></returns>private IEnumerator LoadSceneSetActive(string sceneName){//协成当中所有的加载场景都是异步加载yield return SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);Scene newScene = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);//序号从0开始,而数量(count)是从1开始的,所以减1SceneManager.SetActiveScene(newScene);}}
}

  Teleport.cs

namespace FuliFarm.Transition
{public class Teleport : MonoBehaviour{public string sceneToGo;public Vector3 positionToGo;private void OnTriggerEnter2D(Collider2D other){if (other.CompareTag("Player")){//把目标位置和目标场景传给TransitionManager中,然后调用协成Transition,就去到了对应的场景EventHandler.CallTransitionEvent(sceneToGo, positionToGo);}}}
}

新增事件

//切换场景
public static event Action<string, Vector3> TransitionEvent;
public static void CallTransitionEvent(string sceneName,Vector3 pos)
{TransitionEvent?.Invoke(sceneName,pos);
}//卸载场景之前的事件
public static event Action BeforeSceneUnloadEvent;
public static void CallBeforeSceneUnloadEvent()
{BeforeSceneUnloadEvent?.Invoke();
}//加载场景之后的事件
public static event Action AfterSceneLoadedEvent;
public static void CallAfterSceneLoadedEvent()
{AfterSceneLoadedEvent?.Invoke();
}//传送到所在位置
public static event Action<Vector3> MoveToPosition;
public static void CallMoveToPosition(Vector3 targetPosition)
{ MoveToPosition?.Invoke(targetPosition);
}

修改SwitchBounds.cs

public class SwitchBounds : MonoBehaviour
{//注册事件private void OnEnable(){EventHandler.AfterSceneLoadedEvent += SwitchConfinerShape;}private void OnDisable(){EventHandler.AfterSceneLoadedEvent -= SwitchConfinerShape;}private void SwitchConfinerShape(){PolygonCollider2D confinerShape = GameObject.FindGameObjectWithTag("BoundsConfiner").GetComponent<PolygonCollider2D>();CinemachineConfiner confiner = GetComponent<CinemachineConfiner>();confiner.m_BoundingShape2D = confinerShape;//Call this if the bounding shape's points change at runtimeconfiner.InvalidatePathCache();}
}

 修改ItemManager.cs

public class ItemManager : MonoBehaviour
{public Item itemPrefab;private Transform itemParent;private void OnEnable(){EventHandler.InstantiateItemInScene += OnInstantiateItemInScene;EventHandler.AfterSceneLoadedEvent += OnAfterSceneLoadedEvent;}private void OnDisable(){EventHandler.InstantiateItemInScene -= OnInstantiateItemInScene;EventHandler.AfterSceneLoadedEvent -= OnAfterSceneLoadedEvent;}private void OnAfterSceneLoadedEvent(){itemParent = GameObject.FindWithTag("ItemParent").transform;}private void OnInstantiateItemInScene(int ID, Vector3 pos){var item = Instantiate(itemPrefab, pos, Quaternion.identity, itemParent);item.itemID = ID;}
}

新增Player.cs中的函数以及变量,并修改Update

    private bool inputDisable;private void OnEnable(){EventHandler.BeforeSceneUnloadEvent += OnBeforeSceneUnloadEventd;EventHandler.AfterSceneLoadedEvent += OnAfterSceneLoadedEvent;EventHandler.MoveToPosition += OnMoveToPosition;}private void OnDisable(){EventHandler.BeforeSceneUnloadEvent -= OnBeforeSceneUnloadEventd;EventHandler.AfterSceneLoadedEvent -= OnAfterSceneLoadedEvent;EventHandler.MoveToPosition -= OnMoveToPosition;}private void OnMoveToPosition(Vector3 targetPosition){transform.position = targetPosition;}private void OnAfterSceneLoadedEvent(){inputDisable = false;}private void OnBeforeSceneUnloadEventd(){inputDisable = true;}private void Update(){if(inputDisable == false)PlayerInput();SwitchAnimation();}

 AnimatorOverride.cs新增注册事件以及具体实现

private void OnEnable()
{EventHandler.ItemSelectedEvent += OnItemSelectedEvent;EventHandler.BeforeSceneUnloadEvent += OnBeforeSceneUnloadEvent;
}private void OnDisable()
{EventHandler.ItemSelectedEvent -= OnItemSelectedEvent;EventHandler.BeforeSceneUnloadEvent -= OnBeforeSceneUnloadEvent;
}private void OnBeforeSceneUnloadEvent()
{holdItem.enabled = false;SwitchAnimator(PartType.None);
}

新增InventoryUI.cs注册事件以及实现

private void OnEnable()
{EventHandler.UpdateInventoryUI += OnUpdateInventoryUI;EventHandler.BeforeSceneUnloadEvent += OnBeforeSceneUnloadEvent;
}private void OnDisable()
{EventHandler.UpdateInventoryUI -= OnUpdateInventoryUI;EventHandler.BeforeSceneUnloadEvent -= OnBeforeSceneUnloadEvent;
}private void OnBeforeSceneUnloadEvent()
{UpdateSlotHightlight(-1);
}

最终效果

可以通过门来回切换场景,在举着东西的状态下,切换场景后,人物动画以及UI的选中高亮将会被重置

补充知识点

1.协程

这个视频讲得很好,听一遍就会

2.unity代码执行顺序

图片来源

相关文章:

麦田物语学习笔记:创建TransitionManager控制人物场景切换

基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…...

后端SpringBoot学习项目-用户管理-增删改查-service层

仓库地址 在初版代码中&#xff0c;已经实现了基础的增删改查。 但是&#xff0c;逻辑处理都放在Controller层中并没有分为Service层&#xff0c;所以&#xff0c;代码升级时候必须补充上去。 代码结构 升级后的代码结构有所变化。 --common 公共插件 --controller…...

机器学习11-学习路径推荐

机器学习11-学习路径推荐 本文希望摒除AI学习商业宣传要素&#xff0c;推荐一条极简的AI学习路线&#xff01;推荐内容均为在线免费内容&#xff0c;如果有条件可以咨询专业的培训机构&#xff01; 文章目录 机器学习11-学习路径推荐[toc] 1-AI培训路线第一阶段 Python-人工智能…...

[ACTF2020 新生赛]Upload1

题目 以为是前端验证&#xff0c;试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…...

【PyTorch】0.初识:从吃货角度理解张量

0.初识张量 PyTorch 是一个 Python 深度学习框架&#xff0c;它将数据封装成张量&#xff08;Tensor&#xff09;来进行运算。PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中&#xff0c;张量以 "类" 的形式封装起来&#xff0c;对张量的一些运…...

医学图像分析工具09.1:Brainstorm安装教程

1. 安装前准备 **官方安装包和数据&#xff1a;**https://neuroimage.usc.edu/bst/download.php **官方安装教程&#xff1a;**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求&#xff1a; 有 Matlab&#xff1a; R2009b (7.9) 或更高版本没有 Matlab&…...

springboot基于Spring Boot的智慧养老服务系统的设计与实现

系统介绍&#xff1a; 智慧养老服务系统是一种运用现代科技手段&#xff0c;整合各类养老资源&#xff0c;为老年人提供全方位、个性化服务的综合性平台。该系统通过智能化设备、大数据分析、云计算等技术&#xff0c;实现对老年人健康状况、生活需求的实时监控与精准匹配&…...

Linux内核中IPoIB驱动模块的初始化与实现

InfiniBand(IB)是一种高性能的网络互连技术,广泛应用于高性能计算(HPC)和数据中心。为了在InfiniBand网络上运行标准的IP协议栈,Linux内核提供了IP over InfiniBand(IPoIB)驱动模块。IPoIB允许在InfiniBand网络上传输IPv4和IPv6数据包,从而使得现有的IP应用程序能够无…...

WPS计算机二级•幻灯片的基础操作

听说这是目录哦 PPT的正确制作步骤&#x1f6e3;️认识PPT界面布局&#x1f3dc;️PPT基础操作 快捷键&#x1f3de;️制作PPT时 常用的快捷技巧&#x1f3d9;️快速替换PPT的 文本字体&#x1f303;快速替换PPT 指定文本内容&#x1f305;能量站&#x1f61a; PPT的正确制作步…...

.NET9增强OpenAPI规范,不再内置swagger

ASP.NETCore in .NET 9.0 OpenAPI官方文档ASP.NET Core API 应用中的 OpenAPI 支持概述 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/openapi/overview?viewaspnetcore-9.0https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/ope…...

基于微信小程序的民宿预订管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

网络(三) 协议

目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…...

【深度解析Java 20天速成】04_IDEA的安装与使用

【Why IDEA ?】 【注】JetBrains官方说明&#xff1a; 尽管我们采取了多种措施确保受访者的代表性&#xff0c;但结果可能会略微偏向 JetBrains 产品的用户&#xff0c;因为这些用户更有可能参加调查。 此外&#xff0c;2022年&#xff0c;某美国软件开发商在对近千名专业的Ja…...

gitlab处理空文件夹的提交或空文件夹提交失败

问题描述 厂家发给了我一个压缩包文件&#xff0c;压缩包解压之后本地编译没问题&#xff1b;推送到gitlab之后&#xff0c;再编译就报错了&#xff1b; 问题原因 经过分析之后发现&#xff0c;压缩包解压之后存在很多空文件夹&#xff1b;但是gitlab推送的时候&#xff0c;…...

计算机网络之链路层

本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 02 数据链路层 在网上看到其他人做了详细的笔记&#xff0c;就不再多余写了&#xff0c;直接参考着学习吧。 1 详解数据链路层-数据链路层的功能【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51C…...

Arduino大师练成手册 -- 读取红外接收数据

硬件连接 连接引脚&#xff1a; 将红外接收器的 VCC 引脚连接到 Arduino 的 5V 引脚。 将红外接收器的 GND 引脚连接到 Arduino 的 GND 引脚。 将红外接收器的 OUT 引脚连接到 Arduino 的数字引脚&#xff08;例如 D11&#xff09;。 安装必要的库 在 Arduino IDE 中&#…...

【Efficient AIGC】SiTo: Similarity-based Token Pruning (AAAI-2025)

文章目录 SiTo: Training-Free and Hardware-Friendly Acceleration for Diffusion Models via Similarity-based Token Pruning背景介绍方法结果消融 文章目录 SiTo: Training-Free and Hardware-Friendly Acceleration for Diffusion Models via Similarity-based Token Prun…...

数据标注开源框架 Label Studio

数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台&#xff0c;旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据&#xff08;如文本、图像、音频、视频等&#xff09;以及复杂的标注任务&#xff08;如分类、命名实体…...

MyBatis最佳实践:MyBatis 框架的缓存

缓存的概念&#xff1a; 在内存中临时存储数据&#xff0c;速度快&#xff0c;可以减少数据库的访问次数经常需要查询&#xff0c;不经常修改的数据&#xff0c;不是特别重要的数据都适合存储到缓存中 缓存的级别&#xff1a; 一级缓存(默认开启)&#xff1a;SqlSession 级别 …...

基于LangGraph、Groq和Tavily打造可以调用外部搜索引擎工具的对话机器人(核心代码 万字详解)

一、python环境 & 相关库版本信息 代码运行在 conda 创建的python环境下&#xff0c;python和相关库的版本信息如下&#xff1a; $ python --version Python 3.12.3$ pip list | grep langchain langchain 0.3.15 langchain-community 0.3.15 lang…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...

简单介绍C++中 string与wstring

在C中&#xff0c;string和wstring是两种用于处理不同字符编码的字符串类型&#xff0c;分别基于char和wchar_t字符类型。以下是它们的详细说明和对比&#xff1a; 1. 基础定义 string 类型&#xff1a;std::string 字符类型&#xff1a;char&#xff08;通常为8位&#xff09…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析&#xff08;98/126&#xff09;&#xff1a;电商转化率优化与网站性能的底层逻辑 在电子商务领域&#xff0c;转化率与网站性能是决定商业成败的核心指标。今天&#xff0c;我们将深入解析不同类型电商平台的转化率基准&#xff0c;探讨页面加载速度对用户行为的…...