之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题!

预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象.

创建预设体的作用: 可以重复的创建具有相同结构的游戏对象。

.1下面来讲解一下如何制作一个简单的预设体(上下为流程和结果图):

  

  

.2 创建多个prefabs_new(代码,结果图):

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. //[ExecuteInEditMode]表示在编辑模式下运行(注意改变prefab的属性其他属性也会变)
  5. public class CreateInstance : MonoBehaviour {
  6. public GameObject prefabs = null;
  7. private Vector3 pos;
  8. void Start () {
  9. if (prefabs != null)
  10. {
  11. pos = new Vector3(, 2.7f, -10.5114f);
  12. for (int i = ; i < ; ++i)
  13. {
  14. Object tmpObj = Instantiate(prefabs, pos , Quaternion.identity);
  15. pos.x = pos.x - ;
  16. }
  17. }
  18. else
  19. {
  20. Debug.Log("prefabs is null");
  21. }
  22. }
  23. }

  

如果(预设物C = 预设物B 和 预设物 A的组合) 则会形成 修改预设物A的数据不会影响预设物C中的内嵌数据,下面方法可以帮助解决!

.4关于perfab之间的嵌套(主要是一个perfab数据修改了嵌套这个perfab的数据要做对应的更新):

关于预设体嵌套预设体的代码(在实例化时会拿到最新的perfab数据):

  1. using UnityEngine;
  2. #if UNITY_EDITOR
  3. using UnityEditor;
  4. using UnityEditor.Callbacks;
  5. #endif
  6. using System.Collections.Generic;
  7.  
  8. [ExecuteInEditMode]
  9. public class PrefabInstance : MonoBehaviour
  10. {
  11. public GameObject prefab;
  12.  
  13. #if UNITY_EDITOR
  14. // Struct of all components. Used for edit-time visualization and gizmo drawing
  15. public struct Thingy {
  16. public Mesh mesh;
  17. public Matrix4x4 matrix;
  18. public List<Material> materials;
  19. }
  20.  
  21. [System.NonSerializedAttribute] public List<Thingy> things = new List<Thingy> ();
  22.  
  23. void OnValidate () {
  24. things.Clear();
  25. if (enabled)
  26. Rebuild (prefab, Matrix4x4.identity);
  27. }
  28.  
  29. void OnEnable () {
  30. things.Clear();
  31. if (enabled)
  32. Rebuild (prefab, Matrix4x4.identity);
  33. }
  34.  
  35. void Rebuild (GameObject source, Matrix4x4 inMatrix) {
  36. if (!source)
  37. return;
  38.  
  39. Matrix4x4 baseMat = inMatrix * Matrix4x4.TRS (-source.transform.position, Quaternion.identity, Vector3.one);
  40.  
  41. foreach (MeshRenderer mr in source.GetComponentsInChildren(typeof (Renderer), true))
  42. {
  43. things.Add(new Thingy () {
  44. mesh = mr.GetComponent<MeshFilter>().sharedMesh,
  45. matrix = baseMat * mr.transform.localToWorldMatrix,
  46. materials = new List<Material> (mr.sharedMaterials)
  47. });
  48. }
  49.  
  50. foreach (PrefabInstance pi in source.GetComponentsInChildren(typeof (PrefabInstance), true))
  51. {
  52. if (pi.enabled && pi.gameObject.activeSelf)
  53. Rebuild (pi.prefab, baseMat * pi.transform.localToWorldMatrix);
  54. }
  55. }
  56.  
  57. // Editor-time-only update: Draw the meshes so we can see the objects in the scene view
  58. void Update () {
  59. if (EditorApplication.isPlaying)
  60. return;
  61. Matrix4x4 mat = transform.localToWorldMatrix;
  62. foreach (Thingy t in things)
  63. for (int i = ; i < t.materials.Count; i++)
  64. Graphics.DrawMesh (t.mesh, mat * t.matrix, t.materials[i], gameObject.layer, null, i);
  65. }
  66.  
  67. // Picking logic: Since we don't have gizmos.drawmesh, draw a bounding cube around each thingy
  68. void OnDrawGizmos () { DrawGizmos (new Color (,,,)); }
  69. void OnDrawGizmosSelected () { DrawGizmos (new Color (,,,.2f)); }
  70. void DrawGizmos (Color col) {
  71. if (EditorApplication.isPlaying)
  72. return;
  73. Gizmos.color = col;
  74. Matrix4x4 mat = transform.localToWorldMatrix;
  75. foreach (Thingy t in things)
  76. {
  77. Gizmos.matrix = mat * t.matrix;
  78. Gizmos.DrawCube(t.mesh.bounds.center, t.mesh.bounds.size);
  79. }
  80. }
  81.  
  82. // Baking stuff: Copy in all the referenced objects into the scene on play or build
  83. [PostProcessScene(-)]
  84. public static void OnPostprocessScene() {
  85. foreach (PrefabInstance pi in UnityEngine.Object.FindObjectsOfType (typeof (PrefabInstance)))
  86. BakeInstance (pi);
  87. }
  88.  
  89. public static void BakeInstance (PrefabInstance pi) {
  90. if(!pi.prefab || !pi.enabled)
  91. return;
  92. pi.enabled = false;
  93. GameObject go = PrefabUtility.InstantiatePrefab(pi.prefab) as GameObject;
  94. Quaternion rot = go.transform.localRotation;
  95. Vector3 scale = go.transform.localScale;
  96. go.transform.parent = pi.transform;
  97. go.transform.localPosition = Vector3.zero;
  98. go.transform.localScale = scale;
  99. go.transform.localRotation = rot;
  100. pi.prefab = null;
  101. foreach (PrefabInstance childPi in go.GetComponentsInChildren<PrefabInstance>())
  102. BakeInstance (childPi);
  103. }
  104.  
  105. #endif

上述是两个 如果是多个关联呢?

Unity3d学习 预设体(prefab)的一些理解的更多相关文章

  1. Unity3D 基于预设(Prefab)的泛型对象池实现

    背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...

  2. Unity3D学习笔记(四):物理系统碰撞和预制体

    Rigidbody(刚体组件):加了此组件游戏物体就变成刚体了 ----Mass(质量,单位kg):重力G = 质量m * 重力加速度g(g=9.81 m/s^2) --------冲量守恒定理 动量 ...

  3. OpenNI结合Unity3D Kinect进行体感游戏开发(转)

    OpenNI结合Unity3D Kinect进行体感游戏开发(转) 楼主# 更多 发布于:2012-07-17 16:42     1. 下载安装Unity3D(目前版本为3.4)2. 下载OpenN ...

  4. 【Unity】3.2 利用预设(Prefab)制作可复用的组件

    分类:Unity.C#.VS2015 创建日期:2016-04-02 一.简介 预制体(Prefab,也叫预设)是"存储在工程视图(Project View)中"的一种特殊的资源, ...

  5. Unity -- 材质-Material和预设体-Prefabs

    材质(Materials)用来把网格(Mesh)或粒子渲染器(Particle Renderers)贴到游戏对象上.他们在定义对象怎么被显示发挥重要组成部分.材质包括用于呈现网状或颗粒着色器的参考,所 ...

  6. Unity3D学习笔记3——Unity Shader的初步使用

    目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...

  7. Unity3D学习笔记4——创建Mesh高级接口

    目录 1. 概述 2. 详论 3. 其他 4. 参考 1. 概述 在文章Unity3D学习笔记2--绘制一个带纹理的面中使用代码的方式创建了一个Mesh,不过这套接口在Unity中被称为简单接口.与其 ...

  8. Unity3D学习笔记7——GPU实例化(2)

    目录 1. 概述 2. 详论 2.1. 实现 2.2. 解析 3. 参考 1. 概述 在上一篇文章<Unity3D学习笔记6--GPU实例化(1)>详细介绍了Unity3d中GPU实例化的 ...

  9. Unity3D学习笔记8——GPU实例化(3)

    目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1)&g ...

随机推荐

  1. Android性能优化之巧用软引用与弱引用优化内存使用

    前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...

  2. 浏览器中用JavaScript获取剪切板中的文件

    本文转自我的个人网站  , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/  ,欢迎前往交流讨论 在网页上编辑内容 ...

  3. git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务

     一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目  3.安装依赖包(进入到命令行) # 安装依赖包 $ ...

  4. c#语言规范

    0x00 分类 C#语言规范主要有两个来源,即我们熟知的ECMA规范和微软的规范.尽管C#的ECMA规范已经前后修订4次,但其内容仅仅到C# 2.0为止.所以慕容为了方便自己和各位方便查询,在此将常见 ...

  5. golang struct扩展函数参数命名警告

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...

  6. Selenium-java-获取当前时间

    1 获取当前时间 // 获取当前时分秒 Calendar now = Calendar.getInstance(); int is = now.get(Calendar.HOUR_OF_DAY); i ...

  7. EMD分析 Matlab 精华总结 附开源工具箱(全)

    前言: 本贴写于2016年12与15日,UK.最近在学习EMD(Empirical Mode Decomposition)和HHT(Hilbert-Huang Transform)多分辨信号处理,FQ ...

  8. Netty实现高性能RPC服务器优化篇之消息序列化

    在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...

  9. 扑面而来的碎片--图片3D炸裂效果初体验

    之前逛园子的时候看到 ChokCoco 的爆炸效果作品:[BOOM]一款有趣的Javascript动画效果 (大神英文有没有拼错呀←.←),觉得蛮有意思的,效果如下: 不过觉得这个爆炸效果还是偏软了一 ...

  10. 搞了我一下午竟然是web.config少写了一个点

    Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...