1. 程式人生 > >使用Unity3D做一個偽3D遊戲吧!(1)

使用Unity3D做一個偽3D遊戲吧!(1)

    本篇小型例項是為像本渣渣一樣剛剛入門U3D的童鞋們製作的,當然理論上包括了設計一部完整遊戲的主要內容,而不是單純的講某些函式怎麼使用

                            ——也就是說,大部分API裡面使用頻率高的內容並不會詳細解釋,並且對於遊戲不會進行比較高效的優化

    那麼開始吧!

        在某個遙遠的二維世界裡,有一個正方形——我們姑且叫它“方塊君”,方塊君的宿敵是五邊形君,因為——

                啊~~~五邊~~~你比四邊多一邊~~~

        什麼鬼,emmmmm,你只需要記住這個事實就可以辣

        但是方塊君沒有能夠擊敗五邊形君的力量,於是它向卡密撒嘛求助,卡密撒嘛告訴它,它可以許下一個願望,獲得某種能力,但是五邊形君們也能獲得同樣的能力,於是方塊君考慮再三,決定向神所要移動和攻擊的能力什麼原來方塊君是不會動的嗎  什麼你不寫指令碼方塊君能動嗎


    於是,這部腦子一熱突發奇想的垃圾遊戲就誕生了(由於壓根沒有什麼美術資源又懶得去AssetsStore找,所有的東西都是幾何圖形拼成的):

你沒有看錯就是這麼簡單

於是乎,方塊君怒了:你不就是把我放在一個梯形裡面嗎!

卡密撒嘛:別急嘛,之後你就能享受到“民主自由”的感覺了,等我敲個程式碼……將這些扔進FixedUpdate()裡面就行辣

        if (Input.GetKey(KeyCode.LeftArrow)&&transform.position.x>=-8f)//按住左方向鍵並限制範圍
        {
            transform.Translate(Vector2.left* Time.deltaTime*5f);
        }
        if (Input.GetKey(KeyCode.RightArrow)&&transform.position.x<=8f)//右方向鍵
        {
            transform.Translate(Vector2.right* Time.deltaTime*5f);
        }

這樣也就實現了方塊君的左右移動

但是方塊君還不知足:光扭扭腰怎麼行,我還得會飛,會時空折躍……教練我想學

卡密:滾犢子,我也想學,那就隨便給你做一個“跳躍”吧!

懶惰是第一生產力,計算機圖形學第一大定律——只要他看起來是對的,那麼他就是對的,方塊君的跳躍也可以用transform.Translate()進行模擬:

我們先定義兩個狀態:

public bool canJump = true, jumping;//是否可以起跳,是否正在跳躍

再定義一個浮空時間:可以根據個人喜好修改,如果是正無窮……恭喜方塊君你會飛啦(當然原理其實不是這樣的)

public float jumptime = 0.5f;

之後我們寫一個跳躍函式!?怎麼看起來這麼辣雞

void jump()
    {
        if (canJump)//如果能跳
        {
            canJump = false;//那麼不能跳
            jumping = true;//那麼正在跳
            jumptime = 0.5f;//那麼重新設定跳躍時間
        }
    }

別急,真正的大頭是要放在FixedUpdate()裡面的:

if (transform.position.y <= -2f)//如果方塊君在“地面”
        {
            canJump = true;//那麼它可以再次起跳
        }
        if(Input.GetKey(KeyCode.UpArrow)){//如果按下上方向鍵
            jump();
        }
        if(jumping){//如果正在跳
            if(jumptime>0.375f){將時間分為三部分:上升,滯空,下降,比例理論上是1:2:1(當然你也可以按自己的喜好來)
                transform.Translate(Vector2.up * Time.deltaTime * 8f);
            }else if(jumptime<=0.15f&&jumptime>=0f){//這裡是一個玄學的地方,本來應該是jumptime<=0.125f,但是這樣會導致方塊君回不到原來高度
                transform.Translate(Vector2.down * Time.deltaTime * 8f);
            }
            jumptime -= Time.deltaTime;//計時器
        }
        if(jumptime<=0){//跳完啦
            canJump = true;//恢復原來的設定
            jumping = false;
        }

那麼我們還是對裡面相關的東西進行解釋:

    ·常數們:

            由於我們做的只是一個單場景小遊戲,所以很多功能還是使用常數效率更高,比如對移動距離的判定:

            

所以橫座標絕對值不超過8

     ·對於“跳躍”:

            可以發現,如果一直按住上方向鍵,方塊君的跳躍是有周期的,也就是說,一直按住該按鍵,呈現的是這樣的一個函式影象

其中,y軸表示方塊君跳起的高度,x軸表示時間,各位可以看一下方塊君起跳的速度應該是8個單位每秒,在落地之後又可以再次起跳

我們通過計時器來進行這樣的設計:

    簡單來說:一旦時間達到設定值,就可以執行一次操作,並且重設時間

    所以,方塊君的第一個願望終於滿足辣,接下來我們還會設計新操作讓方塊君可以射出子彈,拭目以待吧——當然對於大佬們根本不是什麼問題吧……自己也要繼續努力啊(懶得優化是病得治——雖然認真做專案的時候肯定會優化的辣)

啊啊啊不行寫得好爛啊,求各位大佬可以指正一下啊啊啊

畢竟第一次寫比較(專業?)的blog咩