麦田物语第十八天

news2024/9/25 13:23:06

系列文章目录

麦田物语第十八天


文章目录

  • 系列文章目录
  • 一、(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.coloradmin.cn/o/1975849.html

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

相关文章

一款简单且强大的免费开源图片压缩软件

图压是一款简单易用且功能强大的图片压缩工具,适用于Windows和macOS两大操作系统。它能够在几乎不损害图片清晰度的情况下,显著减小图片的体积,特别适合需要在网页、PPT、Word、PDF中使用的图片压缩。图压的操作界面简洁,用户可以…

Kettle同步数据时如何借助Shell通过SSH连接MySQL数据库

在实际开发中,经常会用到KettleSpoon来同步数据,比如:需要定时将MySQL库某张表前一天的数据同步到SQL Server(MySQL)库中等等。一般由于安全性都会提供基于秘钥的连接方式,这种情况下如何在Kettle中连接数据…

Wordpress建站问题记录

从一月到七月因为工作的情况没有进行太深入的开发,想着整理一下把做一个独立站把博客多个渠道发布一下,遇到几个问题在这里记录一下. 先写一下我的配置 系统: centos7 php: 7.4 wordpress: 6.6.1 mysql:8.0.6 1. HTTP 500 Internal 这个问题出现在我将wordpress的文件夹全部…

运维变革背景下的运维工具衍化探讨

在数字化转型的浪潮中,运维领域正经历着前所未有的变革。这一变革不仅重塑了业务形态,也对运维工具和运维组织模式产生了深远影响。随着基础设施云化、容器化、微服务化等技术的兴起,运维对象、运维流程、协同关系等各个方面都发生了深刻的变…

J.U.C 原子类之AtomicIntegerFieldUpdate

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…

MySQL:数据库用户

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

第二十天学习笔记2024.8.2

安装mysql 1.安装软件包 centos7 中安装 mysql 8.x_wffkg-CSDN博客 2.解压 tar -xf mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 3.卸载mariadb yum remove -y *mariadb* 4.安装&#xff08;缺什么依赖补什么&#xff09; mysql-community-server-8.0.33-1.el7.x86_64.rpm 5.…

APP逆向 day26unidbg下-pdd(anti)案例

一.前言 今天我们讲unidbg的下篇&#xff0c;也就是unidbg基础的最后一个部分&#xff0c;我们上节课也有补环境&#xff0c;比如补java环境&#xff0c;补安卓环境&#xff0c;这节课我们讲的肯定比这些都要难&#xff0c;我会给出一个之前讲过的案例&#xff0c;然后会讲一个…

如何建立与众不同的市场洞察能力【深度】

来源&#xff1a;战略研发领航 建立与众不同的市场洞察机制&#xff0c;展示了如何在组织中建立一种以数据和洞察为核心的文化&#xff0c;并通过4S周期&#xff08;架构、探查、塑造、成型&#xff09;的洞察工作方法论&#xff0c;指导领导者和团队在各个层级上进行更有效的思…

【C语言】C语言期末突击/考研--函数

目录 一、函数的声明与定义-嵌套调用 1.1.函数的声明与定义 1.2.函数的分类与调用 二、函数的递归调用 三、局部变量与全局变量 3.1.全局变量解析形参实参解析 3.2.局部变量与全局变量 四、练习题及解析 一、函数的声明与定义-嵌套调用 1.1.函数的声明与定义 函数间的…

Code Review 这件事,AI 比人类强 10 倍

1.引言 代码审查&#xff0c;也就是 Code Review&#xff08;以下简称 CR&#xff09;&#xff0c;一直是 IT 行业讨论的热门话题&#xff0c;因为它在很大程度上决定了公司的工程质量。 但是&#xff0c;人工 CR 的成本的是很高的&#xff0c;所以在实际落地场景&#xff0c…

latex换行\left[和\right]编译报错-解决方案

简而言之&#xff1a;\\ 换成 \right.\\ , & 换成 &\left. 来个例子就知道了&#xff1a; 原本的公式是&#xff1a; \begin{align}\label{up_critic} L_Q(\theta) & \mathbb{E}\left[\frac{1}{2}(Q_\theta(\mathcal{S}_{k,t}^m, {A}_{k,t}^m) - ({R}_{k,t}^m …

07030405复杂可编程逻辑器件CPLD现场可编程阵列FPGA

复杂可编程逻辑器件CPLD&现场可编程阵列FPGA 7.3 复杂可编程逻辑器件CPLD7.3.1CPLD的结构 7.4现场可编程门阵列FPGA7.4.1FPGA实现逻辑功能的基本原理7.4.2FPGA结构简介1.可编程逻辑块2.I/O块3.可编程连线资源CPLD与FPGA的区别 7.5可编程逻辑器件开发过程简介编程条件 7.3 复…

细说文件操作

你好&#xff01;感谢支持孔乙己的新作&#xff0c;本文就结构体与大家分析我的思路。 希望能大佬们多多纠正及支持 &#xff01;&#xff01;&#xff01; 个人主页&#xff1a;爱摸鱼的孔乙己-CSDN博客 目录 1.什么是文件 1.1.程序设计文件 1.1.1.程序文件 1.1.2.数据文件…

使用EntityFramework8的学习和开发过程中一些经验

前言&#xff1a; 本篇文章主要记录自己在EF8的学习和使用过程中的碰到一些坑和自己琢磨的一些解决问题的方法以及过程。 问题汇总&#xff1a; 一、Code First 模式下生成表中字段的没有按照我们想要的次序排列 实体上增加注解 [Column(Order 0)] 可以通过Order来控制字段…

[CISCN2019 华北赛区 Day1 Web1]Dropbox 1

目录 题目分析功能测试代码读取index.phpdownload.phpdelete.phpclass.php 关键代码审计user类FileList类File类思路 解题步骤php脚本解题 题目分析 功能测试 注册登录后来到上传文件界面&#xff0c;通过改后缀&#xff0c;改文件头&#xff0c;改content-type&#xff0c;上…

如何养护我们的头发一

正常头发含水量10-13% 头发含水量低 头发就会干燥 受到损伤 头发保水能力弱 保养头发,最重要的是防止头发头发的流水. 正确的洗涤方法 干性头发,一般3天洗一次 油性头发,一般1天洗一次 中性头发,一般2天洗一次 (2)正确的洗发步骤 选择好梳子建议选用木梳或牛角梳 按摩头皮…

释疑 803-(2)物理层 整理总结

目录 2-01 物理层要解决哪些问题?物理层的主要特点是什么? 2-02 规程与协议有什么区别? 2-03 试给出数据通信系统的模型并说明其主要组成构件的作用。 2-04 试解释以下名词&#xff1a;数据、信号、模拟数据、模拟信号、基带信号、带通信号、数字数据、数字信号、码元、…

PHP智能问诊导诊平台-计算机毕业设计源码75056

摘 要 智能问诊导诊平台作为一种智能化医疗服务工具&#xff0c;利用PHP语言开发&#xff0c;旨在为用户提供便捷的在线问诊和导诊服务。该平台集成了智能算法和医疗数据&#xff0c;实现了智能化的病情诊断和治疗建议&#xff0c;帮助用户更快速地获取医疗信息和建议。用户可…

未授权访问

一、Redis 未授权访问 redis-cli -h 192.168.4.176-p6379 &#xff08;使用这个连接&#xff09; 连接成功后使用info测试 二、MongDB 未授权访问 使用fofa搜mongdb端口复制ip到Navicat,连接 】 三、Zookeeper未授权访问漏洞 使用fofa 搜索2181端口使用下面命令在kali在…