Unity3d学习 预设体(prefab)的一些理解
之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题!
预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象.
创建预设体的作用: 可以重复的创建具有相同结构的游戏对象。
.1下面来讲解一下如何制作一个简单的预设体(上下为流程和结果图):
.2 创建多个prefabs_new(代码,结果图):
- using UnityEngine;
- using System.Collections;
- //[ExecuteInEditMode]表示在编辑模式下运行(注意改变prefab的属性其他属性也会变)
- public class CreateInstance : MonoBehaviour {
- public GameObject prefabs = null;
- private Vector3 pos;
- void Start () {
- if (prefabs != null)
- {
- pos = new Vector3(, 2.7f, -10.5114f);
- for (int i = ; i < ; ++i)
- {
- Object tmpObj = Instantiate(prefabs, pos , Quaternion.identity);
- pos.x = pos.x - ;
- }
- }
- else
- {
- Debug.Log("prefabs is null");
- }
- }
- }
如果(预设物C = 预设物B 和 预设物 A的组合) 则会形成 修改预设物A的数据不会影响预设物C中的内嵌数据,下面方法可以帮助解决!
.4关于perfab之间的嵌套(主要是一个perfab数据修改了嵌套这个perfab的数据要做对应的更新):
关于预设体嵌套预设体的代码(在实例化时会拿到最新的perfab数据):
- using UnityEngine;
- #if UNITY_EDITOR
- using UnityEditor;
- using UnityEditor.Callbacks;
- #endif
- using System.Collections.Generic;
- [ExecuteInEditMode]
- public class PrefabInstance : MonoBehaviour
- {
- public GameObject prefab;
- #if UNITY_EDITOR
- // Struct of all components. Used for edit-time visualization and gizmo drawing
- public struct Thingy {
- public Mesh mesh;
- public Matrix4x4 matrix;
- public List<Material> materials;
- }
- [System.NonSerializedAttribute] public List<Thingy> things = new List<Thingy> ();
- void OnValidate () {
- things.Clear();
- if (enabled)
- Rebuild (prefab, Matrix4x4.identity);
- }
- void OnEnable () {
- things.Clear();
- if (enabled)
- Rebuild (prefab, Matrix4x4.identity);
- }
- void Rebuild (GameObject source, Matrix4x4 inMatrix) {
- if (!source)
- return;
- Matrix4x4 baseMat = inMatrix * Matrix4x4.TRS (-source.transform.position, Quaternion.identity, Vector3.one);
- foreach (MeshRenderer mr in source.GetComponentsInChildren(typeof (Renderer), true))
- {
- things.Add(new Thingy () {
- mesh = mr.GetComponent<MeshFilter>().sharedMesh,
- matrix = baseMat * mr.transform.localToWorldMatrix,
- materials = new List<Material> (mr.sharedMaterials)
- });
- }
- foreach (PrefabInstance pi in source.GetComponentsInChildren(typeof (PrefabInstance), true))
- {
- if (pi.enabled && pi.gameObject.activeSelf)
- Rebuild (pi.prefab, baseMat * pi.transform.localToWorldMatrix);
- }
- }
- // Editor-time-only update: Draw the meshes so we can see the objects in the scene view
- void Update () {
- if (EditorApplication.isPlaying)
- return;
- Matrix4x4 mat = transform.localToWorldMatrix;
- foreach (Thingy t in things)
- for (int i = ; i < t.materials.Count; i++)
- Graphics.DrawMesh (t.mesh, mat * t.matrix, t.materials[i], gameObject.layer, null, i);
- }
- // Picking logic: Since we don't have gizmos.drawmesh, draw a bounding cube around each thingy
- void OnDrawGizmos () { DrawGizmos (new Color (,,,)); }
- void OnDrawGizmosSelected () { DrawGizmos (new Color (,,,.2f)); }
- void DrawGizmos (Color col) {
- if (EditorApplication.isPlaying)
- return;
- Gizmos.color = col;
- Matrix4x4 mat = transform.localToWorldMatrix;
- foreach (Thingy t in things)
- {
- Gizmos.matrix = mat * t.matrix;
- Gizmos.DrawCube(t.mesh.bounds.center, t.mesh.bounds.size);
- }
- }
- // Baking stuff: Copy in all the referenced objects into the scene on play or build
- [PostProcessScene(-)]
- public static void OnPostprocessScene() {
- foreach (PrefabInstance pi in UnityEngine.Object.FindObjectsOfType (typeof (PrefabInstance)))
- BakeInstance (pi);
- }
- public static void BakeInstance (PrefabInstance pi) {
- if(!pi.prefab || !pi.enabled)
- return;
- pi.enabled = false;
- GameObject go = PrefabUtility.InstantiatePrefab(pi.prefab) as GameObject;
- Quaternion rot = go.transform.localRotation;
- Vector3 scale = go.transform.localScale;
- go.transform.parent = pi.transform;
- go.transform.localPosition = Vector3.zero;
- go.transform.localScale = scale;
- go.transform.localRotation = rot;
- pi.prefab = null;
- foreach (PrefabInstance childPi in go.GetComponentsInChildren<PrefabInstance>())
- BakeInstance (childPi);
- }
- #endif
上述是两个 如果是多个关联呢?
Unity3d学习 预设体(prefab)的一些理解的更多相关文章
- Unity3D 基于预设(Prefab)的泛型对象池实现
背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...
- Unity3D学习笔记(四):物理系统碰撞和预制体
Rigidbody(刚体组件):加了此组件游戏物体就变成刚体了 ----Mass(质量,单位kg):重力G = 质量m * 重力加速度g(g=9.81 m/s^2) --------冲量守恒定理 动量 ...
- OpenNI结合Unity3D Kinect进行体感游戏开发(转)
OpenNI结合Unity3D Kinect进行体感游戏开发(转) 楼主# 更多 发布于:2012-07-17 16:42 1. 下载安装Unity3D(目前版本为3.4)2. 下载OpenN ...
- 【Unity】3.2 利用预设(Prefab)制作可复用的组件
分类:Unity.C#.VS2015 创建日期:2016-04-02 一.简介 预制体(Prefab,也叫预设)是"存储在工程视图(Project View)中"的一种特殊的资源, ...
- Unity -- 材质-Material和预设体-Prefabs
材质(Materials)用来把网格(Mesh)或粒子渲染器(Particle Renderers)贴到游戏对象上.他们在定义对象怎么被显示发挥重要组成部分.材质包括用于呈现网状或颗粒着色器的参考,所 ...
- 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. 渲染 ...
- Unity3D学习笔记4——创建Mesh高级接口
目录 1. 概述 2. 详论 3. 其他 4. 参考 1. 概述 在文章Unity3D学习笔记2--绘制一个带纹理的面中使用代码的方式创建了一个Mesh,不过这套接口在Unity中被称为简单接口.与其 ...
- Unity3D学习笔记7——GPU实例化(2)
目录 1. 概述 2. 详论 2.1. 实现 2.2. 解析 3. 参考 1. 概述 在上一篇文章<Unity3D学习笔记6--GPU实例化(1)>详细介绍了Unity3d中GPU实例化的 ...
- Unity3D学习笔记8——GPU实例化(3)
目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1)&g ...
随机推荐
- Android性能优化之巧用软引用与弱引用优化内存使用
前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...
- 浏览器中用JavaScript获取剪切板中的文件
本文转自我的个人网站 , 原文地址:http://www.zoucz.com/blog/2016/01/29/get-file-from-clipboard/ ,欢迎前往交流讨论 在网页上编辑内容 ...
- git克隆项目到本地&&全局安装依赖项目&&安装依赖包&&启动服务
一.安装本地开发环境 1.安装本项目 在需要保存到本地的项目的文件夹,进入到文件夹里点击右键,bash here,出现下图: 2.安装依赖项目 3.安装依赖包(进入到命令行) # 安装依赖包 $ ...
- c#语言规范
0x00 分类 C#语言规范主要有两个来源,即我们熟知的ECMA规范和微软的规范.尽管C#的ECMA规范已经前后修订4次,但其内容仅仅到C# 2.0为止.所以慕容为了方便自己和各位方便查询,在此将常见 ...
- golang struct扩展函数参数命名警告
今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.c ...
- Selenium-java-获取当前时间
1 获取当前时间 // 获取当前时分秒 Calendar now = Calendar.getInstance(); int is = now.get(Calendar.HOUR_OF_DAY); i ...
- EMD分析 Matlab 精华总结 附开源工具箱(全)
前言: 本贴写于2016年12与15日,UK.最近在学习EMD(Empirical Mode Decomposition)和HHT(Hilbert-Huang Transform)多分辨信号处理,FQ ...
- Netty实现高性能RPC服务器优化篇之消息序列化
在本人写的前一篇文章中,谈及有关如何利用Netty开发实现,高性能RPC服务器的一些设计思路.设计原理,以及具体的实现方案(具体参见:谈谈如何使用Netty开发实现高性能的RPC服务器).在文章的最后 ...
- 扑面而来的碎片--图片3D炸裂效果初体验
之前逛园子的时候看到 ChokCoco 的爆炸效果作品:[BOOM]一款有趣的Javascript动画效果 (大神英文有没有拼错呀←.←),觉得蛮有意思的,效果如下: 不过觉得这个爆炸效果还是偏软了一 ...
- 搞了我一下午竟然是web.config少写了一个点
Safari手机版居然有个这么愚蠢的bug,浪费了我整个下午,使尽浑身解数,国内国外网站搜索解决方案,每一行代码读了又想想了又读如此不知道多少遍,想破脑袋也想不通到底哪里出了问题,结果竟然是web.c ...