要熟悉一個引擎,我覺得有必要把引擎的思想搞清楚,這樣學習起來才更好理解吧
通過這幾天的學習,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屬性來設置