麦田物语第十八天

系列文章目录

麦田物语第十八天


文章目录

  • 系列文章目录
  • 一、(Editor)制作 [SceneName] Attribute 特性
  • 二、场景切换淡入淡出和动态 UI 显示


一、(Editor)制作 [SceneName] Attribute 特性

在本节课我们编写Unity的特性Attribute来更好的完善我们项目,具体是什么呢,就是当我们在Inspector面板看到的属性面板类似于滑动条一样的类型(本来Sell Percentage只是float的类型的值,因为我们在其前面加上了[Range(0,1)]的Attribute),所有我们自己编写一个新的特性,用作我们跳转场景脚本的场景选择可以使用下拉框的形式进行选择而不是手动输入,这样可以避免因为输入错误导致无法跳转场景等问题,从而使得我们在开发过程中获得更多的便捷。

注意:我们要添加的是Editor的功能,但是我们编写代码的文件夹位置不能放在Editor中,否则就无法使用。

首先我们先创建脚本,该脚本的命名由固定的方法(以Attribute结尾,一定不要拼写错误),然后创建Scripts->Utilities->Attribute->SceneNameAttribute脚本,打开该脚本,在这个脚本中我们不需要写其他的代码,只是将其改成继承自PropertyAttribute即可。

SceneNameAttribute脚本代码如下:

using UnityEngine;public class SceneNameAttribute : PropertyAttribute
{}

解释:Property代表我们Inspector面板的每一个变量,一个String类型,int类型,Vector3类型都是一个Property。

除了上述的代码之外,我们还需要更改Property的绘制,创建Scripts->Utilities->Attribute->SceneNameDrawer脚本,麦扣老师使用的是自动填写的模板,但是我不知道怎么使用,这里我就自己手敲出来了,模板截图如下:
SceneNameDrawer脚本的模板截图
同时将报红的地方更改为我们编写的SceneNameAttribute即可,下面就需要编写这个代码啦!

解释:Rect包括其高度,宽度,xyz的值
SerializedProperty代表的是我们对应标记了SceneName的那个Property,此处我们会在TransitionManager和Teleport中使用。
GUIContent在Unity官方文档的解释就是“构建一个仅包含文本的 GUIContent 对象,同时可以在其里面添加代码使其具备其他的功能”,和Eclipse里面的内容比较相似,如果可以了解的话自己查一下Unity官方文档也可以。

接着我们就可以在TransitionManager脚本的StartSceneName变量上添加我们最新定义的Attribute,还有Teleport脚本的SceneToGo变量也要添加,虽然添加之后我们会发现啥都没有,这是因为我们还没有编写具体代码但是覆盖了原有的写法,接着我们来编写具体的代码吧!
首先我们需要定义一个场景编号sceneIndex,并初始值为-1,还要定义一个GUIContent的数组sceneNames,将每一个场景(名称)都被保存为GUIContent,最后由于我们要将取得的场景的名称从文件目录的形式中分离出来,我们就必须定义分隔符scenePathSplit。
然后是OnGUI代码的编写,首先,如果我们发现Build Setting中的场景数量为0,那么代表此时不能进行这个操作,直接return。
我们怎么拿到场景的名称呢,这是就需要找到Scene变量,它的描述是*.unity 文件的运行时数据结构,通过这个我们就可以得到其位置,然后通过String的方法去获得场景的名称。这个我们在GetSceneNameArray方法中编写。

这个也可以查看官方文档:
https://docs.unity.cn/cn/2021.3/ScriptReference/SceneManagement.Scene.html

在GetSceneNameArray中我们需要先得到在Build Setting中场景的目录scenes(类型为EditorBuildSettingsScene[]),然后在将sceneNames数组初始化,即初始化数组的大小为场景数量,接着我们需要遍历scenes变量,将其通过split方法分割成只有场景名称的字符串(删除后面的.unity以及前面的/),分割成字符串后我们要判断其长度是否大于0,如果大于0,那么将其赋值给sceneNames,反之将其text设置为Deleted Scene,代表虽然找到了,但是被删除了。

Split方法具有多个重载,我们使用我们定义的分隔符,并且舍去空余的部分,我们可以查找Unity官方文档去看看其他的使用方法。

接着我们还要判断如果没有发现场景,代表我们Build Setting中没有添加场景,我们编写这段代码提醒自己:

sceneNames = new[] { new GUIContent(“Check Your Build Settings”) };

其实还有问题,就是当我们重新添加脚本时会发现,刚开始没有赋初值的话应该为空,导致无法选择,那么我们就需要对这个空值进行调整:
我们先进行判断property的StringValue是否为空或者Null(因为我们的场景为String类型并且Property无法自动识别Value值的类型,所以选择StringValue就可以),如果为空的话,那么将sceneIndex赋值为0,如果不为空的话,代表我们给其手动敲了,因此我们要判断我们敲的那个名称是否正确,正确的话,我们在给sceneIndex赋值为对应的那个场景序号,同时将bool值nameFound设置为true代表找到了并退出循环,那我们输入错误了捏,我们也将sceneIndex赋值为0就好了。
最后我们将property的内容更改为sceneIndex所表示的数组位置的内容。
这样GetSceneNameArray方法就编写完成了,我们返回OnGUI的编写:
我们初始化时如果sceneIndex为-1,那么调用GetSceneNameArray方法,然后我们要将其画成弹出式窗口,EditorGUI.Popup方法也有很多重载,我们也可以去官方查看一下(我之前也没用过),这样编写完成之后我们就会有下拉菜单,但是不能进行选择。
我们要接着做的工作就是点按切换里面的内容:我们将点击完成之后的值返回sceneIndex,并存储点击之前的sceneIndex,如果发生改变的话,就再次使用property.stringValue = sceneNames[sceneIndex].text;该赋值语句。

SceneNameDrawer脚本代码如下:

using UnityEngine;
using UnityEditor;[CustomPropertyDrawer(typeof(SceneNameAttribute))]
public class SceneNameDrawer : PropertyDrawer
{int sceneIndex = -1;GUIContent[] sceneNames;readonly string[] scenePathSplit = { "/", ".unity" };public override void OnGUI(Rect position, SerializedProperty property, GUIContent label){if (EditorBuildSettings.scenes.Length 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解 ReLU 激活函数及其在深度学习中的应用【激活函数、Sigmoid、Tanh】

ReLU(Rectified Linear Unit)激活函数 ReLU(Rectified Linear Unit)激活函数是一种广泛应用于神经网络中的非线性激活函数。其公式如下: ReLU ( x ) max ⁡ ( 0 , x ) \text{ReLU}(x) \max(0, x) ReLU(x)max(0,x) 在…

docker部署elasticsearch和Kibana

部署elasticsearch 通过下面的Docker命令即可安装单机版本的elasticsearch: docker run -d \--name es \-e "ES_JAVA_OPTS-Xms512m -Xmx512m" \-e "discovery.typesingle-node" \-v es-data:/usr/share/elasticsearch/data \-v es-plugins:/u…

《LeetCode热题100》---<5.①普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第一道:最大子数组和(中等) 第二道:合并区间(中等) 第一道:最大子数组和(中等) 法一:贪心算法 class So…

我的256天创作纪念日

机缘 ————今天一大早收到CSDN的推送消息,告诉我这是我的256天创作纪念日。在这个特别的日子里,我回望自己踏上创作之路的点点滴滴,心中充满了感慨与感激。从最初的懵懂尝试到如今能够自信地分享见解,这段旅程不仅见证了我的成…

【教学类-73-01】20240804镂空瓶子01

背景需求: 瓶子里的春天呀! - 小红书 (xiaohongshu.com)https://www.xiaohongshu.com/explore/63ef87f8000000000703acae?app_platformandroid&ignoreEngagetrue&app_version8.47.0&share_from_user_hiddentrue&xsec_sourceapp_share&…

揭秘Matplotlib等高线图:让数据‘高山流水‘间,笑点与深度并存!

1. 引言 在这个数据如山的时代,你是不是也曾在茫茫数海中迷失方向,渴望找到那片隐藏的“数据绿洲”?别怕,今天咱们就来聊聊Matplotlib这位绘图界的魔术师,特别是它那令人叹为观止的等高线图技能。想象一下&#xff0c…

MySQL:数据库用户

数据库用户 在关系型数据库管理系统中,数据库用户(USER)是指具有特定权限和访问权限的登录账户。每个用户都有自己的用户名和密码,以便系统可以通过认证来识别他们的身份。数据库用户可以登录数据库,在其中执行各种类…

【QT】常用控件-上

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 目录 👉🏻QWidgetenabledgeometryrect制作上下左右按钮 window frame 的影响window titlewindowIcon代码示例: 通过 qrc 管理图片作为图标 windowOpacitycursor使用qrc自…

【论文笔记】SEED: A Simple and Effective 3D DETR in Point Clouds

原文链接:https://arxiv.org/abs/2407.10749 简介:基于DETR的3D点云检测器难以达到较高的性能,这可能有两个原因:(1)由于点云的稀疏性和分布不均匀,获取合适的物体查询较为困难;&…

基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)

博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙&#xff…

给虚拟机Ubuntu扩展硬盘且不丢数据

1.Ubuntu关机状态下先扩展,如扩展20GB 2.进入ubuntu,切换root登录,必须是root全选,否则启动不了分区工具gparted 将新的20GB创建好后,选择ext4,primary; 3.永久挂载 我的主目录在/并挂载到/dev/sda1 从图…

【C++】C++11之新的类功能与可变参数模板

目录 一、新的默认成员函数 二、新的关键字 2.1 default 2.2 detele 2.3 final和override 三、可变参数模板 3.1 定义 3.2 递归展开参数包 3.3 逗号表达式展开参数包 3.4 emplace_back 一、新的默认成员函数 在C11之前,默认成员函数只有六个,…

【机器学习算法基础】(基础机器学习课程)-11-k-means-笔记

示例案例 为了更好地理解 K-Means 算法,下面通过一个简单的案例进行说明。 假设我们有以下 10 个二维数据点,表示不同商店的销售额(单位:千元)和顾客数(单位:人): [(1…

常见cms漏洞之dedecms

DedeCMS是织梦团队开发PHP 网站管理系统,它以简单、易用、高效为特色,组建出各种各样各具特色的网站,如地方门户、行业门户、政府及企事业站点等。 下载地址请网上自行寻找 搭建方式选择php study 首先搭建环境 #前台http://localhost/dedecm…

Java AI伪原创视频创作视频提取文案改写去水印系统小程序源码

🔥AI赋能创作新纪元!伪原创视频文案提取改写去水印全能系统大揭秘 🚀 开篇:创意无界,AI来助力 在这个视觉盛行的时代,视频创作成为了表达自我、传递信息的重要方式。但你是否曾为寻找灵感、撰写文案、处理…

sa-token登录机制以及网关统一鉴权环境搭建

文章目录 1.sa-token1.37集成(基于token)1.文档网址2.**sun-club-auth-application-controller引入依赖**3.application.yml4.sun-club-auth-application-controller测试的controller1.UserController.java2.启动测试1.登录,得到satoken2.验证…

【FPGA】cordic算法实现三角函数

参考资料:https://zhuanlan.zhihu.com/p/638520243https://zhuanlan.zhihu.com/p/638520243

Hadoop学习(三)

一、MapReduce框架原理 1.1InputFormat数据输入 MapTask并行度决定机制 1)数据块(HDFS存储数据单位),物理上把数据分成一块一块 2)数据切片(MapReduce程序计算输入数据的单位):只是在逻辑上…

Lanproxy开箱即用的内网穿透工服务!!

Lanproxy快速上手配置服务器转发到内网!! 本教程云服务器推荐使用的开发环境如下:服务器端配置配置端口登录Web界面 内网客户端配置下载客户端配置客户端端口 最终效果测试 本文主要记录了使用Lanproxy搭建内网穿透服务的过程,其中包括服务端和客户端的详…

CSP2019第二题: 公交换乘

CSP 2019 公交换乘 题目来源:牛客网 题目:* 示例1 输入 6 0 10 3 1 5 46 0 12 50 1 3 96 0 5 110 1 6 135输出 36题意: 根据输入,计算地铁花费不能用到优惠券的公交车的花费 知识点: 结构体 思路&#xff1…