由于我自身知識的局限,下面Object有可能被稱為對象有可能被稱為物體厅克,其實都是指的Game Object赔退。
認(rèn)識基本界面
工具欄, 提供手形工具克控制按鈕证舟,如播放暫停等硕旗。
scene 場景,應(yīng)該相當(dāng)于story board褪储,是集中所有元素的地方卵渴。
hierarchy 當(dāng)前場景下所有物體的堆棧慧域,包括播放器鲤竹,UI,攝像頭,玩家辛藻,背景紋理等等
assets 所有資源的管理器碘橘,包括紋理,bgm等等
game 游戲預(yù)覽吱肌,通過工具欄的播放按鈕痘拆,可以在這里
游戲中所有對象都是Game Object,它的表現(xiàn)通過Properties來定義氮墨, Inspector窗口可以查看選中對象的所有組件Component纺蛆, 以及每個組件的屬性
項目基本概念
游戲是由一個一個的"場景"組成的。組成場景的基本單位是Game Object规揪,它可以有多個Component桥氏,每個Component擁有自己的屬性。Game Object可以被存儲在Asset里猛铅,以在多個地方復(fù)用字支。Prefab就是這樣一類物體,它是預(yù)制的建筑材料奸忽。在Asset里定義的Prefab相當(dāng)于類文件堕伪,而在Hierarchy里的東西相當(dāng)于類實例,我們可以從Asset里拖動物體到Hierarchy中栗菜,這叫做實例化(initiate/clone)欠雌。
在示例工程里,從Assets進到PlatformerTemplate文件夾疙筹,里面有個Prefabs文件夾桨昙,預(yù)定義了一套物體,包括磚塊平臺腌歉,按鈕等蛙酪,通過組合這些物體,可以構(gòu)造出我們的環(huán)境場景翘盖。
構(gòu)造好場景桂塞,物體,交互之后馍驯,需要將游戲?qū)С龀煽蓤?zhí)行文件阁危,以便在Unity以外運行,導(dǎo)出時可選擇運行平臺汰瘫,有PC狂打,Android,PS4混弥,XBox等等可選趴乡。
試玩
導(dǎo)出了demo工程進行試玩,手感太差了,主要有三個問題:
- 貼墻跳和挨著物體跳的判定很難受晾捏,無法跳到上方的下個塊蒿涎,會被判定碰撞。在高臺邊緣也有這種情況惦辛,會被判定下落
- 開頭的隱藏路徑是死路劳秋,沒有任何獎勵,這不合理
- 要是有加速跑和二段跳就好了
- (說好的三個問題呢胖齐?)有一個地方浮空磚塊的右邊塊錯用成了中間磚塊的貼圖
下面我們就拿著新手村Lv.1的木劍(+百度buff)玻淑,試著搞定以上三(si)個問題。
1. 貼墻跳受阻:磚塊碰撞判定
猜測挨著磚塊邊緣跳不起來是因為被判定為碰撞了呀伙。查看player屬性岁忘,發(fā)現(xiàn)player就是將一個Controller與動作貼圖,實體模型区匠,動作音效干像,結(jié)合在一起組成的物體(順手改了一下生命值,加速度和最大速度驰弄,跳躍的初始速度和重力加速度決定了跳躍的高度麻汰,橫向速度決定了跳躍距離)。
貼墻跳會頂住磚塊而卡住跳不高戚篙,是不是因為跟墻壁有摩擦導(dǎo)致上升速度降為0五鲫?那我們可不可以當(dāng)人物跳起來時,墻的邊緣摩擦變?yōu)?岔擂,這樣就不卡了位喂。那么一是判斷人物跳躍,二是更改摩擦乱灵。(網(wǎng)上搜了一下塑崖,發(fā)現(xiàn)示例的Assets里有代碼)找到Assets的Scripts,找到PlayerController痛倚,里面有個跳躍狀態(tài)機规婆,可以看到將跳躍以狀態(tài)模式進行管理,那么判斷人物跳躍只要看其狀態(tài)即可蝉稳。我們需要在跳躍時和落地時修改摩擦抒蚜。新建兩個PhysicsMaterial2D材質(zhì),分別賦值摩擦系數(shù)為0和0.4耘戚, 注意屬性friction是浮點型嗡髓,需要在數(shù)值后面加F。然后找到Player的碰撞體collider收津,把他的sharedMaterial賦值為我們創(chuàng)建的材質(zhì)即可饿这。
打開Unity編輯器浊伙,Window->General>Console可以調(diào)出控制臺窗口,代碼里打的Log(Debug.Log)可以在這里看到蛹稍。
實際上修改了摩擦系數(shù)后,現(xiàn)象仍然存在部服,說明不是摩擦系數(shù)的緣故(假設(shè)我實現(xiàn)正確)唆姐。猜測應(yīng)該是跳起后碰到墻面時判斷為碰撞,將向上運動的速度直接置為了0廓八,那么我們找找看哪里控制上升速度奉芦。然后我在KinematicObject里面找到了這段代碼:
...
else
{
//We are airborne, but hit something, so cancel vertical up and horizontal velocity.
velocity.x *= 0;
velocity.y = Mathf.Min(velocity.y, 0);
}
...
顯然,我們?nèi)サ暨@段就可以了剧蹂。實際上我們只需要碰墻壁的時候繼續(xù)保持縱向移動声功,所以只需要去掉第二行。經(jīng)測試已經(jīng)能達(dá)到目的了宠叼,但是天花板磕腦袋的效果也消失了先巴,顯然是因為我們沒有判斷碰到的是墻壁還是天花板。暫時還不知道怎么區(qū)分天花板和墻壁冒冬,這個問題就這樣吧伸蚯。
2. 隱藏要素設(shè)計不合理
這個比較簡單,設(shè)置一個彈簧裝置和通道简烤,讓角色可以彈上出生地剂邮。通道其實是背景+物體,可以仿照場景中的隱藏通道來做横侦,也可以直接顯示背景挥萌。
事實上一條隱藏的死路很有可能就是設(shè)計意圖,并不是不合理枉侧。
3. 加速跑和二段跳
加速跑的關(guān)鍵是按住某個加速按鍵后引瀑,橫向速度增加一個隨時間衰減的加速度。假設(shè)我們以Shift鍵為加速鍵榨馁,那么我們仿照J(rèn)ump鍵的判斷伤疙,就可以判斷Shift鍵。這里需要做兩件事:新增加速按鍵的定義辆影,以及當(dāng)加速按下和松開時的邏輯徒像。我們查看Edit->Project Setting->Input,發(fā)現(xiàn)預(yù)定義的按鍵已經(jīng)夠用了蛙讥,left shift按鍵綁定的名稱為Fire3锯蛀,不需要新增。如果要新增次慢,在Input界面新增按鍵配置旁涤。
// 本段代碼未經(jīng)驗證
if (Input.GetButtonDown("Fire3")) {// this is accelerate key
if (!isAcce && acce == 0) {
acce = 50;
isAcce = true;
}
velocity.x += acce * 0.001F;
acce -= 1;
} else if (Input.GetButtonUp("Fire3")){
acce = 0;
isAcce = false;
}
二段跳的關(guān)鍵是判斷身處空中以及是否已經(jīng)進行過二段跳翔曲,我們用一個計數(shù)器來解決。修改了兩處地方劈愚,一處是跳躍狀態(tài)判斷瞳遍, 當(dāng)空中再次按跳躍鍵時判斷是否滿足二段跳條件。另一處是縱向速度計算的條件菌羽,當(dāng)二段跳時無論處于什么速度掠械,再給一個縱向速度。目標(biāo)完成注祖,代碼片段如下:
public bool CanJump() {
return jumpState == JumpState.Grounded ||
jumpState != JumpState.Grounded && jumpCount < 2;
}
protected override void Update() {
...
if (CanJump() && Input.GetButtonDown("Jump")) {
jumpState = JumpState.PrepareToJump;
}
...
}
void UpdateJumpState()
{
jump = false;
switch (jumpState)
{
...
case JumpState.Jumping:
if (!IsGrounded)
{
Schedule<PlayerJumped>().player = this;
collider.sharedMaterial = p1;
jumpState = JumpState.InFlight;
jumpCount += 1;
}
break;
...
case JumpState.Landed:
jumpState = JumpState.Grounded;
jumpCount = 0;
break;
}
}
protected override void ComputeVelocity()
{
if (jump && (IsGrounded || CanJump()))
{
velocity.y = jumpTakeOffSpeed * model.jumpModifier;
jump = false;
}
...
}
- 背景/前景貼圖錯誤
怎么修改現(xiàn)有的背景貼圖還沒搞明白(Hierarchy里點擊Level它不會顯示單獨的一塊磚的屬性猾蒂,在Assets里看了半天,也試著將Assets里的RightTile拖到Scene中但沒有效果)是晨,這個跟前面區(qū)分天花板肚菠,墻壁和地面的問題一起留待后續(xù)理解。
上面幾個問題搞了接近5個小時罩缴, 效果還算滿意(也遺留了很多疑問蚊逢,例如地面判斷,斜坡/跳臺/異形障礙物時如何判斷箫章,彈簧效果/阻尼效果如何實現(xiàn)时捌,不過暫時無法解答),就到此為止吧炉抒,明天學(xué)習(xí)下一個官方示例奢讨,查看Unity的API文檔,順便回顧一下C#的基本語法焰薄。