【Unity】3.2 利用預設(Prefab)製作可復用的組件

来源:http://www.cnblogs.com/rainmj/archive/2016/04/02/5347130.html
-Advertisement-
Play Games

分類:Unity、C#、VS2015 創建日期:2016-04-02 一、簡介 預製體(Prefab,也叫預設)是“存儲在工程視圖(Project View)中”的一種特殊的資源,是一種可重覆使用的游戲對象(GameObject)的容器。 如果在Project中有多個預製體(Prefab),為了容易... ...


分類:Unity、C#、VS2015

創建日期:2016-04-02

一、簡介

預製體(Prefab,也叫預設)是“存儲在工程視圖(Project View)中”的一種特殊的資源,是一種可重覆使用的游戲對象(GameObject)的容器。

如果在Project中有多個預製體(Prefab),為了容易查找,可將這些預製體全部保存到Project視圖中Assets文件夾的Prefabs子文件夾下。

Prefabs子文件夾下的的所有預製體都可以放入到多個場景中,而且即使在同一個場景中仍然可以多次使用。

向場景中添加一個預製體就是創建該預製體的一個實例。另外,由於場景(Scene)中所有預製體的實例都會自動鏈接到Project中的原始預製體(Prefab),因此這些實例本質上就是原始預製體的克隆。或者說,不論場景中有多少個預製體實例,只要僅僅對Project中某個Prefab作出任何更改,你就會看到這些更改馬上就能應用於場景中該Prefab的所有實例。

1、在工程視圖(Project)中創建預製體(Prefab)

要在Project中創建一個預製體(Prefab),只需將你在場景(Scene)中創建的一個游戲對象 (GameObject)拖放到工程視圖(Project View)中的某個Prefab中。

如果層級視圖(Hierarchy)中的游戲對象(GameObject)的名稱變成藍色,表示Hierarchy中的該對象是一個已經製作好的預製體的實例。此時,你可以根據需要,決定是保留層級視圖 (Hierarchy)中的這個實例還是刪除這個實例,不論你是否保留,都不會影響Project中製作好的原始預製體。

2、在層次視圖(Hierarchy)中創建預製體的實例

要在“當前場景中”創建一個“預製體的實例”,直接從工程視圖(Project View)中將某個預製體拖放到場景(Scene)或層級視圖(Hierarchy)中。

Hierarchy視圖中的“藍色”字體表示該對象是某個預製體的實例。

一旦你創建了預製體的實例,該實例就會自動鏈接到Project中的源預製體,併在層級視圖(Hierarchy)中以“藍色”文字顯示。

image

在這個截圖中,有3個游戲對象是藍色,表示這都是預製體的實例。

3、在檢視器(Inspector)中操作預製體

(1)粗體的含義

有時候你可能希望僅更改單個預製體實例的屬性,同時還能保持與源預製體的鏈接完整,此時可看到該實例對應的變數名稱變成了粗體,表示這個變數已被重寫。註意,所有重寫的屬性都不會受到源預製體更改的影響。

(2)Select

如果你選擇了某個預製體實例,並希望將所做的更改影響到所有實例,此時可直接在檢視器(Inspector)中單擊【Select】按鈕來選擇更改的原始預製體。

(3)Apply

如果希望用重寫的值更新源預製體及其所有實例,可單擊檢視器(Inspector)中的【Apply】 按鈕。註意,這種“應用”不會對“根位置”和“旋轉”起作用,因為這會影響實例的絕對位置並導致所有實例放在同一個位置。但是,Apply會對根的任何子元素或祖先元素的位置和旋轉起作用,因為它們是相對於根的變換來計算的。

(4)Revert

如果想放棄對特定實例的所有重寫,可單擊【(Revert)】按鈕。

4、導入預製體

將網格資源放入Assets文件夾下時,Unity會自動導入文件,並生成一些類似於網格之外的看起來像預製體的東西。但是,這實際上不是預製體(Prefab),它只是資源文件本身使用的東西。

註意,資源(asset)圖標與預設 (Prefab) 圖標略有不同。

資源是作為一個游戲對象(GameObject)存在於場景中的實例,它鏈接到源資源而不是鏈接到預製體(Prefab)。你可以向該游戲對象(GameObject) 正常添加、刪除組件,。但是你無法對資源本身作任何更改,因為這樣會向資源文件本身添加數據!如果你希望創建一些可重覆使用的東西,那你就應當把它製作成一個預製體。

選擇一個資源實例時,檢視器 (Inspector) 中的【Apply】按鈕將被替換成【Edit】按鈕。單擊此按鈕將為資源啟動編輯應用程式(如 Maya 或 Max)。

二、Prefabs基本用法示例

經過上面的介紹,你應當已經從基本層面上瞭解了Prefabs的概念:Prefabs本質上是GameObjects(預定義的游戲對象)和Components(組件)組成的集合體,是可在游戲中重覆使用的容器對象。

使用Prefabs可以方便地在運行時實例化複雜的GameObjects(游戲對象)。

1、創建游戲對象的方式

在Unity中,有兩種創建對象(Game Object)的方式:

(1)方式1:全部用C#代碼實現。這種方式使用C#代碼從頭開始創建並初始化游戲對象(GameObjects)。

(2)方式2:利用Prefabs實現。即:先製作預製體,運行時再通過代碼實例化預製體。

與方式1相比,方式2(用Prefabs實現)有多個優勢:

l 可以使用一行代碼實例化Prefab,並具有完整功能。而使用代碼創建等效游戲對象 (GameObjects),平均需要五行代碼,還有可能需要更多。

l 可在場景 (Scene) 和檢視器 (Inspector) 中快速設置、測試和修改預製體。

l 可以更改已實例化的預製體,而無需更改實例化預製體的代碼。例如,可將一個簡單的火箭更改成超級火箭,但無需更改代碼。

2、示例—創建一堵牆

為了說明Prefabs的強大,讓我們來看看可用得上Prefabs的一些基本情況:

(1)在不同位置,多次使用單塊“磚”預製體來創建一堵牆。

(2)發射時,火箭發射器實例化一個飛行的火箭預製體。該預製體是一個包含一個網格(Mesh)、剛體 (Rigidbody)、碰撞器 (Collider) 和帶有自己的拖尾粒子系統 (Particle System) 的子游戲對象 (GameObject)。

(3)機器人爆炸成許多碎片。此時完整的操作機器人已毀壞,替換成一個殘破的機器人預製體。該預製體包含分成多個部分的機器人,所有部分均設有自己的剛體 (Rigidbodies) 和粒子系統 (Particle Systems)。有了預製體,你僅用一行代碼就可以將一個對象替換成指定的預製體,從而讓機器人炸成許多碎片。

該示例僅僅是為了說明“使用Prefab創建對象”與“使用代碼創建對象”相比,前者(使用Prefab創建對象)的優勢。

(1)實現方式1

首先演示“使用代碼創建對象”的實現方式,因為只有比較,你才能理解這種方式有什麼缺點。

先在ch03Demos工程的Project視圖的Assets下創建一個名為Scripts的子文件夾,然後在該子文件夾添加一個名為Demo1的C#腳本:

image

雙擊Demo1腳本,Unity就會自動啟動VS2015並自動在VS2015中打開Demo1.cs文件,而且解決方案資源管理器中Assets下的文件夾結構和Unity中的文件夾結構相同:

image

將Demo1.cs文件改為下麵的內容:

using UnityEngine;
using System.Collections;

public class Demo1 : MonoBehaviour
{
    void Start ()
    {
        for (int y = 0; y < 5; y++)
        {
            for (int x = 0; x < 5; x++)
            {
                GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                cube.AddComponent<Rigidbody>();
                cube.transform.position = new Vector3(x, y, 0);
            }
        }
    }
}

保存該文件。

切換到Unity,選擇主菜單的【GameObject】->【Create Empty】創建一個空游戲對象,再將Scripts文件夾下的Demo1腳本拖放到剛添加的空游戲對象中。

切換到Game視圖,單擊【播放】按鈕觀察執行效果。此時將看到完全用代碼創建的立方體牆(由於預設使用了重力,牆會自動倒塌):

image

當然,由於沒有添加紋理,所以此時看到的僅僅是一堵白色的牆(倒塌後還是一個一個的立方體)。若想執行附加操作,例如更改磚塊紋理、摩擦力或剛體的質量,還需要再添加其他的代碼,可見用這種方式實現起來有多麼麻煩。

刪除層次視圖中剛創建的空游戲對象。

(2)實現方式2

第2種中實現方式是先創建一個“牆”預製體,然後再用“創建預製體實例”的辦法來創建多堵牆。

步驟如下:

選擇主菜單的【GameObject】->【3D Object】->【Cube】創建一個立方體:

image

此時,剛創建的Cube在層次視圖中處於選中狀態。

將Texture文件夾下的brick_D拖放到層次視圖中的這個立方體上。

在Project視圖的Assets文件夾下,添加一個Prefabs子文件夾:

image

滑鼠右擊Prefabs子文件夾,選擇【Create】->【Prefab】:

image

將新添加的Prefab的名稱更改為“Brick”。

將在層級視圖中創建的立方體拖放到Project視圖中剛創建的“Brick”上。

image

這樣就創建好了一個名為“Brick”的預製體(或預設)。

創建預設 (Prefab) 後,在層次視圖中添加的立方體(Cube)已經用不到了,可以從層級視圖 (Hierarchy) 選中它,然後按Delete鍵刪除。

重新添加一個空游戲對象 (GameObject)。

在VS2015解決方案資源管理器項目中的Scripts子文件夾下,添加一個文件名為Demo2.cs的C#腳本(Demo2.cs),然後將其改為下麵的內容:

using UnityEngine;
using System.Collections;

public class Demo2 : MonoBehaviour
{
    public Transform Brick;

    void Start ()
    {
        for (int y = 0; y < 5; y++)
        {
            for (int x = 0; x < 5; x++)
            {
                Instantiate(Brick, new Vector3(x, y, 0), Quaternion.identity);
            }
        }
    }
}

按<F5>鍵將其附加到Unity,然後按<Shift>+<F5>鍵結束。

切換到Unity,將工程視圖下的該腳本拖放到剛纔添加的Cube上,這就為該對象添加了一個Demo2組件:

image

另外,此時檢視器 (Inspector) 中將出現一個名為“Brick”的新變數,這個Transform類型的變數可以接受任何游戲對象 (GameObject) 或預製體。

從工程視圖 (Project View) 中,將預製體“Brick”拖放到檢視器 (Inspector)視圖中的Brick變數的值上(作用是:創建預製體的實例作為Brick變數的值):

image

按下“播放 (Play)”,就會看到同時使用預製體和C#腳本創建的牆:

image

可見,這種方式實現的腳本代碼不僅非常乾凈,而且可重覆使用這個Brick預製體。

剛開始學習時,你可能想知道為什麼要這樣做,用第1種方式創建立方體不是更靈活和方便嗎?為什麼還要再搞一個Prefab呢?

這是因為使用Prefab,您可以在數秒之內就能完成對它的調整:

  • 想要添加或更改所有實例的質量?只需在預製體中添加一個剛體,並一次性調整剛體 (Rigidbody)的重力即可。
  • 想為所有實例使用不同的材質 (Material)?只需將材質 (Material) 拖放到預製體上一次。
  • 想要更改摩擦力?在預製體碰撞器中使用不同的物理材質 (Physic Material)就行了。
  • 想為所有立方體添加一個粒子系統 (Particle System)?向預製體中添加一次子對象即可。

當然,如果僅僅是為了學習操作步驟,找不到brick_D.jpg文件時,隨便找一副其他的.jpg圖片代替也行,反正目標就是給這堵用立方體構造的牆貼滿圖,理解其含義就行了。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.實驗要求: 給定任意一個字元N(N>0),然後列印NxN的倒序乘法表。 二.解決問題: #/!bin/bash# #define functionNxN_fun(){ local i=$1 #定義一個局部變數i控制外層迴圈 while [ $i -ge 1 ];do local j=$i #定義 ...
  • 微軟Build 2016開發者大會在美國舊金山的莫斯康展覽中心開幕。本次大會對一些重點功能進行了完善。如手寫筆支持技術Windows Ink、語音識別Cortana應用集(Cortana Collection)、生物識別技術Windows Hello支持Edge瀏覽器以及將通用應用平臺(UWP)擴大 ...
  • ubuntu中文版home文件夾里用目錄的“桌面”、“圖片”、“視頻”雖然對於中文使用者看起來舒適直觀,但是對於bash使用來說簡直是障礙。所以需求就來了,如何保留大部分的中文特性,而讓這些預設路徑成為英文版的呢?認真拷貝下列命令,並註意說明。如不成功,多試幾次! 打開終端,輸入命令: export... ...
  • 2016-03-31 張超《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000 Linux如何創建一個新進程 1.我們先閱讀理解task_struct數據結構 1235struct task_struct { 1236 v ...
  • 來自系統媽:http://www.xitongma.com 深度技術GHOST win7系統32,64位經典優化版 V2016年3月 系統概述 深度技術ghost win7系統64位經典優化版適用於筆記本、品牌機,也支持組裝相容機,安裝後自動激活,可供品牌機專賣店及普通用戶安裝使用。保留了在區域網辦 ...
  • 介面的出現,是為瞭解決C#中不允許多重繼承的問題。 1、什麼是介面? 我覺得可以把介面理解為對一組方法聲明進行的統一命名,但這些方法沒有提供任何實現。 通過介面,就可以對方法進行統一管理,避免了在每種類型中重覆定義這些方法。 2、如何使用介面來編程 2.1 介面的定義 interface ICust ...
  • 說明 最近在網上下載了一些資料,所有的文件名被加上網站相關信息,導致文件名非常長.再者,我也不喜歡這樣的做法.那麼,就要重新修改文件名,文件還不少,手動修改確實不便.於是就自己寫了個小工具,基本滿足需要了. 下載 "github" "百度雲" 功能 批量替換文件名中內容 按序號批量重命名 源碼 代碼 ...
  • 一. 使用意圖 常常在開發過程中,碰到一個實體上的屬性值,要賦值給另外一個相類似實體屬性時,且屬性有很多的情況。一般不利用工具的話,就要實例化被賦值實體B,然後再將實體A的欄位一個個賦值給B的屬性,單單寫這些沒有技術含量的賦值語句,就要用很大的代碼篇幅。假如做得好一點的話,一般就是利用反射的方式,將 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...