項目展現

Github項目地址:Apple Pickergit
涉及知識
- 正投視圖
- 3D場景內樹與蘋果的圖層
- 記錄最高分到本地
準備工做
模型製做:github
- 基本模型建立
- 樹葉:sphere 拉伸爲橢圓形,綠色材質球
- 樹幹:cylinde 修改成合適尺寸,棕色材質球
- 蘋果:sphere 附加深紅金屬光澤球
- 籃筐:cube 修改成合適尺寸,黃色材質球
- 位置、層級關係
- 調整樹葉樹幹的位置搭配,呈現簡單樹木形態
- 另設的空物體
AppleTree
包含着樹葉和樹幹
- 標籤、圖層
- 新建標籤Apple標記蘋果物體
- 新建圖層 AppleTree、Apple和Basket,後在Edit->Project Setting->Physics內取消Apple與AppleTree圖層的碰撞。後修正對應物體圖層
- 相機及預製體
- 調整主攝像機爲正投影(Orthographic),移動到合適位置
- 建立蘋果的預製體
遊戲邏輯
- 蘋果樹:
- 每幀都以必定的速度移動,當碰到左右邊界則轉向,且在左右移動過程當中有機率改變運動方向
- 每必定時間間隔落下一個蘋果
- 蘋果:
- 從樹葉位置實例化並落下(本例採用rigidbody重力)
- 與籃筐產生碰撞即被銷燬
- 若籃筐未與其碰撞,則當蘋果下落到必定距離就自動銷燬
- 籃筐:
- 開局有3個籃筐,且均實例化出來
- 籃筐跟隨鼠標限制在界面的x軸方向移動
- 籃筐用於接住蘋果,與蘋果碰撞後銷燬蘋果
- 當漏接蘋果(也就是當蘋果降低到自行銷燬的底線時),羅筐數減小(至關於玩家的生命值)
- 機制:
- 開局,蘋果樹左右移動,生成蘋果下落
- 玩家操做鼠標使籃筐左右移動
- 接到蘋果時得分增長,超過歷史分值就刷新記錄
- 當沒接到蘋果時,籃筐數減小(生命值減小),且場景內還在下落中的蘋果消失
- 當3個籃筐都沒了,遊戲結束,幾秒後自動從新開局
代碼相關
- AppleTree.cs:綁定於蘋果樹AppleTree
- Apple.cs:綁定於蘋果Apple
- Basket.cs:綁定於籃筐Basket
- ApplePicker.cs:綁定於主攝像機;BasketPrefab 掛載Basket,EndUI 掛載Canvas->End
- HighScore.cs:綁定於 Canvas->HighScore
問題探討
蘋果樹移動時機率轉向問題:app
- 問題分析:在AppleTree.cs內,原計劃實現每秒轉向機率爲
chanceToChangeDirecyions=0.02
(以下原版代碼),可是發現,在FixedUpdate()內,每秒執行50次,也就會致使AppleTree平均每秒改變一次方向:(設機率爲t) 50 x (t/1) = 1 ,所以須要修改。
- 解決方案:對隨機數Random.value進行修改,即 Random.value/Time.deltaTime,此時每秒轉向機率爲: 50 x (t / (1/0.02)) = 50 x 0.02(t/1) = 0.02 ,至此解決問題
- 其餘:但試驗下來0.02機率太低,我已調爲0.4,且速度爲5
private void FixedUpdate()
{
/*-----原版-----*/
//隨機改變運動方向,機率爲 chanceToChangeDirecyions
if ((Random.value) < chanceToChangeDirecyions)
speed *= -1;
/*-----修正版-----*/
if ((Random.value / Time.deltaTime) < chanceToChangeDirecyions)
speed *= -1;
}
蘋果下落被銷燬就再也不生成問題:dom
- 問題分析:當第二個蘋果還未實例化,第一個實例化的蘋果就因降低越線被銷燬或者被籃筐接住銷燬,此刻場景內就再無Apple預製體,也就是說,AppleTree腳本 就失去對象applePrefab,沒法再實例化產生蘋果
- 解決方案:圍繞保證場景內任意時刻存在一個applePrefab
- 調高樹的高度(本例方案)
- 縮短實例化蘋果的間隔
- 先隱藏再延時銷燬蘋果(理論可行,但感受大材小用)
參考