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

news2024/12/23 10:37:36

目录

      • 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.coloradmin.cn/o/1630527.html

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

相关文章

【LeetCode刷题记录】简单篇-70-爬楼梯

【题目描述】 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 【测试用例】 示例1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1.1阶 1阶…

EI会议、投稿优惠2024年计算机科学与神经网络国际会议(ICCSNN 2024)开始征稿啦!!

2024 International Conference on Computer Science and Neural Networks 一、大会信息 会议名称&#xff1a;2024年计算机科学与神经网络国际会议会议简称&#xff1a;ICCSNN 2024收录检索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等会议官网&#xff1a;http…

蓦然回首,追忆那些备战OCM的日子

蓦然回首 前段时间偶然在墨天轮群看到一位在墨天轮轮社区非常活跃的老兄发的《那些年&#xff0c;我们一起追过的OCP》的文章&#xff0c;获悉墨天轮在举办【我的备考经验】的有奖征文活动&#xff0c;打开那篇文章&#xff0c;一下子又把我的思绪拉回到了好几年前&#xff0c;…

ruoyi实现大文件上传

前端&#xff1a; 安装依赖 1.在package.json文件中添加"vue-simple-uploader": "^0.7.4","spark-md5": "^3.0.1"到dependencies中&#xff1b;devDependencies中"node-sass": "^4.9.0", "sass-loader&quo…

Redis面试题三(集群)

目录 1.Redis 集群搭建有几种模式 2.Redis 主从复制的实现 全量同步 增量同步 3.Redis 的主从同步策略 1. 全量同步&#xff08;Full Resynchronization&#xff09; 2. 增量同步&#xff08;Incremental Replication&#xff09; 4.Redis一致性hash 基本原理 节点动态…

BAPI_ACC_DOCUMENT_POST 凭证过账及增强

METHOD document_post.DATA ls_documentheader TYPE bapiache09. "表头DATA ls_accountgl TYPE bapiacgl09.DATA lt_accountgl TYPE STANDARD TABLE OF bapiacgl09. "总账项目DATA ls_accountreceivable TYPE bapiacar09.DATA lt_accountreceivable TYPE STANDARD TA…

LVS/NAT工作模式介绍及配置

1.1 LVS/NAT模式工作原理 LVS&#xff08;Linux Virtual Server&#xff09;的网络地址转换&#xff08;NAT&#xff09;模式是一种在网络层&#xff08;第四层&#xff09;实现负载均衡的方法。在NAT模式中&#xff0c;Director Server&#xff08;DS&#xff09;充当所有服务…

[Diffusion Model笔记] DDPM数学推导版 2024.04.23

本文是观看以下视频的笔记&#xff1a; https://www.bilibili.com/video/BV1CU4y1i7jn/?p4&spm_id_frompageDriver 其他参考 https://zhuanlan.zhihu.com/p/614147698 https://zhuanlan.zhihu.com/p/563661713 这个写的非常详细&#xff1a; https://www.zhihu.com/ques…

【新手必读】Airtest测试Android手机常见的设置问题

经常有新手同学在使用Airtest测试Android手机的时候&#xff0c;遇到各式各样的问题&#xff0c;其中很大一部分&#xff0c;都是因为Android手机的设置不当&#xff0c;比如&#xff1a; 因为没有登录华为/荣耀/小米账号&#xff0c;而无法开启USB调试功能 因为没有关闭防止恶…

06_Scala流程控制

文章目录 [toc] 1.流程控制**小结&#xff1a;** **2. Scala中流程控制没有三元运算符****2.1 Scala中如果逻辑代码只有一行可以省略花括号****小结&#xff1a;** **3. 循环控制****3.1 for控制****3.2循环守卫 --> 循环表达式添加逻辑判断****3.3 循环步长 --> 表示循环…

IntelliJ IDEA 如何启用 JDK 预览特性

IntelliJ IDEA 也可以启用 JDK 的预览特性。 针对项目&#xff0c;选择项目结构。 配置是在语言结构上。 单击语言结构上的 SDK 默认&#xff0c;往下拉&#xff0c;就可以看到针对新版本的选项。 同时还可以看到那些版本是支持新特性预览的&#xff0c;那些版本是不支持新特…

Python 使用相对路径读取文件失败

python open一个问及那时使用绝对路径可以&#xff0c;但是使用相对路径时报错&#xff0c;找不到指定文件 解决步骤如下&#xff1a; 添加Python配置 在新增的配置Json文件添加下图红框这一行

Linux——(关于权限常见的3个问题)

文章目录 1.修改文件或者目录的拥有者和所属组1.1chown指令1.2chgrp指令 2.常见的权限三个问题2.1对应一个目录&#xff0c;如果要进入&#xff0c;需要什么权限&#xff1f;2.2为什么我们创建的文件默认权限不是7772.2.1关于Linux下的权限掩码 2.3文件能否被删除取决于什么2.3…

与Apollo共创生态:Apollo7周年大会自动驾驶生态利剑出鞘

前言 4月22日&#xff0c;百度Apollo在北京车展前夕举办了以“破晓•拥抱智变时刻”为主题的智能汽车产品发布会&#xff0c;围绕汽车智能化&#xff0c;发布了智驾、智舱、智图等全新升级的“驾舱图”系列产品。 1、7周年大会 自2013年百度开始布局自动驾驶&#xff0c;201…

吴恩达2022机器学习专项课程(一) 6.2 逻辑回归第三周课后实验:Lab2逻辑回归

问题预览/关键词 逻辑回归预测分类创建逻辑回归算法Sigmoid函数Sigmoid函数的表示sigmoid输出的结果Numpy计算指数的方法实验python实现sigmoid函数打印输入的z值和sigmoid计算的值可视化z值和sigmoid的值添加更多数据&#xff0c;使用逻辑回归可以正常预测分类![在这里插入图片…

GMSSL编译iOS

一、GMSSL-2.x 国密SDK源码下载&#xff0c;对GMSSL库进行编译生成对应的静态库。执行如下命令&#xff1a; cd到SDK源码目录 cd /Users/xxxx/Downloads/GMSSLV2-master查看SDK适用环境 ./config上图中错误解决方法 使用文本编辑器打开SDK目录下Configure、test/build.info、…

第十五届蓝桥杯省赛第二场C/C++B组C题【传送阵】题解(AC)

解题思路 由于 a a a 数组是一个 1 1 1 到 n n n 的一个排列&#xff0c;那么形成的一定是如下形式&#xff1a; 一定会构成几个点的循环&#xff0c;或者是几个单独的点。 从任意点开始&#xff0c;如果能进入一个循环&#xff0c;一定可以将整个循环的宝藏都拿走&#x…

android room 数据库升级的原则

1.如果新加了一张数据表则什么都不用干直接database那里将数据库版本升1 就可以nichuang 在entities里增加新加的entity ProviderMeta.DB_VERSION 版本号增1 room会自动生成 一个ProviderMeta.DB_VERSION 版本号的json文件 比如实例中升级到70 就会生成一个70.json的文件这是r…

发电厂智能巡检机器人:让发电厂更安全、更高效

在发电厂的众多应用场景中&#xff0c;升压站、化学车间、空冷塔、输煤皮带、综合管廊等&#xff0c;一直以来都是人工巡检的主战场。然而&#xff0c;这些场所环境极为复杂&#xff0c;人工巡检面临着诸多难题&#xff0c;强度大、频率低、间隔长等问题突出。这使得设备在运行…

三星应用TRIZ创新方法的经验分享:探索科技前沿的奥秘

TRIZ&#xff0c;即发明问题解决理论&#xff0c;于1946年被提出。它是一种基于知识和经验的创新方法&#xff0c;旨在帮助人们快速有效地解决各种复杂问题。TRIZ理论包含了大量的创新原理、算法和工具&#xff0c;可以帮助企业快速识别问题、寻找解决方案&#xff0c;并推动创…