【Unity学习笔记】第十四 Prefab 概念解惑

目录

      • 1 prefab、prefab变体、prefab覆盖和prefab 嵌套
      • 2 connect 与unpack
      • 3 prefab到底是什么,它和gameobject又有什么区别?
      • 4 为什么要用prefab?
      • 5 代码动态加载prefab
      • 6 为什么我unity PrefabUtility.InstantiatePrefab() 得到的是null
      • 7 PrefabUtility.InstantiatePrefab()与Instantiate 区别
      • 8 PrefabAssetType
      • 9 prefab使用建议
      • 10 总结

Prefab基础参见官方手册::

  • Unity 手册-预制件
  • Unity 手册-在运行时实例化预制件

本文主要针对手册中没有提到或没有解释清楚的概念进行探究。

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/138233550

作者:CSDN@|Ringleader|

1 prefab、prefab变体、prefab覆盖和prefab 嵌套

在这里插入图片描述
覆盖就是对拖动到scene中的预制体进行的修改,分为更改属性和增减组件或gameobject,但无法修改gameobject层级关系。
在这里插入图片描述
在这里插入图片描述
你可以重置修改,也可以将修改变动应用到源prefab资产。可以批量操作也可以对单独项进行操作。
在这里插入图片描述
注意:变体的覆盖分覆盖到父prefab和自身prefab变体:
在这里插入图片描述
注意存在覆盖优先的情况:

  • 预制件实例上覆盖的属性值始终优先于预制件资源的值。这意味着,如果更改预制件资源的属性,对覆盖该属性的实例没有任何影响。
  • 如果对预制件资源进行更改,但未按预期更新所有实例,则应检查实例上是否覆盖了该属性。最好仅在确实必要时才使用实例覆盖,因为如果整个项目中有大量实例覆盖,则很难判断对预制件资源的更改是否对所有实例都有影响。

至于预制体变体和嵌套预制体,可以类比class概念理解成prefab的继承。

2 connect 与unpack

2018.2 and above updated method. Right click on the game object and select “unpack prefab”.
在这里插入图片描述

3 prefab到底是什么,它和gameobject又有什么区别?

比如scene场景一个普通gameobject层级结构:
在这里插入图片描述
则这个scene的yaml文件对应gameObject结构如下:
在这里插入图片描述
当将gameobject拖入project变成prefab后,scene文件结构变成:
在这里插入图片描述
这里sourcePrefab的guid就是这个prefab.mata里的guid
注意:prefab资源文件本体没有记录该资源的guid,而是由其对应的meta文件记录的。

而此时prefab结构如下:
在这里插入图片描述
可以看到prefab的gameobject结构和scene中gameobject结构并没有什么区别。而上面scene文件的区别就是将原先gameObject变成通过PrefabInstance根据guid进行引用罢了。

所以prefab的本质就是: prefab是独立于scene而存在的一组gameObject资源。

这个帖子里也提到了相似的看法:
在这里插入图片描述
Unity create prefab at runtime

4 为什么要用prefab?

  1. gameObject组可预设为模板:Unity 的prefab系统允许创建、配置和存储游戏对象及其所有组件、属性值和子游戏对象作为可重用资源。预制体资源充当模板,在此模板的基础之上可以在场景中创建新的预制体实例。
  2. 对象重用:如果要在场景中的多个位置或项目中的多个场景之间重用以特定方式配置的游戏对象,比如非玩家角色 (NPC)、道具或景物,则应将此游戏对象转换为预制体。
  3. 批量修改同一prefab实例:prefab比简单复制和粘贴游戏对象更好,因为预制件系统可以自动保持所有副本同步。对预制体资源所做的任何编辑都会自动反映在该预制件的实例中,因此可以轻松地对整个项目进行广泛的更改,而无需对资源的每个副本重复进行相同的编辑。
  4. 此外通过预制体嵌套(Nested Prefabs)可以将一个预制体嵌套到另一个预制体中,从而创建多个易于编辑的复杂游戏对象层级视图。可以通过覆盖各个预制体实例的设置来创建预制体变体(Prefabs Variant),从而可以将一系列覆盖组合在一起形成有意义预制体的变化。

5 代码动态加载prefab

在这里插入图片描述
聊聊Unity中如何使用预制体Prefab提高工作效率

这篇讲解得非常好,顺便了解了UI

6 为什么我unity PrefabUtility.InstantiatePrefab() 得到的是null

PrefabUtility.InstantiatePrefab()如果instantiate的是场景中已存在的gameobject会无效。object.Instantiate()更像是clone,而PrefabUtility.InstantiatePrefab()才是实实在在的实例化。

PrefabUtility.InstantiatePrefab()要求传递的是prefab资产,而不是scene中的对象,否则无法克隆

但为什么用Instantiate和PrefabUtility.InstantiatePrefab得到的图标不一样呢?
在这里插入图片描述
在这里插入图片描述
Creating GameObject at runtime from child prefab

7 PrefabUtility.InstantiatePrefab()与Instantiate 区别

这一篇详细介绍了两者的不同:Instantiate vs PrefabUtility.InstantiatePrefab

同时注意PrefabUtility只是用于Editor。需要添加注释
在这里插入图片描述

否则打包时会报错
在这里插入图片描述

Instantiate vs PrefabUtility.InstantiatePrefab

在这里插入图片描述

Instantiate original Prefab based on an already existing Prefab in game

在这里插入图片描述

Unity create prefab at runtime

8 PrefabAssetType

namespace UnityEditor
{/// <summary>///   <para>Enum indicating the type of Prefab Asset, such as Regular, Model and Variant.</para>/// </summary>public enum PrefabAssetType{/// <summary>///   <para>The object being queried is not part of a Prefab at all.</para>/// </summary>NotAPrefab,/// <summary>///   <para>The object being queried is part of a regular Prefab.</para>/// </summary>Regular,/// <summary>///   <para>The object being queried is part of a Model Prefab.</para>/// </summary>Model,/// <summary>///   <para>The object being queried is part of a Prefab Variant.</para>/// </summary>Variant,/// <summary>///   <para>The object being queried is part of a Prefab instance, but because the asset is missing the actual type of Prefab can’t be determined.</para>/// </summary>MissingAsset,}

在这里插入图片描述
在这里插入图片描述

9 prefab使用建议

在这里插入图片描述
《Unity性能优化》第玖节——编辑器创建资源优化(2)——预制体

10 总结

本文初步探究了关于prefab的一些疑惑,但并没有彻底弄清,不过至少比原先清晰了很多,后面可能还要研究AssetBundle和资源加载、序列化之类的才能更清楚些,等未来实战再遇到时再来研究吧。

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

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

相关文章

Redis基本命令

目录 一、包含String、Set数据类型的基本命令 1、添加一个键值对 2、获取key所关联的字符串值 3、同时设置多个key-value 4、获取多个key对应的值 运行结果 5、将给定的value追加到原值的末尾 追加后效果 6、删除单个key 7、同时删除多个key 8、查询包含某个字符的k…

ubuntu入门

基础命令 cd 切换命令 ls 查看当前目录下所有的文件 cp a.c b.c 拷贝a.c 到 b.c touch a.c 创建a.c文件 mkdir file 创建文件夹file rm file 删除文件 rmdir 删除test文件夹 rmdir test/ mv 移动文件 mv a.c b.c 把a.c 替换成b.c ifconfig 查看电脑网络信息 rm xx 删…

Mybatis进阶(动态SQL)

文章目录 1.动态SQL1.基本介绍1.为什么需要动态SQL2.基本说明3.动态SQL常用标签 2.环境搭建1.新建子模块2.删除不必要的两个文件夹3.创建基本结构4.父模块的pom.xml5.jdbc.properties6.mybatis-config.xml7.MyBatisUtils.java8.MonsterMapper.java9.MonsterMapper.xml10.测试Mo…

工业互联网通讯协议—欧姆龙(Fins tcp)

一、场景 近期公司要对欧姆龙CP系列设备的数据采集&#xff0c;于是就研究了下欧姆龙的Fins Tcp协议。 二、Fins Tcp 组成字节说明固定头446494E53 FINS对应的ASCII码的十六进制长度4后面剩余指令的长度命令4 握手固定为&#xff1a;00000000 读写固定为&#xff1a;0000000…

Unity 实现新手引导遮罩

Unity 复写OnPopulateMesh 实现新手引导遮罩、包含点击事件触发区域判断 https://download.csdn.net/download/shenliang34/89247117

【第3节】“茴香豆“:搭建你的 RAG 智能助理

目录 1 基础知识1.1.RAG技术的概述1.2 RAG的基本结构有哪些呢&#xff1f;1.3 RAG 工作原理&#xff1a;1.4 向量数据库(Vector-DB )&#xff1a;1.5 RAG常见优化方法1.6RAG技术vs微调技术 2、茴香豆介绍2.1应用场景2.2 场景难点2.3 茴香豆的构建&#xff1a; 3 论文快读4 实践…

15(第十四章,大数据和数据科学)

目录 概述 基本概念 数据仓库/传统商务智能与数据科学的比较 数据科学的过程 大数据 大数据来源 数据湖 机器学习 监督学习 无监督学习 强化学习 扩展 1、数据仓库&#xff08;Data Warehouse&#xff09; 2、数据湖(Data Lake) 3、大数据平台1.0 4、数据中台 …

外贸企业邮箱是什么?Zoho Mail——你的专业外贸邮局

外贸企业邮箱是什么&#xff1f;做外贸行业必须要有企业邮箱吗&#xff1f;这是一些外贸企业的困惑。外贸企业邮箱和我们平时使用的个人邮箱有着几方面的不同。一是安全稳定&#xff1b;二是功能丰富性&#xff1b;三是存储空间更大。Zoho Mail企业邮箱在这些方面都能满足外贸企…

OpenCV如何实现背投(58)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较(57) 下一篇&#xff1a;OpenCV如何模板匹配(59) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 OpenCV 函数 cv::calcBackP…

Java 获取 Outlook 邮箱的日历事件

Java 获取 Outlook 邮箱的日历事件 1.需求描述2.实现方案3.运行结果 IDE&#xff1a;IntelliJ IDEA 2022.3.3 JDK&#xff1a;1.8.0_351 Outlook&#xff1a;Microsoft Office 2016 1.需求描述 比如现在需要获取 Outlook 邮箱中四月的全部的会议安排&#xff0c;如下图所示 …

简单谈谈URL过滤在网络安全中的作用

用户花在网络上的时间越来越多&#xff0c;浏览他们最喜欢的网站&#xff0c;点击电子邮件链接&#xff0c;或利用各种基于网络的 SaaS 应用程序供个人和企业使用。虽然这种不受约束的网络活动对提高企业生产力非常有用&#xff0c;但也会使组织面临一系列安全和业务风险&#…

STM32G030F6P6TR 芯片TSSOP20 MCU单片机微控制器芯片

STM32G030F6P6TR 在物联网&#xff08;IoT&#xff09;设备中的典型应用案例包括但不限于以下几个方面&#xff1a; 1. 环境监测系统&#xff1a; 使用传感器来监测温度、湿度、气压等环境因素&#xff0c;并通过无线通信模块将数据发送到中央服务器或云端平台进行分析和监控。…

Windows之隐藏特殊文件夹(自定义快捷桌面程序)

作者主页&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月1日12点55分 祝大家劳动节快乐~ Windows中的特殊文件夹是指一些预定义的文件夹&#xff0c;用于存储特定类型的数据或文件。这些文件夹通常由操作系统或应用程序使用&#xff0c;但用户也可以访问和管理它…

selenium 4.x 入门(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 有建议要 1.0.1 版本的&#xff0c;但本人按上面的是可以正常使用&#xff08;看…

【docker 】Windows10安装 Docker

安装 Hyper-V Hyper-V 是微软开发的虚拟机&#xff0c;仅适用于 Windows 10。 按键&#xff1a; win键X &#xff0c;选着程序和功能 在查找设置中输入&#xff1a;启用或关闭Windows功能 选中Hyper-V 点击确定 安装 Docker Desktop for Windows Docker Desktop 官方下载…

013、Python+fastapi,第一个后台管理项目走向第13步:建立python+fastapi项目,创建cache模块

一、说明 在今天学习RuoYi-Vue3-FastAPI的代码过程中&#xff0c;我遇到了几个问题&#xff0c;下面说说自己的感想 二、自定义的log装饰器 源码中是log_annotation.py&#xff0c;代码也没什么好说的&#xff0c;这个知识点到处都是文章&#xff0c;可以在csdn上搜索学习&a…

数据结构—C语言实现双向链表

目录 1.双向带头循环链表 2.自定义头文件&#xff1a; 3.List.cpp 文件 3.1 newnode()函数讲解 3.2 init() 函数 初始化 3.3 pushback()函数 尾插 3.4 pushfront()函数 头插 3.5 popback() 尾删 3.6 popfront() 函数 头删 3.7 insert()函数 在pos之后插入 3.8 popbac…

ZooKeeper 环境搭建详细教程之三(真集群)

ZooKeeper 搭建详细步骤之三(真集群) ZooKeeper 搭建详细步骤之二(伪集群模式) ZooKeeper 搭建详细步骤之一(单机模式) ZooKeeper 及相关概念简介 真集群搭建 搭建 ZooKeeper 真集群涉及多个步骤,包括准备环境、配置文件设置、启动服务以及验证集群状态。 以下是一个简…

AC+AP三层组网实验(华为)

一&#xff0c;技术简介 APAC架构是一种常见的无线局域网&#xff08;WLAN&#xff09;组网方式&#xff0c;主要由接入点&#xff08;Access Point&#xff0c;简称AP&#xff09;和接入控制器&#xff08;Access Controller&#xff0c;简称AC&#xff09;组成。 在APAC架构…

PotatoPie 4.0 实验教程(25) —— FPGA实现摄像头图像直方图均衡变换

图像的直方图均衡是什么&#xff1f; 图像的直方图均衡是一种用于增强图像对比度的图像处理技术。在直方图均衡中&#xff0c;图像的像素值被重新分配&#xff0c;以使得图像的直方图变得更均匀&#xff0c;即各个像素值的分布更加平衡。这意味着直方图中每个像素值的频率大致…