【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.mzph.cn/diannao/4731.shtml

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

相关文章

卫浴品牌商家做展示预约小程序的作用是什么

卫浴品牌类别多、普通/智能、场景化等&#xff0c;无论企业还是经销商市场门店都比较饱满&#xff0c;虽然市场需求度高&#xff0c;但同样需要商家不断拓宽销售渠道和挖掘客户价值&#xff0c;破圈增长。 线上多平台发展尤为重要&#xff0c;而小程序作为连接点&#xff0c;对…

PostgreSQL的学习心得和知识总结(一百三十九)|深入理解PostgreSQL数据库GUC参数 allow_alter_system 的使用和原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

C++ //练习 14.2 为Sales_data编写重载的输入、输出、加法和复合赋值运算符。

C Primer&#xff08;第5版&#xff09; 练习 14.2 练习 14.2 为Sales_data编写重载的输入、输出、加法和复合赋值运算符。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /************************************************…

Windows使用bat远程操作Linux并执行命令

背景&#xff1a;让客户可以简单在Windows中能自己执行 Linux中的脚本&#xff0c;傻瓜式操作&#xff01; 方法&#xff1a;做一个简单的bat脚本&#xff01;能远程连接到Linux&#xff0c;并执行Linux命令&#xff01;客户双击就能使用&#xff01; 1、原先上网查询到使用P…

Java | Leetcode Java题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; public class Solution {public boolean canJump(int[] nums) {int n nums.length;int rightmost 0;for (int i 0; i < n; i) {if (i < rightmost) {rightmost Math.max(rightmost, i nums[i]);if (rightmost > n - 1) {retu…

社交技巧:网络社交有哪些优点?

既然网络社交已经成为了我们进行社交的一个必不可少的方式&#xff0c;那今天就来和大家分析一下&#xff0c;网络社交有哪些优点&#xff0c;以帮助大家更恰当地使用社交媒体 1.拓展更多的关系机会 有很多人在现实生活中可能过于内向腼腆&#xff0c;有社交焦虑&#xff0c;这…

C#-快速剖析文件和流,并使用(持续更新)

目录 一、概述 二、文件系统 1、检查驱动器信息 2、Path 3、文件和文件夹 三、流 1、FileStream 2、StreamWriter与StreamReader 3、BinaryWriter与BinaryReader 一、概述 文件&#xff0c;具有永久存储及特定顺序的字节组成的一个有序、具有名称的集合&#xff1b; …

Pandas dataframe 中显示包含NaN值的单元格

大部分教程只讲如何打印含有NA的列或行。这个函数可以直接定位到单元格&#xff0c;当dataframe的行和列都很多的时候更加直观。 # Finding NaN locations for df.loc def locate_na(df):nan_indices set()nan_columns set()for col, vals in df_descriptors.items():for in…

小米汽车充电枪继电器信号

继电器型号&#xff1a; 参考链接 小米SU7&#xff0c;便捷充放电枪拆解 (qq.com)https://mp.weixin.qq.com/s?__bizMzU5ODA2NDg4OQ&mid2247486086&idx1&sn0dd4e7c9f7c72d10ea1c9f506faabfcc&chksmfe48a110c93f2806f6e000f6dc6b67569f6e504220bec14654ccce7d…

Qt 6 开源版(免费) -- 安装图解

Qt6起&#xff0c;两项重大改变&#xff08;并非指技术&#xff09;&#xff1a; 必须在线安装&#xff0c;不再提供单独的安装包主推收费的商业版 当然的&#xff0c;为了引流、培养市场&#xff0c;提供了一个免费的开源版本。 开源版相对于收费的商业版&#xff0c;主体是…

【YOLO改进】换遍IoU损失函数之SIoU Loss(基于MMYOLO)

SIoU损失函数 论文链接:https://arxiv.org/pdf/2205.12740 SIoU&#xff08;Simplified IoU&#xff09;损失函数是一种基于IoU&#xff08;Intersection over Union&#xff09;的改进损失函数&#xff0c;主要用于目标检测任务中的边界框回归。与传统的IoU损失函数相比&…

linux运行python怎么结束

假如你已经进入到【>>>】&#xff0c;那么输入【quit&#xff08;&#xff09;】&#xff0c;然后按一下回车键即可退出了。 如果是想要关闭窗口的&#xff0c;那么直接在这个窗口上按【ctrld】。

AI项目二十:基于YOLOv8实例分割的DeepSORT多目标跟踪

若该文为原创文章&#xff0c;转载请注明原文出处。 前面提及目标跟踪使用的方法有很多&#xff0c;更多的是Deepsort方法。 本篇博客记录YOLOv8的实例分割deepsort视觉跟踪算法。结合YOLOv8的目标检测分割和deepsort的特征跟踪&#xff0c;该算法在复杂环境下确保了目标的准…

FPM 快速报表开发

背景&#xff1a; 使用FPM开发报表时&#xff0c;如果报表字段过多&#xff0c;页面拖拽等操作不方便 报表数量过多时&#xff0c;新建应用操作步骤较为繁琐 更习惯通过少量代码而非页面操作去实现功能 处理&#xff1a; 将FPM报表开发简化为类似GUI端ALV的开发过程:&#xff…

秋招后端开发面试题 - Java语言基础(上)

目录 Java基础上前言面试题Java 语言的特点JVM JDK JRE什么是跨平台性&#xff1f;原理是什么&#xff1f;什么是字节码?采用字节码的好处是什么?Java 和 C 的区别&#xff1f;注释&#xff1f;关键字关键字 instanceof类型转换关键字 this 和 super关键字 final finally fin…

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 打家劫舍 II(难度⭐⭐)(67)

1. 题目解析 题目链接&#xff1a;213. 打家劫舍 II 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 这个问题是经典的“打家劫舍”问题的变种&#xff0c;原问题是在单排房屋中进行偷窃&#xff0c;而这个问题则是在…

【论文精读】多模态系列:ALBEF、VLMo、BLIP、CoCa、BeiTv3

系列文章目录 【论文精读】CLIP&#xff1a;Learning Transferable Visual Models From Natural Language Supervision 从自然语言监督中学习可迁移的视觉模型 论文精读】CLIP 改进工作&#xff08;LSeg、GroupViT、VLiD、 GLIPv1、 GLIPv2、CLIPasso、CLIP4clip、ActionCLIP&…

机器学习:基于Sklearn框架,使用逻辑回归对由心脏病引发的死亡进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

Linux网络编程---多路I/O转接服务器(一)

多路I/O转接服务器 多路IO转接服务器也叫做多任务IO服务器。该类服务器实现的主旨思想是&#xff0c;不再由应用程序自己监视客户端连接&#xff0c;取而代之由内核替应用程序监视文件。 主要使用的方法有三种&#xff1a;select、poll、epoll 一、select多路IO转接 让内核去…

js实现倒计时效果

实现效果 实现代码 const computingTime startTime > {// 目标日期const targetDate new Date(startTime).getTime();// 每秒更新倒计时const timer setInterval(function() {// 当前时间const now new Date().getTime();// 距离目标时间的毫秒数const distance targe…