對象與資源的區(qū)別與聯(lián)系
資源(asset)就是可以在我們的項目中使用的文件亦渗,包括圖像、視頻汁尺、腳本文件法精、預(yù)制文件等,它們的存在不依賴于Unity痴突。
資源通過文件夾的形式來組織搂蜓,資源會按照文件類型分類放到不同的文件夾。
對象(Object)是Unity創(chuàng)建的實例辽装,你可以在inspector窗口中調(diào)整它們的屬性帮碰。其中游戲?qū)ο螅℅ameObject),出現(xiàn)在場景中的所有物體都是GameObject拾积,GameObject按照一定的層次結(jié)構(gòu)組織起來殉挽,顯示在Hierarchy窗口中。
對象通過層次結(jié)構(gòu)來組織拓巧,通過整體-部分的關(guān)系構(gòu)成層次結(jié)構(gòu)此再。
Asset與Object的聯(lián)系:
對象可以通過資源來保存起來,資源可以用來創(chuàng)建對象實例玲销,一個資源可以創(chuàng)建多個對象。
MonoBehaviour
MonoBehaviour是每一個腳本對象的基類摘符,它有一些方法可以覆蓋贤斜,這些方法會在運行的特定時間被調(diào)用,我們通過在這些方法中打印一句話來看看它們的執(zhí)行順序如何:
運行結(jié)果:
我們驗證了這張圖:
GameObject逛裤,Transform瘩绒,Component 三者之間的關(guān)系
GameObject是場景中所有實體的基類,Component通過掛載到GameObject來改變它的屬性(裝飾模式)带族,Transform是一種Component 锁荔,通過掛載到GameObject來控制其位置、角度蝙砌、大小阳堕、層次關(guān)系。MonoBehaviour(腳本)也是一種Component择克,它也可以掛載到GameObject上恬总。
對象的基本操作
要控制對象和對象森林(Hierarchy)的結(jié)構(gòu),我們要創(chuàng)建Script并將其掛載到對象上肚邢,然后在Script中改變GameObject的Component的屬性(改變了Component的屬性也就改變了GameObjectR佳摺)拭卿。
獲取在這個對象上的部件:
void Start () {
Rigidbody rb = GetComponent<Rigidbody>();
// Add a force to the Rigidbody.
rb.AddForce(Vector3.up * 10f);
}
創(chuàng)建對象:public static GameObject CreatePrimitive(PrimitiveType type);
克隆對象:Object.Instantiate()
public GameObject enemy;
void Start() {
for (int i = 0; i < 5; i++) {
Instantiate(enemy);
}
}
查找對象:public static GameObject Find(string name);
要獲取其他GameObject,也可以通過在腳本中創(chuàng)建一個public變量:
public GameObject prefab;
然后將你要獲取的GameObject從Hierarchy窗口(或Project窗口)拖動到Inspector窗口的對應(yīng)空位贱纠,然后你就可以在腳本中使用playerTransform了峻厚。
通過標(biāo)簽查找單個對象:public static GameObject FindWithTag(string tag)
通過標(biāo)簽查找多個對象:public static GameObject[] FindGameObjectsWithTag(string tag)
添加子對象:
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.name = "a cube";
cube.transform.position=new Vector3(0,Random.Range(0,5),0);
cube.transform.parent=this.transform;
遍歷對象樹:
foreach (Transform child in transform) {
DoSomething(child);
}
另外也可以通過Transform的方法。
清除所有子對象:
foreach (Transform child in transform) {
GameObject.Destroy(child);
}
更多的方法見GameObject文檔
預(yù)設(shè)與對象克隆
預(yù)設(shè)(prefab)是一個對象的快照或模板谆焊,可以用于快速生成相同的對象惠桃,比如子彈、敵人等等懊渡。修改預(yù)設(shè)以后刽射,通過該預(yù)設(shè)生成的對象也會發(fā)生變化。
預(yù)設(shè)與克隆的聯(lián)系與區(qū)別:
預(yù)設(shè)與克隆都能創(chuàng)建出相同的對象剃执。預(yù)設(shè)創(chuàng)建出的對象與源預(yù)設(shè)依然有聯(lián)系誓禁,后者的更改會影響到前者。但是克隆出的對象與源對象不再有聯(lián)系肾档。
組合模式
一個對象可以由多個對象組成摹恰,而組合出的對象依然與正常的對象沒有什么不同,操作組合對象與操作單一的對象的方式?jīng)]什么不同怒见,這就是組合模式(可以理解為1+1 == 1)俗慈。
組合模式允許你將對象組合成樹形結(jié)構(gòu)來表現(xiàn)“部分-整體”的層次結(jié)構(gòu),使得對象使用者以一致的方式處理單個對象以及對象的組合遣耍。(這個好處我們將會在學(xué)習(xí)Unity(7)體會到)
另外一個好處是闺阱,實現(xiàn)了組合模式以后,我們就可以忽略“部分”的存在了舵变,我們只需要告訴“整體”要做什么酣溃,然后“整體”就會讓每一個“部分”做好自己的事情。
讓我們從組合模式的角度來看待電腦開機纪隙。如果說電腦是一個“整體”赊豌,那其中的CPU、內(nèi)存等硬件就是“部分”绵咱。當(dāng)我們想要開機的時候碘饼,我們需要告訴CPU、內(nèi)存要怎么啟動起來嗎悲伶?不用艾恼,我們只需要按開機按鈕,告訴電腦這個“整體”:我要開機拢切。然后電腦就會讓CPU蒂萎、內(nèi)存等硬件做自己的事情,最終把電腦啟動起來淮椰。
我們通過BroadcastMessage來讓“整體”發(fā)送消息給“部分”:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class ComputerScript : MonoBehaviour {
// Use this for initialization
void Start () {
PushPowerButton();
}
void PushPowerButton() {
print ("PowerButton of computer is pushed at "+time);
gameObject.BroadcastMessage("Boot", System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
}
}
System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")返回當(dāng)前時間的string五慈,這個它會作為以下每一個Boot的參數(shù)纳寂。
CPU收到消息以后執(zhí)行自己的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CPUscript : MonoBehaviour {
void Boot(string time) {
print ("CPU is running. Boot time: "+ time);
}
}
內(nèi)存收到消息以后執(zhí)行自己的代碼:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MemoryScript : MonoBehaviour {
void Boot(string time) {
print ("Memory is running. Boot time: "+ time);
}
}