變量(variable)是用來儲(chǔ)存數(shù)據(jù)的。
程序語言通常都會(huì)針對(duì)不同的用途設(shè)置不同的數(shù)據(jù)類型,以提高儲(chǔ)存效率。因此在設(shè)置變量時(shí),需要事先申明好變量的數(shù)據(jù)類型。
- 保存“是”或者“非”的判斷數(shù)據(jù),僅需要1bit的儲(chǔ)存空間;
- 而 8bit = 1byte,于是1byte空間如果用來保存整數(shù)的話,就只能包括64個(gè)不同的整數(shù)了,不考慮負(fù)數(shù)的話只能063,考慮負(fù)數(shù)則只能-3132;
- 但要保存一段文字內(nèi)容,所需要的儲(chǔ)存空間就大得多了。
Unity3D中常用的數(shù)據(jù)類型
Bool
“布爾”數(shù)據(jù)類型,其值要么是“True”(代表1)要么是“False”(代表0)。
Bool數(shù)據(jù)常常用來表達(dá)一個(gè)判斷,例如“場(chǎng)景中是否有Player”、“是否發(fā)生了碰撞”等等。
Int
Int數(shù)據(jù)用來表示整數(shù),包括正整數(shù)、負(fù)整數(shù)、0。
我們通常用int數(shù)據(jù)儲(chǔ)存諸如:“xxx物體的數(shù)量”這樣的數(shù)據(jù)。另外,for循環(huán)中也用int來計(jì)數(shù)。
Float
Float數(shù)據(jù)用來表示“小數(shù)”,同樣包括正數(shù)、負(fù)數(shù)、和0。當(dāng)然整數(shù)也可以用float數(shù)據(jù)類型來儲(chǔ)存,只不過有點(diǎn)浪費(fèi)。
如果我們寫腳本的時(shí)候直接賦值 a = 1,那么系統(tǒng)會(huì)自動(dòng)將變量a設(shè)置為int類型,如果需要讓系統(tǒng)自動(dòng)將a設(shè)置為float,則可以寫成 a = 1.0 或者 a = 1f。
同理,如果讓系統(tǒng)計(jì)算 a = 3 / 5,系統(tǒng)會(huì)認(rèn)為3和5都是int類型,于是結(jié)果會(huì) = 0。除非寫成 a = 3f / 5f, 系統(tǒng)才會(huì)算出 = 0.6 。
Float數(shù)據(jù)的應(yīng)用范圍就很廣泛了,距離、時(shí)間、速度等等。
String
String數(shù)據(jù)用來表示“字符串”,也就是文字內(nèi)容。
游戲中要儲(chǔ)存一句對(duì)話,就需要使用string類型的數(shù)據(jù);獲取游戲物體的名字,其數(shù)據(jù)格式也是string。
要注意的是,UI中使用的文字都是string格式的,如果我們希望顯示生命值為10,那么需要把10這個(gè)float類型的數(shù)據(jù)先轉(zhuǎn)換成string類型的數(shù)據(jù)再賦給相應(yīng)UI組件來使用。
Vector2
Vector2是二維矢量數(shù)據(jù),相當(dāng)于兩個(gè)float數(shù)據(jù)組合起來。
很多數(shù)據(jù)需要成對(duì)出現(xiàn)才有意義,比如屏幕坐標(biāo)、方形的長(zhǎng)寬等等,這時(shí)候就要用到Vector2。
Vector2數(shù)據(jù)寫法是用,
將兩個(gè)float數(shù)據(jù)連起來,再用<<
和>>
框起來,比如<<320, 240>>
這樣。
Vector3
Vector3是三維矢量數(shù)據(jù),相當(dāng)于三個(gè)float數(shù)據(jù)組合起來。
Vector3的使用就很常見了,一個(gè)物體在三維空間中的坐標(biāo),運(yùn)動(dòng)的方向,translate、rotate、scale值,顏色(RGB)等數(shù)據(jù)都使用Vector3來儲(chǔ)存。
Vector3的寫法和Vector2一樣,只不過多了一個(gè)float數(shù)據(jù),比如<<2, 4, 6>>
注意:Vector2和Vector3的每一個(gè)分量都是float形式的,所以寫的時(shí)候不需要加“f”。
GameObject
GameObject類型的數(shù)據(jù)就沒有上面這些那么好理解了,我們姑且認(rèn)為這就是Unity3D中用來表示一個(gè)游戲物體的專有數(shù)據(jù)就好了。
實(shí)際上,GameObject與其說是一個(gè)“數(shù)據(jù)”,不如說是一個(gè)“對(duì)象”。只不過我們還不了解什么叫“對(duì)象”,所以姑且當(dāng)它是個(gè)特殊的數(shù)據(jù)吧。
Array
Array是“數(shù)組”,前述的任何一種數(shù)據(jù)類型,多個(gè)數(shù)據(jù)按順序組合到一起就是一個(gè)“數(shù)組”。
比如可以將全班所有人的名字組合成一個(gè)string類型數(shù)據(jù)的Array:names[] = {"name1", "name2", "name3", "name4"}
,如果需要獲取name1
,則需要通過names[0]
來得到。
所以,一個(gè)有4個(gè)數(shù)據(jù)的數(shù)組,其編號(hào)是0、1、2、3,沒有4。
同時(shí),數(shù)組只能將同一類型的數(shù)據(jù)放在一起,不能混搭,混搭就成了對(duì)象(object)了。
Enum
Enum是一個(gè)“狀態(tài)”數(shù)據(jù)。我們可以定義一個(gè)Enum,然后指定給它多個(gè)狀態(tài),比如“吃飯”、“睡覺”、“打豆豆”之類,然后通常這個(gè)Enum會(huì)被用在一個(gè)Switch條件語句中。
PlayMaker中使用變量
在PlayMaker的Variable面板中可以新建變量。變量通常僅在該FSM中使用,如果需要在多個(gè)FSM中自由調(diào)用該變量,需要將其定位為Global Variable。
如果需要在Inspector中修改變量,需要勾上“Inspector”選項(xiàng)。
PlayMaker提供多種數(shù)據(jù)類型給我們使用:
除了使用前面提到的Unity3D數(shù)據(jù)類型作為變量類型以外,PM還提供了一些比較特別的變量類型。比如:
-
Color
:用來表示顏色,本質(zhì)上是Vector3 -
Rect
:用來表示一個(gè)矩形方框的大小和在屏幕坐標(biāo)系的位置,本質(zhì)上是4個(gè)float的組合(X:方框左上角的橫軸坐標(biāo);Y:方框左上角的縱軸坐標(biāo);W:方框?qū)挾龋籋:方框高度),當(dāng)然我們也可以用來表示別的東西 -
Material
:材質(zhì),用來儲(chǔ)存一個(gè)材質(zhì)球(material)資源 -
Texture
:貼圖,用來儲(chǔ)存一張圖片資源 -
Quaternion
:代表物體旋轉(zhuǎn)角度的數(shù)據(jù),但不同于我們常用的rotateX,rotateY,rotateZ這種算法 -
Object
:Object不是GameObject!Object其實(shí)是用來存放組件(component)的。對(duì)于一些PM中沒有專門action支持的component,PM提供了Object這么一種數(shù)據(jù)類型讓我們可以通過Get Component
去獲取一個(gè)component,然后在通過Get Property
和Set Property
來獲取或設(shè)置目標(biāo)component的某個(gè)屬性 -
Enum
:PlayMaker的Enum不能自行創(chuàng)建其包含的狀態(tài),只能使用Unity3D已有的Enum結(jié)構(gòu)來生成變量
PlayMaker中所使用的變量都需要在PlayMaker中提前定義好。而且,由于PlayMaker又是可視化界面,因此對(duì)于所用數(shù)據(jù)的數(shù)據(jù)類型十分敏感,一個(gè)GameOjbect類型的數(shù)據(jù)是放不進(jìn)一個(gè)Vector3類型的參數(shù)中去的。
初學(xué)者一般都不是非常清楚每個(gè)Action的每個(gè)參數(shù)都需要哪種類型的數(shù)據(jù)。所以建議通過在Action的參數(shù)選擇框中選擇
New Variable
來創(chuàng)建變量,這樣就可以得到正確的數(shù)據(jù)類型了: