1.Transform
位置:世界坐標(biāo),當(dāng)?shù)刈鴺?biāo),通過屬性和方法操作;使用屬性的時候默認(rèn)是世界坐標(biāo)
調(diào)整位置:
通過屬性position調(diào)整:
[if !supportLists](1)[endif]transform.position+=transform.方向名;
transform.forward前,transform.right右,transform.up上等等
[if !supportLists](2)[endif]transform.position+=new
Vector3(x,y,z);
通過方法Translate方法調(diào)整:
transform.Translate(transform.方向名,Space.World或Space.Self);
transform.Translate(Vector3.方向名,Space.World或Space.Self);
每個游戲?qū)ο蠖加蠺ransform組件,所以不用再在前面寫GameObject.了
通過方法
角度:軸心(旋轉(zhuǎn)的軸心)和中心(重心),通過屬性和方法操作
調(diào)整角度:
通過屬性eulerAngles(歐拉角)調(diào)整:
transform.eulerAngles+=new Vector3(x,y,z);
通過方法Rotate調(diào)整:
transform.Rotate(new Vector3(x,y,z));
縮放:游戲?qū)ο蟮拇笮?/p>
父子關(guān)系:Parent和Root
轉(zhuǎn)換父類與子類,操作完成后無法在層界面拖動更改。
使用屬性操作
TrGreen.parent = TrRed;
使用方法操作
TrGreen.SetParent(TrRed);
第二個值若為true,則TrGreen會以TrRed為中心。
TrGreen.SetParent(TrRed,true);
用來顯示子類的個數(shù)
print(TrGreen.childCount);
用來顯示索引的子類的名字,作用:對查找的子進(jìn)行操作。
print(TrGreen.GetChild(0).gameObject.name);
GameObject.Find("");//比Transform.Find慢,Transform.Find是通過節(jié)點(diǎn)找的,
而GameObject.Find要通過層級關(guān)系對物體對象遍歷查找。
//查找一個物體對象
Transform? tr=TrGreen.Find("GameObject (1)");
print(tr.gameObject.name);
LookAt()方法:
TrGreen.LookAt(TrRed);
2.矯正坐標(biāo)系
[if !supportLists](1)[endif]把游戲?qū)ο蟮恼较蚋澜缱鴺?biāo)軸的z軸正方向平行
[if !supportLists](2)[endif]建立一個空游戲?qū)ο?/p>
[if !supportLists](3)[endif]把空游戲?qū)ο蟮闹行姆旁谝C正坐標(biāo)的游戲?qū)ο蟮闹行纳?/p>
[if !supportLists](4)[endif]把要矯正的游戲?qū)ο笞鳛榭沼螒驅(qū)ο蟮淖游矬w(拖進(jìn)空游戲?qū)ο罄铮?/p>
[if !supportLists](5)[endif]此時,這個空的游戲?qū)ο缶褪窃瓉淼挠螒驅(qū)ο螅瑢λM(jìn)行操作即可。
3.input
[if !supportLists](1)[endif]通過鍵盤按鍵輸入
[if !supportLists](2)[endif]通過鼠標(biāo)按鍵輸入
[if !supportLists](3)[endif]通過18個軸的值輸入,用Input.GetAxis(軸名稱);
[if !supportLists](4)[endif]太陽地球月亮模擬RotateAround公轉(zhuǎn)方法、Rotate自轉(zhuǎn)方法,用input實(shí)現(xiàn)坦克移動旋轉(zhuǎn)放大視野
4.time
時間縮放Time.timeScale:影響的是所有跟時間有關(guān)的,跟幀有關(guān)的不會受到影響
每幀的時間:Time.deltaTime:計時器用變量名+=Time.deltaTime實(shí)現(xiàn)
從游戲開始到現(xiàn)在的時間:Time.time:每幀是0.1秒
固定時間更新的FixedUpdate方法:發(fā)生在Update之前,默認(rèn)每0.02s執(zhí)行一次
5.GameObject
如果不加this.gameObject那么默認(rèn)就是使用這個腳本組件的游戲?qū)ο?/p>
開啟、禁止組件:GetComponent<組件名>().enabled=true或false;
通過名字找游戲?qū)ο螅河螒驅(qū)ο竺?Find(”名字”);
調(diào)用其他腳本文件的方法:游戲?qū)ο竺?GetComponent<腳本文件名>().方法名();
新建游戲?qū)ο螅簄ew GameObject(“新建游戲?qū)ο竺?;
在代碼里臨時創(chuàng)建游戲?qū)ο?游戲?qū)ο竺?CreatePrimitive(PrimitiveType.枚舉成員);
添加部件:游戲?qū)ο竺?AddComponent<部件名稱>();
返回游戲?qū)ο笞约海河螒驅(qū)ο竺?activeSelf
設(shè)定游戲?qū)ο笫欠窕顒樱@示或隱藏):游戲?qū)ο竺?SetActive(true或false);
標(biāo)簽:作用:歸類,具有相同標(biāo)簽的游戲?qū)ο罂梢钥醋饕活愂澄?/p>
根據(jù)類型查找:FindObjectOfType<部件>();//根據(jù)類型查找最后使用泛型,因?yàn)椴恍枰愋娃D(zhuǎn)換,如果不是用泛型去查找,那么找到的返回值都是Object類型的,西藥進(jìn)行類型轉(zhuǎn)換,期間有風(fēng)險
所有的組件都能.出gameObject
查找子節(jié)點(diǎn):Transform.Find();//查找的比較快的
克隆方法:Instantiate(克隆對象,克隆的位置,克隆的旋轉(zhuǎn));
銷毀方法:Destroy(銷毀對象,銷毀倒計時);//可以不寫第二個參數(shù)
打印的方法:
(1)Debug是一個專門用來打印各種消息的類(建議使用,沒有約束條件)
(2)print(”打印的消息”);//是MonoBehaviour類中封裝的打印方法
類,當(dāng)繼承MonoBehaviour的時候類名必須要跟腳本名字一致。因?yàn)橹挥欣^承了MonoBehaviour,游戲?qū)ο蟛拍軖燧d這個腳本
Start和Update是系統(tǒng)的回調(diào)方法,所以這兩個方法名字寫法是固定的
gameObject必須要繼承MonoBehaviour類才能使用
6.剛體和碰撞盒
碰撞器(盒)類型:
[if !supportLists](1)[endif]靜態(tài)碰撞器(Static Collider):沒有附加剛體而附加了碰撞器的游戲?qū)ο螅ǔ?yīng)用場景:環(huán)境模型)
[if !supportLists](2)[endif]剛體碰撞器(Rigidbody Collider):同時附加了剛體和碰撞器的游戲?qū)ο?,通過腳本代碼添加的力和碰撞完全受物理引擎的影響
[if !supportLists](3)[endif]運(yùn)動學(xué)剛體碰撞器(Kinematic Rigidbody Collider):同時包含碰撞器和剛體,并且激活I(lǐng)sKinematiic的游戲?qū)ο螅皇芪锢硪嬗绊?;只能通過transform組件移動;可以和其他的非運(yùn)動學(xué)剛體以及角色控制器互相作用
[if !supportLists](4)[endif]角色控制器(Character Controllers):
應(yīng)用場景:多用于制作一個類似人的角色;
第三人稱平臺游戲:
第一人稱射擊游戲的主要角色或任何敵對角色。
不遵循物理規(guī)則,不具有物理特性,如果要應(yīng)用真正的物理作用到你的角色,必須用剛體;
永遠(yuǎn)沿Y軸對齊(如果你的角色需要在空間中改變方向,也必須要用到剛體,但要注意調(diào)整剛體在角色上表現(xiàn)自然是很難的—困難一:游戲?qū)ο笞陨淼姆俏锢硖匦钥傁氡憩F(xiàn)出來;困難二:剛體不能像角色控制器一樣可以從特定高度的臺階上平滑的滑下)
受碰撞檢測;
不會對加在它身上的力做出反應(yīng)(如果你想讓你的游戲角色別物理效果影響,最好使用剛體);也不會自動推開其他剛體,但它額可以通過腳本施加力(通過添加OnControllerHit()函數(shù))影響其他對象
不受力影響(但重力效果還是有的,也可以被代碼施加的力推動);
兩個物體發(fā)生碰撞的必要條件:
[if !supportLists](1)[endif]都有碰撞盒(角色控制器)
[if !supportLists](2)[endif]其中一個有剛體
[if !supportLists](3)[endif]帶有剛體的物體要處于運(yùn)動狀態(tài)(剛體不運(yùn)動的話會進(jìn)入剛體休眠)
剛體休眠:
只要剛體的速度低于sleepAngulareVelocity和sleepVeclocity,該剛體就會開始休眠。其空閑一些幀后就會被設(shè)置為休眠狀態(tài)。
處于休眠狀態(tài)中的物體,不會再對其進(jìn)行檢測和模擬。
好處:節(jié)約大量CPU開銷;
喚醒休眠的剛體的方法:
[if !supportLists](1)[endif]使用代碼施加外力;
[if !supportLists](2)[endif]剛體的屬性發(fā)生了變化;
[if !supportLists](3)[endif]和它通過關(guān)節(jié)連接的剛體發(fā)生了移動,因?yàn)檫B帶關(guān)系,所以它也被喚醒了;
[if !supportLists](4)[endif]被其他剛體碰撞器碰撞(只有處于運(yùn)動狀態(tài)中的剛體或運(yùn)動學(xué)剛體才可以喚醒它)
[if !supportLists](5)[endif]注意:靜態(tài)碰撞器無法喚醒休眠剛體的
7.碰撞檢測
三個方法:OnCollisionEnter(Collision被碰撞的碰撞器形式名字)進(jìn)入、OnCollisionStay(Collision被碰撞的碰撞器形式名字)逗留、OnCollisionExit(Collision被碰撞的碰撞器形式名字)退出
只有剛體碰撞器碰其他碰撞器都可以產(chǎn)生碰撞檢測
把碰到的游戲?qū)ο蟾淖冾伾罕慌龅降呐鲎财餍螀?gameObject.GetComponent().material.color=new
Color(r,g,b);//Color.blue//Color類中的rgb是[0,1];
大小(縮放)(組件改為Transform,點(diǎn)出Scale屬性),分享材質(zhì)(相同材質(zhì)的游戲?qū)ο蠓窒聿馁|(zhì)變色,分享后材質(zhì)的顏色不再改變)(把material改為sharedMaterial)
8.觸發(fā)檢測
三個方法:OnTriggerEnter()進(jìn)入、OnTriggerStay()逗留、OnTriggerExit()退出
除了靜態(tài)觸發(fā)碰撞器和靜態(tài)觸發(fā)碰撞器、靜態(tài)碰撞器碰撞沒有觸發(fā)信息,其他觸發(fā)器都能觸發(fā)信息
9.鼠標(biāo)和碰撞盒檢測
這個腳本要掛在到有碰撞盒的游戲?qū)ο笊砩喜牌鹱饔?/p>
七個方法:OnMouseEnter()進(jìn)入、OnMouseOver()覆蓋、OnMouseExit()退出、OnMouseDown()按下、OnMouseUp()抬起、OnMouseUpAsButton()一個回程、OnMouseDrag()拖動
將屏幕坐標(biāo)轉(zhuǎn)換成世界坐標(biāo):
transform.position=Camera.main.ScreenToWorldPoint(new
Vector3(x,y,z));
將屏幕坐標(biāo)轉(zhuǎn)換成射線(通過鼠標(biāo)點(diǎn)擊地面,移動坦克位置):
Ray ray=Camera.main.ScreenToRay(new Vector3(x,y));
10.射線檢測
射線投射信息(RaycastHit類):里面存儲了一些有關(guān)于檢測到的游戲?qū)ο蟮男畔?collider、transform)
兩個Debug類的方法DrawRay畫射線、DrawLine畫直線(只是起到輔助作用,方便觀察,不是實(shí)際存在的線,打包之后不會存在)
物理類中方法Raycast(用來檢測射線第一個射到的游戲?qū)ο螅┖蚏aycastAll(用來檢測射線射到的所有游戲?qū)ο螅?/p>
Physics.Raycast(檢測的射線,射線映射信息,檢測范圍,檢測的層,QueryTriggerInteraction.枚舉成員);
射線映射信息是一個輸出參數(shù)(out修飾),可以用它.出被檢測到的游戲?qū)ο蟮膶傩?;這個參數(shù)的類型是RaycastHit類型的,可以.出point(射線檢測到的點(diǎn)的位置)
檢測的層表示:~(1<<10)表示從第一層(0開始索引,2的0次方開始,每上升一層就乘一次2)開始,升到第11層,~表示取反,也就是除了第11層的游戲?qū)ο?,其他層的游戲?qū)ο蠖寄鼙粰z測。
如果不取反,那么其中層的參數(shù)寫2的層數(shù)索引次方
一個枚舉:QueryTriggerInteraction中的三個枚舉值,0.都有影響1.忽略2.世界
RaycastAll()需要foreach來遍歷數(shù)組中的每一個檢測到的游戲?qū)ο?,并得到組件進(jìn)行操作
插值(數(shù)學(xué)方法,為了讓物體更平滑的移動):
(1)Vector3.Lerp(移動方向,目標(biāo)位置-,所需時間);
(2)Vector3.MoveTowards(起始位置,目標(biāo)位置,所需時間);
11.剛體
給碰撞器一個能觸發(fā)的圓形范圍:碰撞器名字=Physics.OverlapSphere(觸發(fā)范圍的中心點(diǎn),觸發(fā)碰撞器的圓形范圍的半徑);
添加爆炸力:剛體名.AddExplosionForce(爆炸威力,爆炸中心,爆炸范圍);
添加力:剛體名.AddForce(向量值);//向量值:有方向有大小的值
速度:剛體名.velocity屬性;
角速度:剛體名.angularVelocity;
注意:這里的速度跟時間有關(guān),如果Time.timeScale=0,則速度也會變?yōu)?
12.物理材質(zhì):
參數(shù):
動態(tài)摩擦力、靜態(tài)摩擦力、彈力、摩擦力組合模式(平均值、最小值、相乘值、最大值)、彈力組合模式(平均值、最小值、相乘值、最大值)
13.角色控制器:
這里主要對比了一下:分別通過Transform、Rigidbody、CharacterController實(shí)現(xiàn)移動
Transform通過Translate方法實(shí)現(xiàn)移動,Rotate方法實(shí)現(xiàn)轉(zhuǎn)動;
Rigidbody通過velocity實(shí)現(xiàn)移動,angularVelocity實(shí)現(xiàn)轉(zhuǎn)動;
CharacterController通過SimpleMove()或者M(jìn)ove()實(shí)現(xiàn)移動,通過transform的轉(zhuǎn)動方法轉(zhuǎn)動;
注意這里:SimpleMove()和Move()的區(qū)別:
SimpleMove只能實(shí)現(xiàn)x-z軸的移動,y軸方向不能控制移動,但它可以實(shí)現(xiàn)重力效果;而Move能實(shí)現(xiàn)x-y-z軸的移動,但是沒有重力效果,如果需要重力,則需要自己手動寫要給重力值,讓自己的速度減等于這個重力值(如:v-=G)
把世界位置換成自身位置:一個儲存軸增量的變量=Transform.TransformDirection(一個儲存軸增量的變量);
//這句話必須在已經(jīng)是世界坐標(biāo)之后再使用,如果在沒生成世界坐標(biāo)之前使用等于沒有用,這里牽扯到語句的執(zhí)行順序
角色控制器的檢測方法:OnControllerCollierHit(ControllerCollierHit
hit);
一般如果想給一個游戲?qū)ο筇砑恿?,必須先判斷它是否有剛體且保證它不是運(yùn)動學(xué)剛體,否則給它一個力是沒有物理效果的,就失去了意義
標(biāo)準(zhǔn)化力量,使向量模為1:向量名.normalized
判斷是否在地面:角色控制器名.IsGrounded(bool類型,用來判斷是否在地面)
14.物理關(guān)節(jié):
鉸鏈關(guān)節(jié):把兩個物體用鉸鏈關(guān)節(jié)連接,都安上碰撞器、剛體,其中一個勾上運(yùn)動學(xué)剛體,沒有勾上運(yùn)動學(xué)剛體的會以他們之間的一個可見的箭頭方向?yàn)樾D(zhuǎn)軸旋轉(zhuǎn)(例:門和門柱,門會以門柱為軸打開關(guān)閉);
固定關(guān)節(jié):把兩個物體通過固定關(guān)節(jié)連接,都安上碰撞器、剛體,其中一個勾上運(yùn)動學(xué)剛體,通過這種方式把沒有勾上運(yùn)動學(xué)剛體的游戲?qū)ο蠊潭ㄔ谶\(yùn)動學(xué)剛體上;
彈簧關(guān)節(jié):把兩個物體通過固定關(guān)節(jié)連接,都安上碰撞器、剛體,其中一個勾上運(yùn)動學(xué)剛體,在沒有勾上運(yùn)動學(xué)剛體的游戲?qū)ο蠛瓦\(yùn)動學(xué)剛體之間有一根隱形的彈簧存在;
角色關(guān)節(jié):用來固定角色的每個組成,讓它實(shí)現(xiàn)類似人的結(jié)構(gòu)。。有點(diǎn)不太清楚吧。。。
Unity中可以通過JavaScript和C#(C Script)兩種編程語言編輯腳本程序,JavaScript的文本后綴是.js,而C#則是.cs文本格式