首页 > 其他分享 >Unity中的SerializeReference使用简介

Unity中的SerializeReference使用简介

时间:2024-02-20 18:13:26浏览次数:30  
标签:简介 字段 public IEatable Unity SerializeReference 序列化 eatable

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字段.

默认检视面板

此时我们为_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, 这点与默认序列化行为不同, 默认序列化会自动实例化一个值

添加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.

设置ContextMenuItem属性后的检视面板

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

序列化内容

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

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

SerializeReference还可以修饰List<T>T[], 具体情况可以查看Unity官方文档, 这里就不赘述了.

标签:简介,字段,public,IEatable,Unity,SerializeReference,序列化,eatable
From: https://www.cnblogs.com/liougouren/p/18023731

相关文章

  • gengine简介
    gengine简介gengine是一款基于golang和AST(抽象语法树)开发的规则引擎,gengine支持的语法是一种自定义的DSLgengine于2020年7月由哔哩哔哩(bilibili.com)授权开源gengine现已应用于B站风控系统、流量投放系统、AB测试、推荐平台系统等多个业务场景你也可以将gengine应用于gol......
  • Unity基于AssetBundle资源管理流程详解
    在Unity游戏开发中,资源管理是一个非常重要的环节。随着游戏的发展,资源会变得越来越庞大,因此需要一种高效的资源管理方式来减少内存占用和加快加载速度。AssetBundle是Unity提供的一种资源打包和加载方式,可以将资源打包成一个独立的文件,然后在运行时进行加载和卸载。本文将详细介绍......
  • Unity MVC开发模式与开发流程详解
    在Unity游戏开发中,采用MVC(Model-View-Controller)模式是一种非常常见的设计模式。MVC模式将应用程序分为三个部分:模型(Model)、视图(View)和控制器(Controller)。这种模式可以有效地分离应用程序的逻辑和用户界面,使得代码更易于维护和扩展。本文将详细介绍Unity中的MVC开发模式及其开发流......
  • Unity引擎2D游戏开发,水和荆棘的逻辑实现
    Unity引擎2D游戏开发,水和荆棘的逻辑实现新建瓦片新建Water与Spike的Tilemap对新建的两个Tilemap绑定TilemapCollider2D,这样他们就会有碰撞判定,勾选上IsTrigger为了标识伤害的来源,将Water和Spike打上标签Tag添加好荆棘的瓦片,不要忘记选中Spike的图层进行添加添加好后,......
  • Unity简易事件系统
    事件系统是一个基于观察者模式之上构建的系统。通过利用delegate来进行Multicasting,实现一处激发则一触全发。​ 以下代码以简单的形式实现了一个仅限void类型函数的事件系统。publicclassEventManager:MonoSingleton<EventManager>{privatestaticDictionary<strin......
  • STL简介
    01.STL的介绍(重点)1.STL(StandardTemplateLibrary,标准模板库)2.STL提供了六大组件:容器,算法,迭代器,仿函数,适配器,空间配置器​ 容器:各种数据结构​ 算法:各种常用的算法(冒泡,排序)​ 迭代器:扮演了容器与算法之间的胶合剂(类似于指针等)​ 仿函数:行为类似函数,可作为算法的某种策略......
  • OCV, AOCV, POCV, LVF 简介
    芯片生产过程中,由于外界条件和生产条件的变化,如PVT,可能导致同一晶圆上不同区域的芯片晶体管速度变快或变慢,从而产生corner概念。BCWC代表bestcasecorner和worstcasecorner,分别表示两种不同的PVT环境。OCV、AOCV、POCV和LVF模式是在不同PVT(不同corner)基础上添加derate。1.OCV......
  • Unity常用设计模式之工厂模式
    工厂模式是一种常用的设计模式,它属于创建型模式,用于创建对象的过程中。在Unity中,工厂模式可以帮助我们更好地管理和创建对象,提高代码的可维护性和可扩展性。接下来,我将详细介绍Unity中常用的工厂模式。一、工厂模式概述工厂模式是一种创建型设计模式,它提供了一个统一的接口来创......
  • 异步编程简介
    异步编程是一种编程模式,旨在提高程序的性能和响应速度。通过将某些任务异步执行,程序可以在等待结果时继续执行其他任务,从而减少了阻塞和等待的时间。在本篇博客中,我们将详细探讨异步编程的各个方面,并介绍常见的异步编程技术和工具。什么是异步编程?传统的同步编程方式中,代码会按照......
  • Unity UGUI的DrawCall优化
    UnityUGUI是一种强大的用户界面设计工具,它可以帮助开发者快速创建各种界面元素,从按钮和文本到滑块和面板等。然而,在使用UGUI时,一个常见的性能瓶颈就是DrawCall过多导致的性能下降。在本文中,我们将深入探讨UGUI的DrawCall优化方法,并给出对应的代码实现。什么是DrawCall?在Unity......