Unity中的SerializeReference使用简介

这篇具有很好参考价值的文章主要介绍了Unity中的SerializeReference使用简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity 默认可以序列化值类型, Serializable属性修饰的类型, 派生自UnityEngine.Object的类型, 通常这些类型已经足以供日常使用了.
但是有时我们希望在编辑器面板上序列化一个接口或者抽象类, 则需要用到 SerializeReference属性.

假定我们有一个接口IEatable, 并实现了两个类BreadBun:

public interface IEatable
{
    int Calorie { get; }
}

public class Bread : IEatable
{
    [field: SerializeField]
    public int Calorie { get; private set; } = 100;
}

public class Bun : IEatable
{
    public enum Fillings
    {
        [InspectorName("肉馅")]
        Meat,

        [InspectorName("韭菜鸡蛋")]
        LeekAndAgg,
    }

    [field: SerializeField]
    public int Calorie { get; private set; } = 200;

    [field: SerializeField]
    public Fillings Filling { get; private set; }
}

相应的, 我们定义了一个餐盘类去盛放食物Plate:

[CreateAssetMenu(menuName = "Plate for Food")]
public class Plate : ScriptableObject
{
    private IEatable _eatable;

    public IEatable Eatable { get => _eatable; set => _eatable = value; }
}

在Unity编辑器内右键新建一个Plate, 可见Inspector面板上没有显示Eatable字段.

Unity中的SerializeReference使用简介

此时我们为_eatable字段添加SerializeReference属性.

注意, 添加SerializeReference后, 即使字段是私有的, 也无需添加SerializeField属性, 二者同有将私有字段序列化的能力.

[CreateAssetMenu(menuName = "Plate for Food")]
public class Plate : ScriptableObject
{
    [SerializeReference]
    private IEatable _eatable;

    public IEatable Eatable { get => _eatable; set => _eatable = value; }
}

添加SerializeReference属性后, Inspector面板上已经可以显示Eatable字段了, 但是由于此时_eatable字段的值为null, 所以并没有显示其他信息.

SerializeReference属性允许字段为null, 这点与默认序列化行为不同, 默认序列化会自动实例化一个值

Unity中的SerializeReference使用简介

接下来我们在Plate中定义一个方法ServeBread, 将_eatable字段设置为Bread实例, 并使用ContextMenuItem属性将此方法设置为_eatable字段的上下文菜单:


    [ContextMenuItem("盛放面包", "ServeBread", order = 0)]
    [ContextMenuItem("盛放包子", "ServeBun", order = 1)]
    [SerializeReference]
    private IEatable _eatable;

    ...
    
    private void ServeBread() => _eatable = new Bread();

    private void ServeBun() => _eatable = new Bun();

    ...

回到Unity编辑器, 此时我们就可以右键点击Eatable字段并在弹出菜单中选择一项来为_eatable字段赋值了.

添加[field: SerializeReference]后, 属性也可以像字段一样被序列化, 但是其label会显示为<属性名>k__BackingField, 如果不希望这种现象,可以将属性转化为完整属性并为对应的私有字段添加SerializeField.

Unity中的SerializeReference使用简介

用文本编辑器打开Plate.asset文件, 可以看到使用SerializeReference属性进行序列化后的内容, 可以对比一下普通的序列化方式.

Unity中的SerializeReference使用简介

其中, type记录了字段内容的具体类型class, 所在命名空间ns, 所在的程序集asm. 而data则记录了实例的可序列化字段及内容.

ContextMenuItem方式只是为了演示, 合理的做法应该是自行实现对应的PropertyDrawer.

SerializeReference还可以修饰List<T>T[], 具体情况可以查看Unity官方文档, 这里就不赘述了.文章来源地址https://www.toymoban.com/news/detail-830656.html

到了这里,关于Unity中的SerializeReference使用简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • js简介以及在html中的2种使用方式(hello world)

    javascript :是一个跨平台的脚本语言;是一种轻量级的编程语言。 JavaScript 是 Web 的编程语言。所有现代的 HTML 页面都使用 JavaScript。 HTML: 结构 css: 表现 JS: 行为 HTML+CSS 只能称之为静态网页,加入js网页则有了灵魂称之为动态网页 脚本语言的特点: 不能独立运行,要依赖

    2024年02月12日
    浏览(51)
  • Nginx目录结构简介:深入理解Nginx的默认文件和目录

    第一章 Nginx的默认目录结构 当你安装Nginx后,它的默认目录结构如下: 让我们逐个了解这些目录和文件的作用。 第二章 conf目录 conf目录包含了Nginx的配置文件,其中nginx.conf是Nginx主配置文件,它包含了所有全局的Nginx配置项。mime.types文件包含了MIME类型的定义,它告诉Nginx如

    2024年02月13日
    浏览(62)
  • 使用VIVADO中的MIG控制DDR3(AXI接口)一——AXI简介

            最近,因为需要,学习了AXI总线协议和DDR3相关的知识,花了很多的时间去找各种相关的资料,深刻明白查资料的不容易,这里将所学到的东西做一个总结,同时给需要的人提供一些便利,有问题的欢迎一起讨论学习、共同进步。          首先来说一下有关AXI总

    2024年02月08日
    浏览(50)
  • Maven简介及环境搭建和基本使用(Java开发中的实用工具)

    Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 pom.xml文件:里面可以配置相关信息,指导maven如何工作 坐标:jar包在仓库中的唯一位置, apache将

    2024年02月02日
    浏览(42)
  • Unity中的RaycastHit如何使用

    RaycastHit用于从射线投射获取信息的结构,常与Physics.Raycast,Physics.RaycastAll配合使用。 ------Unity中Physics.Raycast 的使用 当射线与物体发生碰撞时会做输出 ​  官方文档中给出了一下使用方法▼ ​

    2024年02月04日
    浏览(41)
  • unity中的基本材质使用

      在unity中我们可以使用unity本身自带的材质来改变物体的颜色,和我们使用法线和高度,光源遮罩来完善我们的物体的质感和其他各种的功能 在unity中我们如何创建一个材质,首先我们在资源管理界面右键鼠标,点击第一个创建,再找到Material点击如何我们的文件中就出现了一

    2023年04月08日
    浏览(35)
  • Unity中的Lerp插值的使用

            平时在做项目中插值的使用避免不了,之前一直在插值中使用存在误区,在这里浅浅记录一下。之前看的博客或者教程还多都存在一个“永远到达不了,只能无限接近”的一个概念。可能是之前脑子中没有插值的概念没理解对,或者当时看的up主也是没理解对,程

    2024年02月21日
    浏览(32)
  • LitJson在Unity中的使用

    是一种轻量级的数据交换格式。它是基于JavaScript语法标准的一个子集。JSON采用完全独立于语言的文本格式,可以很容易在各种网络、平台和程序之间传输。JSON的语法很简单,易于人阅读和编写,同时也易于机器解析和生成 特别注意:Json中使用[ ]表示数组结构,使用{ }表示

    2024年02月06日
    浏览(32)
  • 记录Simplyon在Unity中的使用

    Simplygon是一家位于瑞典的3D数据自动优化解决方案的主要开发商,他们是3D游戏优化、帮助创造者和用户优化3D数据的领导者,目前已被微软收购。 Simplygon主要针对3D模型的优化,对网格缩减,重构,合并以及对材质合并烘焙等优化途径提供解决方案,故对于业界的大多数3D建

    2024年02月04日
    浏览(24)
  • unity 修改默认脚本

       

    2024年02月13日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包