Unity學(xué)習(xí)流水賬-2-新手教程-橫版卷軸動作游戲場景

由于我自身知識的局限,下面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工程進行試玩,手感太差了,主要有三個問題:

  1. 貼墻跳和挨著物體跳的判定很難受晾捏,無法跳到上方的下個塊蒿涎,會被判定碰撞。在高臺邊緣也有這種情況惦辛,會被判定下落
  2. 開頭的隱藏路徑是死路劳秋,沒有任何獎勵,這不合理
  3. 要是有加速跑和二段跳就好了
  4. (說好的三個問題呢胖齐?)有一個地方浮空磚塊的右邊塊錯用成了中間磚塊的貼圖

下面我們就拿著新手村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;
            }
            ...
        }
  1. 背景/前景貼圖錯誤
    怎么修改現(xiàn)有的背景貼圖還沒搞明白(Hierarchy里點擊Level它不會顯示單獨的一塊磚的屬性猾蒂,在Assets里看了半天,也試著將Assets里的RightTile拖到Scene中但沒有效果)是晨,這個跟前面區(qū)分天花板肚菠,墻壁和地面的問題一起留待后續(xù)理解。

上面幾個問題搞了接近5個小時罩缴, 效果還算滿意(也遺留了很多疑問蚊逢,例如地面判斷,斜坡/跳臺/異形障礙物時如何判斷箫章,彈簧效果/阻尼效果如何實現(xiàn)时捌,不過暫時無法解答),就到此為止吧炉抒,明天學(xué)習(xí)下一個官方示例奢讨,查看Unity的API文檔,順便回顧一下C#的基本語法焰薄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拿诸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子塞茅,更是在濱河造成了極大的恐慌亩码,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野瘦,死亡現(xiàn)場離奇詭異描沟,居然都是意外死亡,警方通過查閱死者的電腦和手機鞭光,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進店門吏廉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惰许,你說我怎么就攤上這事席覆。” “怎么了汹买?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵佩伤,是天一觀的道長聊倔。 經(jīng)常有香客問我,道長生巡,這世上最難降的妖魔是什么耙蔑? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮孤荣,結(jié)果婚禮上甸陌,老公的妹妹穿的比我還像新娘。我一直安慰自己垃环,他們只是感情好邀层,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布返敬。 她就那樣靜靜地躺著遂庄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪劲赠。 梳的紋絲不亂的頭發(fā)上涛目,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天,我揣著相機與錄音凛澎,去河邊找鬼霹肝。 笑死,一個胖子當(dāng)著我的面吹牛怖喻,可吹牛的內(nèi)容都是我干的剖笙。 我是一名探鬼主播喳逛,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼讯赏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起冷尉,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤漱挎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后雀哨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磕谅,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年雾棺,在試婚紗的時候發(fā)現(xiàn)自己被綠了膊夹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡捌浩,死狀恐怖割疾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘉栓,我是刑警寧澤宏榕,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布拓诸,位于F島的核電站,受9級特大地震影響麻昼,放射性物質(zhì)發(fā)生泄漏奠支。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一抚芦、第九天 我趴在偏房一處隱蔽的房頂上張望倍谜。 院中可真熱鬧,春花似錦叉抡、人聲如沸尔崔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽季春。三九已至,卻和暖如春消返,著一層夾襖步出監(jiān)牢的瞬間载弄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工撵颊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宇攻,地道東北人。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓倡勇,卻偏偏與公主長得像逞刷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妻熊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

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

  • abandon, desert, forsake, leave, give up abandon :強調(diào)永遠(yuǎn)或完全...
    sunxiaohang閱讀 2,323評論 0 3
  • 專業(yè)考題類型管理運行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項A選項B選項C選項D選項E選項F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 9,008評論 0 13
  • 1. 準(zhǔn)備場景 下載并導(dǎo)入官方Space Shooter教程的范例素材包夸浅,我們僅使用其中的模型、材質(zhì)固耘、貼圖题篷、Pre...
    shimmery閱讀 6,418評論 0 16
  • 這篇文章默認(rèn)大家已經(jīng)對Unity3D和PlayMaker有一定的了解,所以沒有把所有操作步驟都寫的非常詳細(xì)厅目,不太看...
    shimmery閱讀 6,053評論 6 15
  • 夏季來臨了番枚,越來越多的人開始走進泳池,對于兒童我們家長要看好了安全問題损敷。 兒童溺水防護8個要點: 1. 不要私自下...
    淡寫阿瑞閱讀 262評論 0 2