Unity3D腳印1——遊戲對象&組件

Unity3D介紹操作界面的資料多如牛毛,再記錄這些,於人於己皆無益,在這裏希望可以記錄一些有用的東西,供以後有需要時查看

 

要熟悉一個引擎,我覺得有必要把引擎的思想搞清楚,這樣學習起來才更好理解吧

 

通過這幾天的學習,Unity3D中貫穿着幾個重要的概念,GameObject,Component還有Scene,我覺得Unity3D的整個思路,是由這三個概念組合而成的,還有別的嗎?對於美術人員來說可能有很多,諸如濾鏡,特效,骨骼之類的概念,但對程序人員來說,就這三個概念,或許可以把Scene給幹掉,因爲我們需要理解最多,用的最多的,也就是GameObject和Component這兩個

 

Scene是一個很空泛的東西,它表示遊戲中的一個場景,也是程序的一個入口,好處是可以把一個遊戲分爲不同的場景然後分別進行開發,場景之間可以互不影響,而在整個設計思想裏面,它就是一個容器,容器裏面有什麼?只有GameObject,我覺得Unity3D裏面的Terrain也是GameObject的一種,在一個活動容器中的GameObject可以被顯示,(這裏有一個疑問,有沒有可能讓兩個Scene同時運行呢?例如一個雙人遊戲,左邊是我的屏幕,右邊是朋友的屏幕)(雖然它沒有在GameObject的菜單下)。(這裏我想到一個疑問,我可以在代碼裏面動態創建一個Scene嗎?雖然可能意義不大,充其量只是一個程序員的好奇心而已)目前我的瞭解,Unity3D裏面可以直接通過Ctrl+N或者File菜單下的按鈕來創建新的場景

 

我覺得GameObject會是我們接觸最多的一個東西了,因爲它代表遊戲對象,例如裏面的遊戲角色,道具,敵人等等。這裏我覺得只記錄一些GameObject和Component就可以了,GameObject是一個Component的容器,一些Component也可以被直接作爲GameObject創建出來,這就好像一個空的GameObject,然後掛了一個組件。那麼GameObject和GameObject之間是什麼關係呢?它們可以是父子關係,也可以是朋友(都位於場景中,沒有父子關係),所以一個GameObject也是GameObject的容器

 

那麼如何創建一個GameObject呢?我們可以通過菜單來創建,也可以直接在代碼裏面new一個GameObject,GameObject和Component都繼承於Object。GameObject通過AddComponent和GetComponent函數可以添加,獲取組件(那刪除組件呢?Destroy?

 

AddComponent有兩個重載函數

//通過組件的名稱來添加組件,可以是內置的一些組件名稱,也可以是腳本名1.Component AddComponent(className : String)
 
gameObject.AddComponent("myScript");        //添加腳本組件SphereColider sc = gameObject.AddComponent("SphereCollider");    //添加球形碰撞體組件

//通過組件的類型來添加,這裏使用了泛型來實現

2.Component AddComponent<T>()

 

//T表示任意類型,這個是個高級概念,貌似只在這裏用到了

gameObject.AddComponent<SphereCollider>(); 

 

獲取組件的函數有很多

Component GetComponent()
 
Component GetComponent<T>()
 
Component[] GetComponents()
 
Component[] GetComponents<T>()
 
Component GetComponentInChildren()
 
Component GetComponentInChildren<T>()
 
Component[] GetComponentsInChildren()
 
Component[] GetComponentsInChildren<T>()

//在獲取腳本對象的時候,我們獲取的類型是腳本的名字,也是它的類名,獲取到這個類之後,就可以操作這個對象的公有函數,公有變量,C#在這裏是類名,如果你在文件中修改了類的名字,文件名和類名不一致了,那麼Unity會報錯

var script = GetComponent("myScript") as myScript;
script.myFunction();
 
myScript script = GetComponent<myScript>();
script.myFunction();

//每個腳本都是一種類型,Unity3D中提供了大量的基礎組件類型,例如一個GameObject上可以有很多個關節Joint,GetComponents方法返回一個數組給我們,泛型和組件名稱這兩種調用方法和上面一致

HingeJoint[] joints = gameObject.GetComponents<HingeJoint>();
// or joints = gameObject.GetComponents("HingeJoint");
 
foreach(HingeJoint joint in joints)
{
    joint.useSpring = false;
}

GetComponentInChildren系列函數會搜索相比GetComponent系列函數只是搜索範圍更廣了,GameObject以及其子物體上所有類型爲type的組件,它只返回活動的組件(如何獲取一個gameObject上掛載的所有腳本對象?

 

最後來整理一下,Unity3D有哪些組件!

 

Camera 攝像機,繼承於MonoBehavior(繼承於Component)

 

Transform 變換組件,用來改變對象的位置,方向,大小等

 

Light 燈光,繼承於MonoBehavior(繼承於Component)

 

SkyBox 天空盒,繼承於MonoBehavior(繼承於Component)

 

RigidBody 剛體,可以通過物理來模擬一個物體的位置

 

Collider 碰撞器,包含Box,Sphere,Capsule,Mesh等Collider

 

XXXJoint系列,各種關節的物理模擬組件

 

XXXCloth系列,布料的物理特性模擬組件

 

GUIXXX系列,非常多的類...就是圖形用戶界面

 

ParticleXXX系列,粒子,粒子動畫,粒子發射器,粒子渲染器

 

常用的大概也就這些吧,有個大概的印象,後面用到什麼就學什麼吧(通過拖動,可以把一個GameObject設置爲另外一個GameObject的孩子以及撤銷,在代碼裏面怎麼做呢?

 

難以理解,設置GameObject的父子關係,需要通過Transfrom組件的parent屬性來設置


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章