Just for fun——Unity5制作貪吃蛇小游戲

前言

說出來你可能不信正塌。有一天晚上睡不著覺,就突然想到做游戲開發(fā)這么久恤溶,還沒親手實現(xiàn)過經(jīng)典游戲貪吃蛇呢乓诽。然后就在床上想實現(xiàn)的方法,越想越手癢咒程,要不是怕把枕邊人吵醒鸠天,第二天又要上班,真要立刻爬起來把這小游戲?qū)崿F(xiàn)了孵坚。于是想了一會兒粮宛,理清思路之后就逼自己入睡了。
第二天下班之后卖宠,回到家就開始動手巍杈,已經(jīng)搞定了。為了節(jié)約篇幅扛伍,本篇文章只簡單說下思路筷畦。不想看我廢話,需要直接參考代碼的同學(xué)可以到我的Github刺洒。

準(zhǔn)備工作

我使用了Unity自帶的創(chuàng)建簡單3D物體的功能來制作蛇頭和蛇身的prefab鳖宾。蛇身直接用Cube,而蛇頭需要添加BoxCollider和Rigidbody組件逆航。為了將不同的物體區(qū)別開鼎文,我還寫了一個純色的shader:

Shader "Custom/PureColor" {
    Properties{
        _Color ("顏色", Color) = (0.8 ,0,0,0)
    }
    SubShader {
        Pass{
            Color[_Color]
        }
    }
    FallBack "Diffuse"
}

我們可以創(chuàng)建一個材質(zhì),將材質(zhì)的shader設(shè)為Custom/PureColor因俐,再將該材質(zhì)賦給特定物體拇惋。可以用這個shader創(chuàng)建多個材質(zhì)與其他物體區(qū)分開抹剩。
如圖是我們需要的所有資源:

retro_snaker_res.png

其中撑帖,所有的材質(zhì)都使用上述的shader并指定不同的顏色。
除此之外澳眷,我們需要在Project Settings的Input中增加四個按鈕:
UP,DOWN,LEFT,RIGHT
我們的關(guān)卡也很簡單:
1.創(chuàng)建幾個Sphere物體當(dāng)做貪吃蛇的食物胡嘿,設(shè)置位置為整數(shù)以便于我們的貪吃蛇在運(yùn)動時能夠吃個正著(因為Unity默認(rèn)的Cube物體的邊長是1,Sphere的半徑是0.5)钳踊。
2.將SphereCollider的半徑設(shè)小一點衷敌,例如0.25以便于我們的貪吃蛇碰到這些食物時看起來像真的吞噬了它們勿侯。
3.將SphereCollider設(shè)為觸發(fā)器
看起來像這樣:

retro_snaker_level

實現(xiàn)

首先定義一個枚舉來代表節(jié)點運(yùn)動的四個方向:

public enum MoveDir
{
    UP,
    LEFT,
    RIGHT,
    DOWN
}

我們僅需三個類來完成這個游戲的核心部分逢享。
RetroSnaker負(fù)責(zé)游戲的主要控制罐监,包括游戲狀態(tài)更新吴藻,用戶輸入瞒爬,產(chǎn)生新節(jié)點等。
部分代碼如下:

    void Awake()
    {
        _snakeHeadPrefab = Resources.Load(_snakeHeadResPath) as GameObject;
        _snakeNodePrefab = Resources.Load(_snakeNodeResPath) as GameObject;
    }

    // Use this for initialization
    void Start()
    {
        RetroSnakerStart();
    }

    // Update is called once per frame
    void Update()
    {
        if (_isInPause)
            return;
        _timer += Time.deltaTime;
        if (_timer >= _timeGap)
        {
            _timer = 0.0f;
            MoveSnake();
        }
        ChangeMoveDir();
    }

RetroSnakerStart函數(shù)在游戲開始時生成一條起始蛇沟堡。MoveSnake函數(shù)主要調(diào)用當(dāng)前所有節(jié)點的Move函數(shù)來完成運(yùn)動侧但。ChangeMoveDir函數(shù)接受用戶輸入并記錄轉(zhuǎn)向

SnakeNode是組成貪吃蛇上每一個節(jié)點上的類航罗。主要控制該節(jié)點運(yùn)動禀横。
部分代碼如下:

    public void Move()
    {
        switch (moveDir)
        {
            case MoveDir.UP:
                MoveUp();
                break;
            case MoveDir.DOWN:
                MoveDown();
                break;
            case MoveDir.LEFT:
                MoveLeft();
                break;
            case MoveDir.RIGHT:
                MoveRight();
                break;
        }
    }

Apple是我們的貪吃蛇要吃的東西,將掛載到我們創(chuàng)建的Sphere物體上粥血。
代碼如下:

using UnityEngine;
using System.Collections;

public class Apple : MonoBehaviour
{
    public static int numberOfObjects = 0;

    #region mono
    // Use this for initialization
    void Start()
    {
        ++numberOfObjects;
    }

    void OnTriggerEnter(Collider collider)
    {
        gameObject.SetActive(false);
        --numberOfObjects;
        RetroSnaker snake = GameObject.FindObjectOfType<RetroSnaker>();
        if (snake != null && snake.isActiveAndEnabled)
            snake.OnEatApple();
    }
    #endregion mono

}

在Apple類中我們使用一個靜態(tài)成員numberOfObjects記錄Apple的數(shù)量,這樣當(dāng)該成員變?yōu)?時复亏,則我們吃光了Apple,完成關(guān)卡缔御。

主要難點我感覺在于貪吃蛇接受輸入后轉(zhuǎn)向,其余節(jié)點在下次繪制時要跟隨上一節(jié)點的運(yùn)動方向耕突。所以我用一個list來記錄總共需要發(fā)生幾次轉(zhuǎn)向笤成。用戶每產(chǎn)生一個有效的輸入就增加一個轉(zhuǎn)向。每次繪制后逐一對這些轉(zhuǎn)向遍歷眷茁,并將改變了的索引加1炕泳,下次繪制時即可改變后一節(jié)點的運(yùn)動方向上祈。如果索引超出了貪吃蛇的長度培遵,則可以移除該轉(zhuǎn)向。
這里貼出完成一次移動后設(shè)置節(jié)點運(yùn)動方向雇逞,以及移除一個轉(zhuǎn)向的代碼:

List<int> tempIndexs = new List<int>();
for (int i = 0; i < _indexs.Count; i++)
    {
        int index = _indexs[i];
        if (index > 0 && index < _snake.Count)
        {
            _snake[index].moveDir = _snake[index - 1].moveDir;
            _indexs[i]++;
        }
        if (_indexs[i] < _snake.Count)
            tempIndexs.Add(_indexs[i]);
    }
    _indexs = tempIndexs;

最后荤懂,還是建議你到我的Github查看完整工程塘砸。Have Fun!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市掉蔬,隨后出現(xiàn)的幾起案子矾瘾,更是在濱河造成了極大的恐慌箭启,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅寡,死亡現(xiàn)場離奇詭異,居然都是意外死亡芜抒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門宅倒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屯耸,“玉大人,你說我怎么就攤上這事疗绣。” “怎么了灶搜?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵工窍,是天一觀的道長。 經(jīng)常有香客問我患雏,道長,這世上最難降的妖魔是什么淹仑? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任匀借,我火速辦了婚禮颜阐,結(jié)果婚禮上吓肋,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好紫新,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著李剖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偶芍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天腋寨,我揣著相機(jī)與錄音化焕,去河邊找鬼铃剔。 笑死,一個胖子當(dāng)著我的面吹牛键兜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播普气,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼现诀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仔沿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤绵跷,失蹤者是張志新(化名)和其女友劉穎成福,沒想到半個月后碾局,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奴艾,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年蚯瞧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埋合。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡甚颂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出振诬,到底是詐尸還是另有隱情,我是刑警寧澤赶么,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站清钥,受9級特大地震影響放闺,放射性物質(zhì)發(fā)生泄漏祟昭。R本人自食惡果不足惜怖侦,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搬葬。 院中可真熱鬧旗吁,春花似錦踩萎、人聲如沸很钓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袁稽。三九已至勿璃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間补疑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工诊胞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留锹杈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓竭望,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闭专。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348

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

  • 原文地址 http://www.fx114.net/qa-75-172454.aspx 使用Profiler工具...
    IongX閱讀 5,835評論 1 11
  • 111. [動畫系統(tǒng)]如何將其他類型的動畫轉(zhuǎn)換成關(guān)鍵幀動畫? 動畫->點緩存->關(guān)鍵幀 112. [動畫]Unit...
    胤醚貔貅閱讀 12,979評論 3 90
  • This article is a record of my journey to learn Game Deve...
    蔡子聰閱讀 3,762評論 0 9
  • 老爸是一九五三年出生的,沒過幾年好日子杖小,六零年就到了。老爸就喜歡上學(xué)予权,能有點吃的,家里人多扫腺,都吃不上飯,...
    馬有才2008閱讀 130評論 2 1
  • 不眠的夜晚在嘲笑永眠的靈魂笆环, 黑色在嘲笑虛無厚者,虛無沒有回應(yīng), 或者在回應(yīng)所有库菲,你無法分辨。 逝去的,眉眼鳖擒,借新的面...
    Probot閱讀 155評論 0 0