【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和资源加载、序列化之类的才能更清楚些,等未来实战再遇到时再来研究吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的租房网站

基于SpringbootVue的租房网站的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 房屋信息 交流论坛 房屋资讯 后台登录 用户管理 房屋类型管理 房屋信息管理 预…

关于权限的设计

首先系统权限&#xff0c;每个账号登录后&#xff0c;都需要知道这个账号允许访问哪些api&#xff0c;哪些数据权限&#xff08;一般是指其他账号的一些数据&#xff09; 这里就需要通过角色来关联。 --1.角色绑定菜单&#xff0c;每个菜单设计的时候包含了这个菜单会用到的所…

【成功案例】利用多款国产内网渗透工具勒索数十台虚拟机的babyk解密恢复项目

1.背景 2024年4月11日&#xff0c;某影视公司的服务器遭受了勒索软件攻击&#xff0c;随后向我司寻求帮助进行恢复。经过我司溯源排查&#xff0c;勒索组织通过一处用友NC资产进行入侵&#xff0c;攻击者利用国产工具横移了数小时后实施勒索。其中一台超融合&#xff08;vcente…

监控员工上网有什么软件(2024三款受欢迎的员工上网监控软件盘点)

企业对员工上网行为的有效监管显得愈发重要。 既要确保工作效率与信息安全&#xff0c;又要尊重员工隐私并遵守相关法律法规&#xff0c;选择一款功能强大、合规且易于使用的员工上网监控软件至关重要。 本文将为您介绍2024年三款备受市场欢迎的员工上网监控软件&#xff0c;以…

20232801 2023-2024-2 《网络攻防实践》实践八报告

20232801 2023-2024-2 《网络攻防实践》实践八报告 1.实践内容 1.动手实践任务: 对提供的rada恶意代码样本&#xff0c;进行文件类型识别&#xff0c;脱壳与字符串提取&#xff0c;以获得rada恶意代码的编写作者. 2.动手实践任务二&#xff1a;分析Crackme程序 在WinXP Attac…

LeetCode 每日一题 ---- 【1017.负二进制转换】

LeetCode 每日一题 ---- 【1017.负二进制转换】 1017.负二进制转换方法一&#xff1a;模拟进制转换推广&#xff1a;任意进制转换 1017.负二进制转换 方法一&#xff1a;模拟进制转换 我们平常做进制转换最常用的方法就是辗转相除法&#xff0c;下面的图示分别给出了普通的10…

pmp培训哪家好?高通过率的靠谱机构如何选择

PMP培训机构的选择本来就是一个需要有挑选的人才能顺利进行&#xff0c;所以如果你正好是PMP小白的话一定要抓紧补充一下自己在挑选机构方面的知识&#xff0c;理清自己的需求才能进行多维度的挑选&#xff0c;最后才能选择一个比较合适的机构。已经换证一次的老鸟路过&#xf…

Linux网络开发基础知识

一个网络服务器的简单实现 项目需求 实现回声服务器的客户端/服务器程序&#xff0c;客户端通过网络连接到服务器&#xff0c;并发送任意一串英文信息&#xff0c;服务器端接收信息后&#xff0c; 将每个字符转换为大写并回送给客户端显示。 eoch_client.c #include <arpa/i…

利用RunnerGo数据大屏强化测试管理与决策

测试平台中的数据大屏在提供实时监控、统计分析、效率提升、制定策略和促进沟通等方面具有重要的意义。它为测试团队提供更全面、更直观的数据支持&#xff0c;有助于提高测试质量和效率&#xff0c;减少风险&#xff0c;并加强团队协作和沟通。 数据大屏也是RunnerGo的核心特…

软考高级 | 系统架构设计师笔记(二)

三. 软件架构设计 3.1 概述 a 定义 软件或计算机系统的软件架构是该系统的一个&#xff08; 或多个&#xff09; 结构&#xff0c; 而结构由软件元素、 元 素的外部可见属性及它们之间的关系组成。 软件系统架构是关于软件系统的 结构、 行为和属性 的高级抽象。 指定…

【车辆管理】车辆位置监控管理方案

车辆位置监控管理方案 位置管理模块&#xff0c;实现管理车辆基于位置的管理功能。包括实时位置追踪、历史轨迹回放、电子围栏配置等功能。模块关键功能如下&#xff1a; 1、实时位置调度 应用公网的无线传输作为数据传输的载体&#xff0c;真正地实现对车辆位置的全天候实时…

OLED(SSD1306+I2C协议显示屏模块)

工具 1.Proteus 8 仿真器 2.keil 5 编辑器 原理图 讲解 简介 OLED&#xff08;Organic Light-Emitting Diode&#xff09;显示屏&#xff0c;即有机发光二极管显示屏&#xff0c;是一种新型显示技术。它的工作原理是通过电流驱动有机材料发光&#xff0c;无需背光灯&#x…

MyBatis 插件介绍及应用

MyBatis 插件介绍及应用 MyBatis 是一个持久层框架&#xff0c;它允许开发者自定义 SQL 语句并将其映射到 Java 对象中。MyBatis 提供了一种灵活的数据库操作方式&#xff0c;但随着项目的复杂度增加&#xff0c;一些通用功能如分页、缓存、事务管理等可能需要重复编写。为了解…

【网络原理】IP协议的地址管理和路由选择

系列文章目录 【网络通信基础】网络中的常见基本概念 【网络编程】网络编程中的基本概念及Java实现UDP、TCP客户端服务器程序&#xff08;万字博文&#xff09; 【网络原理】UDP协议的报文结构 及 校验和字段的错误检测机制&#xff08;CRC算法、MD5算法&#xff09; 【网络…

uniapp-vue3-wechat:基于uniapp+vue3仿微信app聊天实例(H5+小程序+App端)

uni-vue3-wchat&#xff1a;基于uni-appvue3pinia2高仿微信app聊天模板。 原创基于最新跨端技术uni-appvue3.xpinia2vite4uv-ui构建三端仿微信app界面聊天实例。实现编辑框多行消息/emoj混合、长按触摸式仿微信语音面板、图片/视频预览、红包/朋友圈等功能。支持编译到H5小程序…

unity3d使用3D WebView播放网页中的视频

Unity2021.3.35f1&#xff0c;硬件ESP32-Cam&#xff0c;3D WebView插件 1.新建工程&#xff0c;导入3D WebView for Winfows和3D WebView for Android 2.打开场景Assets\Vuplex\WebView\Demos\Scenes\2_CanvasWebViewDemo 3.修改Canvas的Render Mode为Screen Space-Camera&am…

Spark持久化、broadcast广播变量和accumulator累加器

持久化操作 什么是持久化&#xff0c;为什么要持久化 Spark中最重要的功能之一是跨操作在内存中持久化&#xff08;或缓存&#xff09;数据集。当您持久化RDD时&#xff0c;每个节点将其计算的任何分区存储在内存中&#xff0c;并在该数据集&#xff08;或从该数据集派生的数…

AI大模型日报#0429:人大多模态Awaker1.0、清华「AI+材料」落地、微软小模型Orca-Math、GenAI黄金法则

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了今日要点以及每条资讯的摘要。AI大模型日报今日要点&#xff1a; 中山大学与重庆大学合作开发的基于Transformer的单细胞注释方法SANGO在跨样本、平台和组织…

平安城市 校园 景区 停车场网络语音对讲立柱SV-11TS

平安城市 校园 景区 停车场网络语音对讲立柱SV-11TS 长方形立柱式设计&#xff0c;外观简约&#xff0c;线条优美&#xff0c;工艺考究&#xff0c;坚固耐用可一键实现在紧急情况下求助报警、事件咨询&#xff0c;与SIP网络对讲主机进行全双工对讲。内置警示灯&#xff0c;呼叫…

接口自动化框架篇:使用python连接数据库 - PySQL介绍!

PySQL介绍&#xff1a;使用Python连接数据库的接口自动化框架 在接口自动化测试中&#xff0c;经常需要使用数据库来操作测试数据&#xff0c;验证接口返回的数据是否正确。Python是一种功能强大的编程语言&#xff0c;可以轻松地连接数据库&#xff0c;并进行各种数据库操作。…