使用Unity製作經典2D遊戲之貪吃蛇(上)

2021-01-18 Unity牆外的世界



這篇文章將講解怎麼使用Unity製作簡單的貪吃蛇遊戲。貪吃蛇是一種街機遊戲,最早的原型誕生於1976年。正如大多數街機遊戲一樣,它開發簡單,且娛樂性強(至少克森的童年時玩它玩過來的)。




知識


我們的文章不需要什麼特別的技巧,只需知道Unity的基本操作,例如:GameObject和Transform的概念等等。即使你不了解也沒關係,只要你跟著我的思路來即可。


Unity版本

在本章教程中,我們將使用Unity5.0.04版本來製作。對於舊的版本也可以正常運行,不過建議大家還是使用Unity5.0以上的版本。




讓我們開始吧。首先先創建一個項目:



將該工程命名為「snake」,路徑由你們來設置,這裡我設置的是C盤根目錄下,選擇2D開發,然後點擊創建項目按鈕:




我選擇場景中的Main Camera(主相機),然後再Inspector面板中修改相機的Background為黑色背景,最後調整Size和Position,如下圖所示(注意參數要一樣,方便後續跟進):









我們將使用下面兩張圖片來製作我們的邊框:


border_horizontal.png

border_vertical.png



你可以右擊將圖片保存到你項目的Assets文件夾下。



我們再一次在Assets下選擇這兩張圖片,如下所示:



之後,我們可以在Inspector面板中改變他們的導入設置,改變參數如下圖所示:




Pixels Per Unit 是在圖片中的一個像素與世界坐標中的一個單位之間的比例尺。貪吃蛇每移動一步將對應遊戲世界坐標上的一個單位。這就是為什麼我們要把Pixels Per Unit設置為1的原因。



現在,我們可以製作我們的邊框了。首先把Assets下的兩張圖片拖拽到Hierarchy面板下,拖拽兩次(你也可以通過複製的方式實現),如下圖所示:



使用border_horizontal來製作頂部和底部的邊框,使用border_vertical來製作左邊和右邊的邊框。



讓我們為它們重命名一下,方便查找。如下圖所示(Top是頂部,Bottom是底部,Left是左邊,right是右邊):



現在,它們在遊戲中只是一張一張的圖片,毫無卵用,現在就讓我們為這些圖片添加Colliders(碰撞器)組件,讓這些圖片變為一堵堵牆吧。


首先先在Hierarchy面板中選擇那四張圖片,如下圖所示;



好,把它們都選中之後,在Inspector面板中找到Add Component按鈕,點擊它,然後找到Physics2D,最後點擊Box Collider2D即可,如下圖所示:



剛剛我們所做的操作,不用寫任何一行代碼,便能讓一張毫無卵用的圖片編程了一堵牆,太感謝Unity這個強大的遊戲引擎了。




我們不想讓我們的貪吃蛇餓死,因此,讓我們在遊戲中隨機生成一些食物,提供給蛇食用吧。和上面的操作一樣,我們將使用一張圖片來製作食品。在我們的教程中,他只是一個像素的色塊:


還是老樣子,右擊該圖片,將它保存到你項目的Assets文件夾下。



還是老樣子,將它的導入設置修改一下,如下圖所示:



好吧,讓我們把food拖到場景中,Unity會自動的幫我們在Hierarchy面板中創建一個相對應的遊戲物體,如下所示(你的位置也許跟下圖不一樣,這根據你拖拽的位置而定):



每當貪吃蛇碰到food(也就是食物)的時候,應當獲得一些相應的信息。因此我們也要給

food(食物)添加Collider(碰撞器)組件。


一個遊戲物體沒有Collider(碰撞器)組件,那麼它只是一個可視化物體(就是沒有交互功能的物體),它不是物理世界的一部分。一旦我們為遊戲物體添加了Collider(碰撞器)組件,它如一堵牆,任何物體都不能穿透它,且能通過碰撞檢測事件來進行交互,如:OnCollisionEnter2D、OnCollisionStay2D等等。假如我們勾選了Is Trigger,它便如水一般,可以穿透它,且能通過觸發檢測事件來進行交互,如:OnTriggerEnter2D、OnTriggerStay等等。


當貪吃蛇穿過food(食物)時,貪吃蛇應該得到一些通知(就是所謂的響應事件)。然而食物不能像牆一樣不能穿過它,因此我們現在要做的就是為food(食物)添加Collider(碰撞器),並且勾上Is Trigger:



好了,現在我們不想讓food(食物)在遊戲一開始就出現。因此我們把它做成一個預製體,以便我們使用Instantiate函數來生成它,每當我們需要它的時候。現在,讓我們把food(食物)重命名為「FoodPrefab」,然後把它拖到Assets文件夾下:



現在我們可以刪除Hierarchy面板中的FoodPrefad了,因為我們暫時不需要它了。

讓我們在遊戲開始之後,間隔幾秒就在隨機的地方生成一個food(食物)。那麼,就讓我們創建一個腳本來控制食物的生成吧。我們將把腳本放置在Main Camera下(因為Main Camera始終在遊戲場景中)。首先,在Hierarchy中選擇Main Camera,然後再Inspector面板中招到Add Component按鈕,點擊New Script,在Name的輸入框中輸入SpawnFood,腳本類型選擇C Sharp,如下所示:



然後打開該腳本(雙擊即可):


using UnityEngine;
using System.Collections;

public class SpawnFood : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}


我們不需要Update()函數,把它刪除了:


using UnityEngine;
using System.Collections;

public class SpawnFood : MonoBehaviour {

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


這個腳本需要獲取食物預製體,因此,我們將添加一個類型為GameObject類型的公開變量:


using UnityEngine;
using System.Collections;

public class SpawnFood : MonoBehaviour {
    // Food Prefab
    public GameObject foodPrefab;
    
    // Use this for initialization
    void Start () {
    
    }
}


食物應該是在邊界內生成的。因此,我們也需要在我們的腳本中通過一些變量獲得邊框位置的相應信息,如下所示:


using UnityEngine;
using System.Collections;

public class SpawnFood : MonoBehaviour {
    // Food Prefab
    public GameObject foodPrefab;

    // Borders
    public Transform borderTop;
    public Transform borderBottom;
    public Transform borderLeft;
    public Transform borderRight;

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



我們已經將他們聲明為Transform類型了,因此我們如borderTop.transform.posion這樣調用position了,直接borderTop.position即可。



讓我們創建Spawn()函數在邊界內生成food(食物)。首先我們通過x變量來獲取左邊界和右邊界之間的隨機位置信息,然後通過y變量來獲取上邊界和下邊界之間的隨機位置信息。然後我們便在該位置生成food(食物):


// Spawn one piece of food
void Spawn() {
    // x position between left & right border
    int x = (int)Random.Range(borderLeft.position.x,
                              borderRight.position.x);

    // y position between top & bottom border
    int y = (int)Random.Range(borderBottom.position.y,
                              borderTop.position.y);

    // Instantiate the food at (x, y)
    Instantiate(foodPrefab,
                new Vector2(x, y),
                Quaternion.identity); // default rotation
}



x 和 y通過使用(int)強制轉換來確保該food(食物)生成的位置是整數,如(1,2),而不是帶有小數點的形式,如(1.234, 2.74565)。



現在,讓我們的腳本在每幾秒後調用Spawn()函數,我們可以通過使用InvokeRepeating()函數來做:


// Use this for initialization
void Start () {
    // Spawn food every 4 seconds, starting in 3
    InvokeRepeating("Spawn", 3, 4);
}



InvokeRepeating()函數用於在每幾秒內重複調用某個函數。第一個參數是函數的名字,第二個參數是第一次調用的時間,第三個參數是間隔調用的時間。在上面的代碼中,在遊戲開始後3秒調用Spawn函數,然後每4秒再重複調用Spawn函數。



下面是SpawnFood函數的完整代碼:


using UnityEngine;
using System.Collections;

public class SpawnFood : MonoBehaviour {
    // Food Prefab
    public GameObject foodPrefab;

    // Borders
    public Transform borderTop;
    public Transform borderBottom;
    public Transform borderLeft;
    public Transform borderRight;

    // Use this for initialization
    void Start () {
        // Spawn food every 4 seconds, starting in 3
        InvokeRepeating("Spawn", 3, 4);
    }

    // Spawn one piece of food
    void Spawn() {
        // x position between left & right border
        int x = (int)Random.Range(borderLeft.position.x,
                                  borderRight.position.x);

        // y position between top & bottom border
        int y = (int)Random.Range(borderBottom.position.y,
                                  borderTop.position.y);

        // Instantiate the food at (x, y)
        Instantiate(foodPrefab,
                    new Vector2(x, y),
                    Quaternion.identity); // default rotation
    }
}


現在讓我們保存腳本,然後回到Inspector面板中,你將會發現SpawnFood腳本下多了幾個卡槽,現在我們要做的就是找到對應的預製體,將其拖進卡槽中,如下圖所示:



好吧,現在讓我們點擊Play按鈕,然後等待幾秒鐘,我們將能看到遊戲場景中有了一些小點點(食物):



好了,今天就只能到這裡了。看了下表23點55分,明天再把它更完吧。


對上文章的圖片,大夥們可以在下面連結下載:

連結:http://pan.baidu.com/s/1o8lbDJO 密碼:d6ak


Unity牆外的世界 --- 這裡有國外的經典案例、教程、文章,在這裡你將會學到更為先進的Unity開發知識。   

下一篇:使用Unity製作經典2D遊戲之貪吃蛇(下)


更多經典,敬請期待




相關焦點

  • 使用unity製作RPG遊戲3——2D精靈
    前面介紹了使用Tiled製作地圖相關連結http://baijiahao.baidu.com/builder/preview/s?context=%7B%22nid%22%3A%22news_9564882242542237691%22%2C%22sourceFrom%22%3A%22bjh%22%2C%22url_data%22%3A%22bjhauthor%22%7D下面需要利用Tiled2Unity把01地圖導入unity下載Tiled2Unity,在根目錄下打開可執行文件進入unity。
  • 巧用Unity 2D功能:只需六步開發簡單的2D UFO遊戲
    無論我們現在可以選擇多少種類繁多的,擁有逼真畫面感的遊戲,2D遊戲始終會在玩家們的心中佔據一席之地,而對於想邁入開發者行列的同學們來說,先嘗試做一款2D遊戲無疑是合適的起點。Unity中的2D功能讓開發此類遊戲更加的便捷,這篇教程將教大家使用Unity 2D功能製作一個非常簡單的UFO遊戲,整個過程只需要6個步驟,適合Unity初學者以及對Unity的2D功能不甚熟悉的開發者們,希望Unity能讓你初嘗遊戲開發的樂趣,為以後的開發之路奠定基礎,你準備好完成這款簡單的2D遊戲了嗎?
  • unity遊戲製作初始人物控制代碼
    大家好,今天小編帶大家學習一哈unity遊戲製作中初始人物控制代碼。1.我們知道遊戲中,選中人物,在人物未開始運動前,往往會有一個初始的動作,好的,我們這節課通過unity中相關代碼和基礎設置來實現這一效果。
  • 使用Unity 粒子系統實現 2D 人物足跡效果
    之後深入一想腳本大概要怎麼寫,感覺頭大的不行,又想到了 Hierarchy 裡面被 FootStep12345678 塞得滿滿當當的壯麗場面..還是換個方法吧 轉念一想:unity 的粒子系統似乎可以滿足所有特性:生成淡出銷毀全自動,跟隨人物也是基本操作,比較存疑的就是用腳本控制粒子的鏡像與旋轉。
  • 打手電的貪吃蛇:不一樣的貪吃蛇進化論大作戰遊戲小程序
    「良心好遊戲推薦」 搜羅了好玩的微信小遊戲大全, 模擬經營遊戲、恐怖遊戲、消除遊戲、休閒遊戲、 益智遊戲、吃雞遊戲、燒腦遊戲
  • 貪吃蛇進化論:貪吃蛇大作戰遊戲升級版,超萌蛇蛇皮膚免費體驗!
    今日遊戲貪吃蛇進化論關鍵詞:合成、休閒競技、多人大亂鬥、大蛇吃小蛇、貪吃蛇大作戰、貪吃蛇蛇遊戲簡介:《貪吃蛇進化論》是一款精彩刺激的貪吃蛇io類競技遊戲,在貪吃蛇大作戰的世界中,每個人在初始都化身為一條小蛇,通過不斷努力變得越來越長,最終制霸一方!
  • 貪吃蛇蛇:貪吃蛇大作戰、貪吃蛇進化論,都沒這個貪吃蛇好玩!
    「良心好遊戲推薦」 搜羅了好玩的微信小遊戲大全, 模擬經營遊戲、恐怖遊戲、消除遊戲、休閒遊戲、益智遊戲、解密遊戲、燒腦遊戲、解謎遊戲大全、換裝遊戲、養成遊戲
  • 2021新年匯總:Unity項目原型快速開發資源,看這一篇就夠
    2D Game Kit : https://assetstore.unity.com/packages/essentials/tutorial-projects/2d-game-kit-107098 Lost Crypt – 2D Sample Project : https://assetstore.unity.com
  • unity業餘愛好者說一下
    unity業餘愛好者說一下,這幾天傳的關於《太吾繪卷》代碼的事幾乎都是無中生有的事...一群用.net和vs做工程的人談論第三方引擎做的遊戲...真是雞同鴨講。太吾繪卷現在針對幾個常見誤會說一下1.只有一個main (x)unity的腳本都是依附於各個精靈的,沒有main,只有update2.沒有注釋(x)你反編譯出來的代碼有注釋
  • 如何製造一個簡單的2D遊戲?
    No.1引擎選擇當決定開發一款遊戲的時候,第一步要考慮的是遊戲引擎的選擇。所以首先要問自己一個問題:我需要用什麼遊戲引擎來開發遊戲?相對主流的兩款遊戲引擎分別是Unity和Unreal Engine4(UE4),二者各有利弊,比如Unity的3D渲染效果不如UE4,但Unity有許多插件可以使用,開發效率會更高。
  • 使用Unity和HTML5開發移動遊戲的優缺點
    HTML5在開發移動遊戲的優勢比較明顯,但是還是有人希望能使用Unity重構。Unity由Unity Technologies開發的一個讓玩家輕鬆創建諸如三維視頻遊戲、建築可視化、實時三維動畫等類型互動內容的多平臺的綜合型遊戲開發工具,是一個全面整合的專業遊戲引擎。
  • 試試這個能玩貪吃蛇的電子魔方吧!
    在手機上下載 app 後,你可以啟動 QCoo,選擇貪吃蛇遊戲,當 LED 燈光亮起,你就能看到這個「魔方」上面顯示出經典的貪吃蛇點陣,通過把手中的魔方轉來轉去,你可以控制他沿著立方體的六個面不停吃小紅點,而你的「貪吃蛇」會越來越長,遊戲也會越來越困難,玩起來就是一個立體「貪吃蛇」遊戲!
  • unity遊戲項目實踐-2d戰旗策略遊戲
    遊戲項目復現直接使用的是B站的up主-次元生還者的戰旗欄目連結如下https
  • ◆電影【《像素大戰》大金剛貪吃蛇亮相 "吃豆人之父"慘遭"秒殺"】
    由索尼出品,《小鬼當家》《哈利·波特與魔法石》導演克裡斯·哥倫布執導,亞當·桑德勒、彼特·
  • 遊戲粒子碰撞魔法特效Unity遊戲素材資源
    人人素材社區-最專業的CG藝術交流網站小夥伴們玩遊戲時遇到打鬥的畫面會不會感覺很爽,法術碰撞會產生格外好看的效果,這些特效是怎麼做出來的呢,今天為就大家介紹一款遊戲粒子碰撞的魔法特效素材,一起來了解一下。
  • unity實戰之大主宰
    然後回到unity,點擊windows ->package manager,就能找到自己的資源,全部import這裡是獲取場景後的結果:簡單總結遊戲對象的使用遊戲對象的屬性從目前來看,我們最常使用的屬性是位置,尺寸等,可以通過:Object.transform.position
  • 簡化AR體驗創作,Unity MARS Query系統程序化生成場景的原理
    Unity MARS的出現是為了幫助創作者們製作可適應環境的AR內容,我們希望解決AR開發者們面臨的幾個主要問題:如何精確地在現實中描繪內容、如何加快AR創作在各個環境下的迭代與測試時間()以及如何讓虛擬內容適應不同的環境。以上幾點都是與內容適應性相關的問題。
  • 遊戲史上那些奇葩:你就是我的小蘋果
    經歷了熱鬧的年假之後,相信很多人都已經回到了工作當中,而遊戲日報小笙也將為大家繼續介紹那些在2月12日上市的奇葩遊戲。第一款遊戲是《蘋果大逃亡(SnakEscape)》,於2016年2月12日PC上市,這是一款由Triple-Star Studio,Rock Path Collective製作,Rock Path Collective發行的休閒冒險類遊戲。
  • Unity基礎之物理引擎
    我們在unity裡面建了一個正方體cube , 要如何使這個cube可以跟現實中的物體一樣受重力呢 ? 這就需要用到Rigidbody(剛體)組件了 .單擊cube , 在右邊的Inspector面板添加Rigidbody組件添加完Rigidbody組件後,cube1就可以受重力影響了,運行unity時,cube1會因為受到重力往下落.下面為大家介紹 Rigidbody 組件常用參數 : 1. Mass : 物體的質量 .
  • mac版Unity Pro遊戲開發工具如何創建和使用腳本
    Unity Pro 2018 for mac是遊戲開發必備的軟體之一,unity mac版主要用於創建2D和3D跨平臺遊戲,比如三維視頻遊戲、實時三維動畫、建築可視化等類型,儘管Unity的內置組件可以實現多種用途,但是您很快就會發現,您需要超越它們提供的功能來實現自己的遊戲功能。