Unity學(xué)習(xí)周報(一)

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文本格式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,516評論 2 379

推薦閱讀更多精彩內(nèi)容