概述
這是一款基于Unity引擎開發的2D街機風太空射擊游戲,筆者并不是游戲開發人,作者是siki學院的涼鞋老師。
筆者只是學習項目,記錄學習,同時也想幫助他人更好的學習這個項目
作者會記錄學習這一期用到的知識,和一些代碼邏輯。
項目地址:學習地址
由于筆者已經跟著視頻做了10期,所以這個記錄博客不會很連貫。
這里筆者也把自己跟做的項目開源到了碼云上
項目地址
1 引入新的道具圖標
為什么要取消勾選Generate Physics Shapes
如果勾選了Generate Physics Shapes,Unity就會自動給當前游戲物體增加碰撞體積,使該物體能和其他碰撞體進行碰撞。
2 PowerUpCircle 腳本
吃到這個道具的代碼邏輯跟吃到隱身和散射是一樣的。
start方法中使得道具刷新出來之后向屏幕中心移動
update方法中檢測道具是否超出屏幕,如果超出屏幕則銷毀這個游戲對象
道具向世界坐標系原點 (0,0) 直線移動的邏輯
向量的歸一化
當我們只關心向量的方向,而不關心長度的時候,可以考慮對向量進行歸一化。所謂歸一化,就是將向量的長度轉變為1,而其方向不發生變化。
在Unity/C#中,我們可以用nornalized將一個Vector2向量進行歸一化。
transform.position是獲取當前物體在世界坐標系中的位置坐標
transform.position.nornalized是將這個坐標向量轉化為方向(方向相同,但是長度為1)
GetComponent<Rigidbody2D>().velocity 獲取該游戲對象的Rigidbody2D組件,設置其速度方向為指向世界坐標系原點但是大小為1的向量,由于有負號,所以方向會反轉
這樣道具生成之后就會向世界坐標系原點進行移動。
吃到道具的邏輯
這里跟吃到前面隱身和散射道具的邏輯是一樣的。
在Player腳本的OnTriggerEnter2D方法中,通過
other.gameObject.name.StartsWith("powerUp")
當主角碰撞到到的游戲對象的名字以powerUp開頭的時候,就可以通過下面的方法去獲得該游戲對象上面的道具組件,如果不是空,則代表吃到了對應的道具。
var ghost = other.gameObject.GetComponent<PowerUpGhost>()
var spread = other.gameObject.GetComponent<PowerUpSpread>()
var circle = other.gameObject.GetComponent<PowerUpCircle>()
環射的實現
// 吃到了子彈環射道具if (powerUpCircle != null){// 更新射擊子彈狀態isPowerUpCircle = true;// 播放音效transform.Find("SfxPowerUp").GetComponent<AudioSource>().Play();// 播放特效ParticleSystem fx = Instantiate(Game.Default.powerUpFx, null);fx.transform.position = other.transform.position;fx.gameObject.SetActive(true);fx.Play();// 右上角道具顯示Sprite icon = Game.Default.powerUpCircle.GetComponent<SpriteRenderer>().sprite;// 回調函數,倒計時結束之后隱藏隱身文本Game.Default.uiPowerUps.AddPowerUp(icon, 3, () => {isPowerUpCircle = false;// 倒計時結束之后隱藏隱身文本});Destroy(other.gameObject);}
道具掉落的隨機邏輯
通過全局管理類Game克隆一個環射道具預制體
將其位置設置到子彈碰撞的位置
然后將其綁定的游戲對象進行顯形
這里為什么要用克隆
如果直接修改原預制體會影響后續所有生成的對象,所以我們克隆一個。