siki学院_Unity初级案例_愤怒的小鸟_学习笔记1/3
說明:本次學(xué)習(xí)開始于2018年9月23日,至9月26日已看完全部教學(xué)視頻,并已基本完成該案例的制作,歷時(shí)四天。本文檔為我在學(xué)習(xí)過程中,通過記事本記錄的學(xué)習(xí)過程,對(duì)于該游戲案例的制作過程并不十分詳盡,不作為教程使用,僅用于自己學(xué)習(xí)參考,記錄于此,聊表心意。
2018年9月23日
siki學(xué)院官網(wǎng)在線視頻 憤怒的小鳥 Unity2017.3.0f3開發(fā) 講師lvy
一 新建工程 2d 在d盤的users目錄下
★★2d3d場(chǎng)景的切換,更改相機(jī)的【projection】屬性(有透視和正交兩個(gè)),在編輯器主菜單>項(xiàng)目設(shè)置>編輯器>中的模式改為2/3d ?即可。
★★新建場(chǎng)景,新建三個(gè)場(chǎng)景,分別為L(zhǎng)oading,level,game。
★★導(dǎo)入資源,圖片和音頻等
★★圖集的處理,更改圖片模式【sprite mode】(改為multiple),編輯,將單張圖集裁切,有編號(hào),應(yīng)用。
★★圖片層級(jí)關(guān)系處理,在游戲物體上,點(diǎn)擊【sorting layer】>添加player層,將主角設(shè)置為player層,通過【order in layer】的數(shù)值來調(diào)節(jié)顯示層級(jí)關(guān)系。
★★給小鳥添加【spring joint 2d】的彈簧關(guān)節(jié)組件(其用于連接兩個(gè)剛體組件像彈簧一樣運(yùn)動(dòng)),系統(tǒng)自動(dòng)添加【rigidbody 2d】的2d剛體組件。
給右邊彈弓添加2d剛體,設(shè)置類型為靜態(tài)(不會(huì)受重力影響,不會(huì)掉落)
再看spring joint 2d組件,其中【connected rigid body】為連接的另一個(gè)2d剛體物體,
另有是否自動(dòng)/設(shè)置連接的錨點(diǎn),
另有是否自動(dòng)/設(shè)置連接的距離,
另下方有【frequency】頻率屬性(其值為彈性系數(shù),值越大約不易被拉長(zhǎng)),
另有【Damping ratio】屬性為阻尼系數(shù)(范圍0-1值越大阻力越大)。
★★給小鳥加2d碰撞體(圓形的即可)然后添加腳本,實(shí)現(xiàn)鼠標(biāo)拖拽跟隨運(yùn)動(dòng)。
函數(shù):private void OnMouseDown(){} ?鼠標(biāo)按下
? ? ? private void OnMouseUp(){} ? ?鼠標(biāo)抬起觸發(fā)函數(shù)執(zhí)行。
在update中位置跟隨鼠標(biāo)的實(shí)現(xiàn)
transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
將鼠標(biāo)在屏幕上的點(diǎn)擊位置(坐標(biāo)原點(diǎn)為屏幕左下角)裝換為相應(yīng)的世界坐標(biāo)位置(原點(diǎn)為屏幕中心),但此轉(zhuǎn)換后的位置會(huì)被加上一個(gè)主相機(jī)的z軸坐標(biāo)值,在這里是-10,故還需要減去。
transform.position += new Vector3(0,0,-Camera.main.transform.position.z);
★★最大距離限制(判斷與值計(jì)算)
在right上建立一個(gè)空子物體,移動(dòng)到彈簧關(guān)節(jié)點(diǎn),在代碼中此點(diǎn)為距離基準(zhǔn)點(diǎn),當(dāng)鼠標(biāo)拖動(dòng)的位置超出限定值maxDis時(shí),小鳥位置將保持方向,距離為最大距離。實(shí)現(xiàn)如下
if (Vector3.Distance(transform.position,rightPos.position) > maxDis) {
? ? Vector3 pos = transform.position - rightPos.position;
? ? pos = pos.normalized * maxDis;
? ? transform.position = pos + rightPos.position;
}
說明,在鼠標(biāo)按下移動(dòng)的條件下,判斷鼠標(biāo)當(dāng)前位置是否超過最大限制,如果超過,則先獲得該方向(物體當(dāng)前位置減去基準(zhǔn)點(diǎn)),方向單位化再乘以最大距離得到該方向向量,物體限制后的位置為基準(zhǔn)位置加上方向向量。完成。
★★小鳥飛出(抬起鼠標(biāo)時(shí)的剛體和彈簧組件的設(shè)置)
思路是在代碼中獲得其剛體組件和2d彈簧組件,
在鼠標(biāo)按下時(shí),將剛體組件屬性設(shè)置為【Kinematic】(小鳥默認(rèn)狀態(tài)為【dynamic】動(dòng)力學(xué)的,會(huì)受力的影響,改為Kinematic后,受到transform影響,不受力影響)代碼(rg.isKinematic = true;),
在鼠標(biāo)抬起時(shí),先關(guān)閉Kinematic屬性,代碼(rg.isKinematic = false;),此時(shí)小鳥將受到力的影響,
在0.1秒后,將2d彈簧組件關(guān)閉,此過程為,在這0.1秒中受到彈簧的力影響,并已經(jīng)有了運(yùn)動(dòng)趨勢(shì),0.1秒結(jié)束后,小鳥只受2d剛體的作用,在先前的運(yùn)動(dòng)趨勢(shì)下,飛出。代碼如下:
Invoke("Fly",0.1f);
? ? private void Fly() {
? ? ? ? sp.enabled = false;
? ? }
關(guān)于Invoke()函數(shù)的調(diào)用,兩個(gè)參數(shù),第一個(gè)為調(diào)用的函數(shù)(string),第二個(gè)為延遲的時(shí)間(float)。
★★背景場(chǎng)景搭建(圖集的操作)
同樣的圖集剪切操作,剪切不好的可以自己調(diào)整,Ctrl+D可以復(fù)制,小鳥的剛體組件中,有【angular drag】屬性,表示角阻力,增大其值,使小鳥不會(huì)旋轉(zhuǎn)太快,運(yùn)動(dòng)時(shí)會(huì)逐漸停止,起到類似于空氣阻力的效果。
★★小豬的基礎(chǔ)設(shè)置(碰撞/死亡/受傷的框架)
添加剛體組件(設(shè)置角阻力為2),添加球形碰撞盒。添加代碼。
首先介紹兩個(gè)碰撞函數(shù):
? ? private void OnCollisionEnter2D(Collision2D collision) {
//碰撞檢測(cè)
? ? }
碰撞條件,兩個(gè)物體都是剛體和碰撞體,碰撞后會(huì)發(fā)生反彈
? ? private void OnTriggerEnter2D(Collision2D collision) {
//觸發(fā)檢測(cè)
? ? }
觸發(fā)條件,兩個(gè)物體都是碰撞體,其中一個(gè)是剛體,其中一個(gè)物體勾選觸發(fā)器。碰撞后不反彈(如有誤以后勘正)。
小豬受傷/死亡原理,給小豬一個(gè)最小速度(觸發(fā)受傷的相對(duì)速度)和最大速度(觸發(fā)死亡的相對(duì)速度),在碰撞函數(shù)中,使用if語句判斷執(zhí)行,分別執(zhí)行死亡的操作和受傷的操作。代碼如下:
? ? private void OnCollisionEnter2D(Collision2D collision) {
? ? ? ? if (collision.relativeVelocity.magnitude > maxSpeed) {
? ? ? ? ? ? Destroy(gameObject);
? ? ? ? } else if (collision.relativeVelocity.magnitude > minSpeed) {
? ? ? ? ? ? render.sprite = hurt;
? ? ? ? }
? ? }
其中,render組件需要先聲明,并在awake函數(shù)中得到,受傷的圖集由public屬性從外部賦值得到。
★★給彈弓畫線
彈弓左右枝上分別建立一個(gè)畫線點(diǎn),并在左右枝上分別添加【Line Renderer】組件,該組件,給材質(zhì)添加材質(zhì)球,在顏色屬性處改變顏色,在【whdth】屬性處改變寬度。
畫線的操作在小鳥的代碼中,聲明兩個(gè)公共位置變量(在編輯器賦左右枝的畫線點(diǎn)),聲明兩個(gè)公共畫線組件(同樣在編輯器將左右兩枝賦給他),寫畫線函數(shù)。放在isClick判斷句內(nèi)。
? ? void Line() {
? ? ? ? rightLine.SetPosition(0,rightPos1.position);
? ? ? ? rightLine.SetPosition(1,transform.position);
? ? ? ? leftLine.SetPosition(0,leftPos1.position);
? ? ? ? leftLine.SetPosition(1,transform.position);
? ? }
其中,setposition為畫線的兩個(gè)點(diǎn),用法如上,一目了然。
★★小豬死亡特效
先制作爆炸特效的預(yù)制體,選中幾個(gè)圖集,拖到場(chǎng)景目錄上,自動(dòng)彈出動(dòng)畫制作的窗口,會(huì)自動(dòng)生成一個(gè)物體,上面掛載動(dòng)畫狀態(tài)機(jī),動(dòng)畫狀態(tài)機(jī)綁定一個(gè)動(dòng)畫,該動(dòng)畫是圖集動(dòng)畫,選中該物體,按Ctrl+6,打開動(dòng)畫編輯器,可以對(duì)圖集動(dòng)畫進(jìn)行編輯修改(如更換添加刪除圖片等),在這里對(duì)特效添加一個(gè)控制代碼,寫上一個(gè)銷毀函數(shù),在動(dòng)畫編輯窗中在最后一幀添加事件,為其銷毀函數(shù),這樣,在動(dòng)畫播放完之后,就會(huì)自己銷毀掉,動(dòng)畫物體制作好后,制作成預(yù)制體。
實(shí)現(xiàn)爆炸特效,在pig的代碼中先聲明公共屬性gameobject(在外面賦值預(yù)制體public GameObject boom;),寫一個(gè)處理死亡的函數(shù),生成爆炸的預(yù)制體,在死亡處調(diào)用。
? ? void PigDead() {
? ? ? ? Instantiate(boom,transform.position,Quaternion.identity);
? ? }
函數(shù)參數(shù)說明,生成的游戲?qū)ο?#xff08;通過預(yù)制體賦值),生成時(shí)的位置,生成時(shí)的旋轉(zhuǎn)方向。不再贅述。
分?jǐn)?shù)特效,分?jǐn)?shù)圖集制作成預(yù)制體(這個(gè)預(yù)制體就是一個(gè)圖片),在pig的死亡處添加生成該預(yù)制體的語句即可。
? ? ? ? GameObject Score = Instantiate(pigScore,transform.position + new Vector3(0,0.4f,0),Quaternion.identity);
? ? ? ? Destroy(Score,1f);
其中,為了讓生成位置在豬的上方,銷毀也是在1秒之后銷毀。
總結(jié)
以上是生活随笔為你收集整理的siki学院_Unity初级案例_愤怒的小鸟_学习笔记1/3的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx负载均衡讲解
- 下一篇: 条码防窜货管理系统的应用