- 📢博客主頁:https://blog.csdn.net/zhangay1998
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 呆呆敲代碼的小Y 原創,首發于 CSDN🙉
- 📢未來很長,值得我們全力奔赴更美好的生活?
目錄
- 📣前言
- 🎬貪吃蛇小游戲制作
- 🎥游戲介紹
- 🏳??🌈打開Unity 新建一個專案,匯入素材資源包
- 🏳??🌈新建一個場景,設定 開始場景 的界面
- 🏳??🌈設定 開始場景 的 側邊欄
- 🏳??🌈新建一個場景,設定 游戲場景 的界面
- 🏳??🌈給游戲場景添加可視化邊界
- 🏳??🌈制作小蛇并讓其移動
- 🏳??🌈隨機生成食物、食物被吃掉 和 生成新的食物
- 🏳??🌈小蛇吃食物變長 和 蛇身的移動
- 🏳??🌈蛇身邊界傳送效果
- 🏳??🌈分數和長度的記錄
- 🏳??🌈游戲暫停 和 選單鍵 的設定
- 🏳??🌈蛇死亡的處理 和 游戲得分記錄
- 🏳??🌈用戶的設定和儲存
- 🏳??🌈游戲打包及發布
- 🎄原始碼展示
- 🎁游戲原始碼下載 和 效果展示
- 👥總結
- 🚀往期優質文章分享
📣前言
- 今天給大家帶來一款經典的貪吃蛇小游戲,相信大家應該都應該玩過
- 包括小時候在經典的諾基亞手機上,也是百玩不厭,算是最經典的游戲之一了!
- 那今天就來學習一下怎樣制作這個經典的貪吃蛇小游戲吧!
🎬貪吃蛇小游戲制作


🎥游戲介紹
-
本篇小游戲使用Unity引擎制作一款經典的貪吃蛇小游戲
-
跟小時候玩過諾基亞手機上的玩法類似,然后使用一套自己的素材制作
-
有兩種游戲模式 和 兩款小蛇的皮膚,每當吃到食物就會變長!
-
本篇教程使用的Unity的版本是2018.4.24,不同版本可能會出現略微差異
-
文章字數挺多,其實整個游戲只用了四個腳本,直接結合原始碼看文章效果更佳!
🏳??🌈打開Unity 新建一個專案,匯入素材資源包
第一步還是老樣子,先打開UnityHub,新建一個專案
這里要注意的是選擇一個2D專案,因為貪吃蛇是一個2D游戲
所以我們只需要創建一個 2D專案 而不需要 3D專案!如下所示

創建完了之后我們需要匯入一個貪吃蛇的素材包,這個素材包在文章后面我會和原始碼一起分享!
先來看看匯入之后這個資源包中都有什么內容吧!

匯入之后工程目錄結構如下:
有一個聲音檔案夾、模型檔案夾、文字檔案夾和精靈圖片檔案夾
里面都包含幾個簡單的貪吃蛇會用到的對應檔案
🏳??🌈新建一個場景,設定 開始場景 的界面
在工程下新建一個場景Sence
然后新建一個Image,然后將畫布的渲染模式改為攝像機渲染

將Image設定跟畫布一個大小

把資源包中的這個背景拖到Image上,這樣的話Image就會作為一個游戲背景來顯示~

- 然后把
image改名為bg,然后再新建一個Image,改名為ControllerPanel - 這個新建的
Image作為一個開始場景中的側邊欄,調整一下位置,放到Canvas左側! - 然后還要新建一個
Text文本組件,調整一下Text的位置,放到Canvas上邊側就好 - 然后輸入
貪吃蛇,改個字體大小,字體選擇我們資源包中的效果,效果如下:

然后還需要加一個Button作為一個 開始按鈕
那就來新建一個Button,然后選擇資源包中的這個Go圖片作為點擊按鈕,并將Button下的Text本文改為開始,效果如下:

然后還可以給這個開始按鈕加一個outline和shadow組件來做一個陰影效果!
如下所示:

然后我們可以在背景圖bg下面新建一些Image加一些小圖片做一個點綴效果
當然這不是必須要做的哈,知識單純的讓看起來可以更美觀一些,要不然有些空空的
圖片都是資源包中的,只需要更換一下圖片素材就好了,效果如下:

🏳??🌈設定 開始場景 的 側邊欄
這個側邊欄會用來顯示皮膚、模式選擇和分數顯示,在一開始的游戲展示中我們也看到了,所以這里需要來設定一下
我們在ControPanle下新建一個Text文本框,輸入皮膚兩個字,然后調整一下字體大小和位置
如果不知道設定多少比較好,可以參考下我設定的,引數和效果如下:

然后照葫蘆畫瓢,繼續加一個模式選擇 和 分數顯示,效果如下:

三個標題添加好了,但是里面還有小標題,再來繼續設定一下
先來設定一下分數
在分數Store下新建一個Text文本作為上次成,,輸入:上次:長度0,分數0
然后調整一下大小和位置,引數和效果如下:

然后繼續照葫蘆畫瓢,添加一個最好成績,引數和效果如下:

然后接下來搞一下模式的設定
我們在模式Mode下新建一個Toggle選擇框,用于做模式選擇的時候使用

改一下名字為:Border,然后設定一下文字大小等引數,效果如下:

然后照葫蘆畫瓢再來整一個自由模式,引數效果如下:

這里只是為了做一個UI效果,具體怎樣設定都可以,只是作為一個參考!
然后還沒完,因為正常游戲中兩種模式只能選擇一個,所以我們在這里需要添加一個組件用于控制
那就是Toggle Group組件,這是UGUI自帶的一個組件,目的就是遇到這多個選擇框只能選擇一個的時候使用
我們給Mode物件身上添加一個Toggle Group組件,然后在兩個邊界模式的Toggle組件屬性中的Group設定成父物體身上的Toggle Group組件,效果如下:


然后還有一個皮膚選擇沒有設定,再來設定一下
同理也是需要添加一個Toggle組件,然后設定一下位置和大小
然后我們對這個Toggle組件做一個簡單的配置,使用我們的素材給他裝飾的好看一些
這一步也是自己看興趣設定,哪怕使用一個默認的Toggle組件不做裝飾也是可以的!
配置好了之后如下圖所示:

如果詳細的配置資訊沒有看明白,可以結合后面的原始碼來進行更詳細的引數設定
因為在文中可能有地方語言描述真的很費勁,所以結合原始碼工程觀看,學習體驗效果更佳!
然后照葫蘆畫瓢再來配置一個其他顏色的,直接復制一個,然后調整位置修改一下
如下所示:

然后同模式選擇一樣,皮膚也只能選擇一個來進行游戲
所以這里還是需要添加一個Toggle Group組件給Skin物件添加上
然后給兩個小蛇的物件Bule和yellow的Group屬性中將父物體添加上,效果如下:


然后開始界面的UI基本上算是搭建完畢了,接下來就是下一步了!
🏳??🌈新建一個場景,設定 游戲場景 的界面
開始場景我們設定完了,還需要一個進行游戲的場景設定
我們在Sence檔案夾中新建一個場景Main作為游戲場景
然后跟開始場景中一樣,對側邊欄進行設定,設定的引數和開始場景并沒有很大的區別
直接來看一下我設定的即可,就是單純的UI大小位置設定,查看更詳細的設定參照原始碼即可,很簡單就不贅述了!

🏳??🌈給游戲場景添加可視化邊界
基本的游戲場景設定完了,在我們的小蛇碰到邊界的時候是會觸發不同的效果的
- 在
邊界模式中,碰到邊界就會死亡,結束游戲 - 在
自由模式中,碰到邊界會進行一個穿透傳送效果
那接下來就來設定一下游戲的邊界處理
我們在bg下新建一個Image作為上邊界,給這個Image添加一個碰撞體BoxCollider然后調整圖片和碰撞體的大小
引數和效果如下所示:

這里的話不同的電腦可能引數會有略微差異,根據自己的視圖大小調整這個邊界的位置和大小即可
最終效果是讓這個游戲視圖的上下所有邊界都完整覆寫即可!如下所示:

🏳??🌈制作小蛇并讓其移動
現在我們游戲場景有了,那接下來就需要一條小蛇來進行游戲了
所以我們在Canvas下新建一個Image命名為SnakeHead并將我們素材中的一個小蛇頭的圖片拖上去
調整一下這個Image的大小為45即可,如下所示

然后就是撰寫一個SnakeHead腳本代碼讓小蛇動起來,新建一個腳本,將一下代碼放進去即可!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SnakeHead : MonoBehaviour
{
public float velocity = 0.35f;
public int step;
private int x;
private int y;
private Vector3 headPos;
void Start()
{
InvokeRepeating("Move", 0, velocity);
x = 0; y = step;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) )
{
CancelInvoke();
InvokeRepeating("Move", 0, velocity - 0.2f);
}
if (Input.GetKeyUp(KeyCode.Space))
{
CancelInvoke();
InvokeRepeating("Move", 0, velocity);
}
if (Input.GetKey(KeyCode.W) && y != -step )
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);
x = 0; y = step;
}
if (Input.GetKey(KeyCode.S) && y != step )
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 180);
x = 0; y = -step;
}
if (Input.GetKey(KeyCode.A) && x != step )
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 90);
x = -step; y = 0;
}
if (Input.GetKey(KeyCode.D) && x != -step )
{
gameObject.transform.localRotation = Quaternion.Euler(0, 0, -90);
x = step; y = 0;
}
}
void Move()
{
headPos = gameObject.transform.localPosition; //保存下來蛇頭移動前的位置
gameObject.transform.localPosition = new Vector3(headPos.x + x, headPos.y + y, headPos.z); //蛇頭向期望位置移動
}
}
通過鍵盤按鍵來讓小蛇進行不同方向的移動,并設定一個時間和一個移動速度即可,效果如下:

🏳??🌈隨機生成食物、食物被吃掉 和 生成新的食物
現在小蛇可以進行移動了,還需要添加一個食物的自動生成,所以再接著來做這個食物的隨機生成
隨機生成食物也很簡單,先來判斷一下食物可以生成的范圍,肯定就是游戲邊界內,不能生成到游戲場景外面
新建一個腳本 FoodMaker用來隨機生成一個食物
using UnityEngine;
using UnityEngine.UI;
public class FoodMaker : MonoBehaviour
{
public int xlimit = 21;
public int ylimit = 11;
public int xoffset = 7;
public GameObject foodPrefab;
public Sprite[] foodSprites;
private Transform foodHolder;
void Start()
{
foodHolder = GameObject.Find("FoodHolder").transform;
MakeFood();
}
public void MakeFood()
{
int index = Random.Range(0, foodSprites.Length);
GameObject food = Instantiate(foodPrefab);
food.GetComponent<Image>().sprite = foodSprites[index];
food.transform.SetParent(foodHolder, false);
int x = Random.Range(-xlimit + xoffset, xlimit);
int y = Random.Range(-ylimit, ylimit);
food.transform.localPosition = new Vector3(x * 30, y * 30, 0);
}
}
使用ylimit 和xlimit來控制一個隨機生成的邊界
通過foodSprites陣列來控制隨機生成食物的圖片
然后這樣就可以隨機生成食物了,后面會寫方法,當小蛇吃掉一個食物的時候再生成新的食物就好了!
上面說了食物的一個隨機生成,那接下來要對食物被吃掉和生成一個新的食物來進行邏輯處理
我們要從蛇頭這邊來介入,因為只有當蛇頭碰到食物之后,食物才會消失,是通過碰撞檢測來完成的
所以要給蛇頭添加一個碰撞體和剛體,來進行一個碰撞檢測!

然后在SnakeHead腳本中添加代碼用來檢測食物
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Food"))
{
Destroy(collision.gameObject);
FoodMaker.Instance.MakeFood((Random.Range(0, 100) < 20) ? true : false);
}
}
這樣的話當蛇頭碰到食物之后,食物就會消失,然后呼叫生成食物的方法繼續生成新的食物啦!
🏳??🌈小蛇吃食物變長 和 蛇身的移動
現在小蛇可以進行吃食物了,而且食物也會被吃掉之后隨機生成新的,但是蛇身還沒有變長
所以現在來寫一下蛇身變長的邏輯和代碼,還是在SnakeHead腳本中添加代碼
宣告一個List用來蛇身的處理,后續蛇身移動的時候會用到
public List<Transform> bodyList = new List<Transform>();
void Grow()
{
int index = (bodyList.Count % 2 == 0) ? 0 : 1;
GameObject body = Instantiate(bodyPrefab, new Vector3(2000, 2000, 0), Quaternion.identity);
body.GetComponent<Image>().sprite = bodySprites[index];
body.transform.SetParent(canvas, false);
bodyList.Add(body.transform);
}
將這段代碼在蛇吃到食物之后呼叫即可,這樣的話就可以在吃到食物之后蛇身變長了!
然后是蛇身的移動代碼,使用List存盤蛇身,然后讓蛇身的每一個后邊的蛇身位置換到蛇身前邊的位置
這樣就可以形成一個蛇不斷移動的效果,蛇身的后一個節點和前一個節點之間就可以正常跟隨蛇頭移動了!
void Move()
{
headPos = gameObject.transform.localPosition; //保存下來蛇頭移動前的位置
gameObject.transform.localPosition = new Vector3(headPos.x + x, headPos.y + y, headPos.z); //蛇頭向期望位置移動
if (bodyList.Count > 0)
{
//由于我們是雙色蛇身,使用此方法達到顯示目的
for (int i = bodyList.Count - 2; i >= 0; i--) //從后往前開始移動蛇身
{
bodyList[i + 1].localPosition = bodyList[i].localPosition; //每一個蛇身都移動到它前面一個節點的位置
}
bodyList[0].localPosition = headPos; //第一個蛇身移動到蛇頭移動前的位置
}
}
🏳??🌈蛇身邊界傳送效果
在邊界模式下,當蛇碰到邊界時就是觸發死亡,這個操作很簡單
我們在邊界設定了碰撞體,所以當蛇碰到邊界時就會觸發一個回呼
因為我們蛇身移動的邏輯是跟隨前一個結點移動,所以只需要蛇頭的邊界傳送,蛇身就會自動跟隨達到我們想要的效果
所以我們只需要判斷蛇頭到達邊界的時候,改動一下蛇頭的位置就好了!
還是在SnakeHead腳本中添加代碼,關鍵代碼如下
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("Food"))
{
Destroy(collision.gameObject);
MainUIController.Instance.UpdateUI();
Grow();
FoodMaker.Instance.MakeFood((Random.Range(0, 100) < 20) ? true : false);
}
else
{
switch (collision.gameObject.name)
{
case "Up":
transform.localPosition = new Vector3(transform.localPosition.x, -transform.localPosition.y + 30, transform.localPosition.z);
break;
case "Down":
transform.localPosition = new Vector3(transform.localPosition.x, -transform.localPosition.y - 30, transform.localPosition.z);
break;
case "Left":
transform.localPosition = new Vector3(-transform.localPosition.x + 180, transform.localPosition.y, transform.localPosition.z);
break;
case "Right":
transform.localPosition = new Vector3(-transform.localPosition.x + 240, transform.localPosition.y, transform.localPosition.z);
break;
}
}
}
🏳??🌈分數和長度的記錄
現在蛇的基本移動、變長和食物生成等等都做好了
那接下來就是分數的增加了,只需要在吃掉食物的時候呼叫一下就好了!
新建一個腳本MainUIController,用于 控制分數的增加 和 等級的判定
代碼也很簡單,當吃掉食物就進行呼叫即可!
public int score = 0;
public int length = 0;
public Text scoreText;
public Text lengthText;
public void UpdateUI(int s = 5, int l = 1)
{
score += s;
length += l;
scoreText.text = "得分:\n" + score;
lengthText.text = "長度:\n" + length;
}
然后在這個腳本中在寫一下根據不同的分數階段,進行場景背景的一個變化
這就是一個游戲玩法的增加了,代碼如下:
switch (score / 100)
{
case 0:
case 1:
case 2:
break;
case 3:
case 4:
ColorUtility.TryParseHtmlString("#CCEEFFFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 2;
break;
case 5:
case 6:
ColorUtility.TryParseHtmlString("#CCFFDBFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 3;
break;
case 7:
case 8:
ColorUtility.TryParseHtmlString("#EBFFCCFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 4;
break;
case 9:
case 10:
ColorUtility.TryParseHtmlString("#FFF3CCFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 5;
break;
default:
ColorUtility.TryParseHtmlString("#FFDACCFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "無盡階段";
break;
}
🏳??🌈游戲暫停 和 選單鍵 的設定
到這里的話游戲基本功能就是完成了,這一步是將游戲場景中的暫停鍵和回傳選單鍵的功能給加上
之前知識添加了UI,并沒有寫實際的方法,所以這里給加上
還是在MainUIController腳本進行撰寫代碼,因為MainUIController腳本就是一個處理UI相關內容的
public void Pause()
{
isPause = !isPause;
if (isPause)
{
Time.timeScale = 0;
pauseImage.sprite = pauseSprites[1];
}
else
{
Time.timeScale = 1;
pauseImage.sprite = pauseSprites[0];
}
}
public void Home()
{
UnityEngine.SceneManagement.SceneManager.LoadScene(0);
}
很簡單就可以實作暫停和回傳選單的功能實作了!
🏳??🌈蛇死亡的處理 和 游戲得分記錄
小蛇在游戲結束時要記錄一個游戲得分,和一個游戲結束的效果
在SnakeHead腳本中寫一個Die 方法
void Die()
{
isDie = true;
Instantiate(dieEffect);
PlayerPrefs.SetInt("lastl", MainUIController.Instance.length);
PlayerPrefs.SetInt("lasts", MainUIController.Instance.score);
if (PlayerPrefs.GetInt("bests", 0) < MainUIController.Instance.score)
{
PlayerPrefs.SetInt("bestl", MainUIController.Instance.length);
PlayerPrefs.SetInt("bests", MainUIController.Instance.score);
}
StartCoroutine(GameOver(1.5f));
}
這里使用PlayerPrefs存盤一個分數資料給簡單存盤起來即可,然后死亡的時候釋放一個死亡特效
在小蛇撞到邊界和蛇身的時候呼叫即可!
🏳??🌈用戶的設定和儲存
我們需要在開始界面中顯示模式的選擇 和 小蛇皮膚 的選擇,還有上次游戲的分數 和 最高分數的存盤`
新建一個腳本StartUIController ,掛在場景中即可
using UnityEngine;
using UnityEngine.UI;
public class StartUIController : MonoBehaviour
{
public Text lastText;
public Text bestText;
public Toggle blue;
public Toggle yellow;
public Toggle border;
public Toggle noBorder;
void Awake()
{
lastText.text = "上次:長度" + PlayerPrefs.GetInt("lastl", 0) + ",分數" + PlayerPrefs.GetInt("lasts", 0);
bestText.text = "最好:長度" + PlayerPrefs.GetInt("bestl", 0) + ",分數" + PlayerPrefs.GetInt("bests", 0);
}
void Start()
{
if (PlayerPrefs.GetString("sh", "sh01") == "sh01")
{
blue.isOn = true;
PlayerPrefs.SetString("sh", "sh01");
PlayerPrefs.SetString("sb01", "sb0101");
PlayerPrefs.SetString("sb02", "sb0102");
}
else
{
yellow.isOn = true;
PlayerPrefs.SetString("sh", "sh02");
PlayerPrefs.SetString("sb01", "sb0201");
PlayerPrefs.SetString("sb02", "sb0202");
}
if (PlayerPrefs.GetInt("border", 1) == 1)
{
border.isOn = true;
PlayerPrefs.SetInt("border", 1);
}
else
{
noBorder.isOn = true;
PlayerPrefs.SetInt("border", 0);
}
}
public void BlueSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetString("sh", "sh01");
PlayerPrefs.SetString("sb01", "sb0101");
PlayerPrefs.SetString("sb02", "sb0102");
}
}
public void YellowSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetString("sh", "sh02");
PlayerPrefs.SetString("sb01", "sb0201");
PlayerPrefs.SetString("sb02", "sb0202");
}
}
public void BorderSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetInt("border", 1);
}
}
public void NoBorderSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetInt("border", 0);
}
}
public void StartGame()
{
UnityEngine.SceneManagement.SceneManager.LoadScene(1);
}
}
這樣的話用戶選擇的 小蛇的皮膚 和 模式的選擇就可以帶入到游戲場景中了!
🏳??🌈游戲打包及發布
游戲都做好啦,我們可以打包成一個PC端的游戲進行玩耍!
打包程式也很簡單,File -> Build Setting -> Player Setting

然后設定一下游戲圖示和游戲名字,點擊 Build 選擇一個檔案夾即可!

Build結束之后,就會在選擇的檔案夾中出現這樣幾個檔案

我們點擊這個小蛇的頭像的exe檔案就可以直接玩游戲啦!
🎄原始碼展示
由于本工程實際只有四個腳本完成,所以為了方便看代碼學習,直接將所有代碼展示出來
省的還需要打開Unity工程才能查看了
StartUIController腳本 :用于控制開始場景中的控制器
using UnityEngine;
using UnityEngine.UI;
public class StartUIController : MonoBehaviour
{
public Text lastText;
public Text bestText;
public Toggle blue;
public Toggle yellow;
public Toggle border;
public Toggle noBorder;
void Awake()
{
lastText.text = "上次:長度" + PlayerPrefs.GetInt("lastl", 0) + ",分數" + PlayerPrefs.GetInt("lasts", 0);
bestText.text = "最好:長度" + PlayerPrefs.GetInt("bestl", 0) + ",分數" + PlayerPrefs.GetInt("bests", 0);
}
void Start()
{
if (PlayerPrefs.GetString("sh", "sh01") == "sh01")
{
blue.isOn = true;
PlayerPrefs.SetString("sh", "sh01");
PlayerPrefs.SetString("sb01", "sb0101");
PlayerPrefs.SetString("sb02", "sb0102");
}
else
{
yellow.isOn = true;
PlayerPrefs.SetString("sh", "sh02");
PlayerPrefs.SetString("sb01", "sb0201");
PlayerPrefs.SetString("sb02", "sb0202");
}
if (PlayerPrefs.GetInt("border", 1) == 1)
{
border.isOn = true;
PlayerPrefs.SetInt("border", 1);
}
else
{
noBorder.isOn = true;
PlayerPrefs.SetInt("border", 0);
}
}
public void BlueSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetString("sh", "sh01");
PlayerPrefs.SetString("sb01", "sb0101");
PlayerPrefs.SetString("sb02", "sb0102");
}
}
public void YellowSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetString("sh", "sh02");
PlayerPrefs.SetString("sb01", "sb0201");
PlayerPrefs.SetString("sb02", "sb0202");
}
}
public void BorderSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetInt("border", 1);
}
}
public void NoBorderSelected(bool isOn)
{
if (isOn)
{
PlayerPrefs.SetInt("border", 0);
}
}
public void StartGame()
{
UnityEngine.SceneManagement.SceneManager.LoadScene(1);
}
}
MainUIController腳本:用于控制游戲場景中的UI顯示控制
using UnityEngine;
using UnityEngine.UI;
public class MainUIController : MonoBehaviour
{
private static MainUIController _instance;
public static MainUIController Instance
{
get
{
return _instance;
}
}
public bool hasBorder = true;
public bool isPause = false;
public int score = 0;
public int length = 0;
public Text msgText;
public Text scoreText;
public Text lengthText;
public Image pauseImage;
public Sprite[] pauseSprites;
public Image bgImage;
private Color tempColor;
void Awake()
{
_instance = this;
}
void Start()
{
if (PlayerPrefs.GetInt("border", 1) == 0)
{
hasBorder = false;
foreach (Transform t in bgImage.gameObject.transform)
{
t.gameObject.GetComponent<Image>().enabled = false;
}
}
}
void Update()
{
switch (score / 100)
{
case 0:
case 1:
case 2:
break;
case 3:
case 4:
ColorUtility.TryParseHtmlString("#CCEEFFFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 2;
break;
case 5:
case 6:
ColorUtility.TryParseHtmlString("#CCFFDBFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 3;
break;
case 7:
case 8:
ColorUtility.TryParseHtmlString("#EBFFCCFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 4;
break;
case 9:
case 10:
ColorUtility.TryParseHtmlString("#FFF3CCFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "階段" + 5;
break;
default:
ColorUtility.TryParseHtmlString("#FFDACCFF", out tempColor);
bgImage.color = tempColor;
msgText.text = "無盡階段";
break;
}
}
public void UpdateUI(int s = 5, int l = 1)
{
score += s;
length += l;
scoreText.text = "得分:\n" + score;
lengthText.text = "長度:\n" + length;
}
public void Pause()
{
isPause = !isPause;
if (isPause)
{
Time.timeScale = 0;
pauseImage.sprite = pauseSprites[1];
}
else
{
Time.timeScale = 1;
pauseImage.sprite = pauseSprites[0];
}
}
public void Home()
{
UnityEngine.SceneManagement.SceneManager.LoadScene(0);
}
}
FoodMaker腳本:用于控制食物的管理
using UnityEngine;
using UnityEngine.UI;
public class FoodMaker : MonoBehaviour
{
private static FoodMaker _instance;
public static FoodMaker Instance
{
get
{
return _instance;
}
}
public int xlimit = 21;
public int ylimit = 11;
public int xoffset = 7;
public GameObject foodPrefab;
public GameObject rewardPrefab;
public Sprite[] foodSprites;
private Transform foodHolder;
void Awake()
{
_instance = this;
}
void Start()
{
foodHolder = GameObject.Find("FoodHolder").transform;
MakeFood(false);
}
public void MakeFood(bool isReward)
{
int index = Random.Range(0, foodSprites.Length);
GameObject food = Instantiate(foodPrefab);
food.GetComponent<Image>().sprite = foodSprites[index];
food.transform.SetParent(foodHolder, false);
int x = Random.Range(-xlimit + xoffset, xlimit);
int y = Random.Range(-ylimit, ylimit);
food.transform.localPosition = new Vector3(x * 30, y * 30, 0);
if (isReward)
{
GameObject reward = Instantiate(rewardPrefab);
reward.transform.SetParent(foodHolder, false);
x = Random.Range(-xlimit + xoffset, xlimit);
y = Random.Range(-ylimit, ylimit);
reward.transform.localPosition = new Vector3(x * 30, y * 30, 0);
}
}
}

🎁游戲原始碼下載 和 效果展示
這里我把游戲的原始碼工程 、素材和打包好的exe檔案統一放到一個壓縮包中
有需要的小伙伴點擊鏈接下載就好, 如果積分不夠的小伙伴私信我也可以
我看到的時候就會發給你了啦!
貪吃蛇下載鏈接:https://download.csdn.net/download/zhangay1998/22490642
完整效果展示:

👥總結
-
本篇文章對 貪吃蛇小游戲做了一個詳細的說明教程
-
看起來挺多的,實際上只有 四個腳本 就可以完成這個游戲了
-
原始碼也只不過 10M多點大小 ,只是制作程序稍微繁瑣了一些,但是都是基礎內容很適合新手學習!
-
如果在看的程序中有哪一步沒看懂或者博主沒有說到,那可以結合原始碼工程觀看即可!
-
因為在文中可能有地方語言描述真的很費勁,所以結合原始碼工程觀看,學習體驗效果更佳!
-
博主辛苦寫文不宜,大家可以粉紅色三連一波支持博主呀!
🚀往期優質文章分享
- ??Unity零基礎到入門 | 游戲引擎 Unity 從0到1的 系統學習 路線【全面總結-建議收藏】!
- 🧡花一天時間做一個高質量飛機大戰游戲,過萬字Unity完整教程!漂亮學妹看了直呼666!
- 💛回憶童年和小伙伴一起玩過的經典游戲【炸彈人小游戲】制作程序+決議
- 💚通宵一晚做出來的一款類似CS的第一人稱射擊游戲Demo!原來做游戲也不是很難
- 🤍爆肝整整一個周末寫一款類似 皇室戰爭 的 即時戰斗類 游戲Demo!兩萬多字游戲制作程序+決議!
- 💙一款類似“恐龍快打”的 橫版街機格斗游戲 該如何制作?| 一起來學習 順便送原始碼【碼文不易,建議收藏學習】
- 💜【超實用技巧】| 提高寫文的質量 和 速率必學技能: Typora 圖床配置 詳細說明
| 🚀 優質專欄分享 🚀 |
- 🎄如果感覺文章看完了不過癮,可以來我的其他 專欄 看一下哦~
- 🎄比如以下幾個專欄:Unity基礎知識學習專欄、Unity游戲制作專欄、Unity實戰類專案 和 演算法學習專欄
- 🎄可以學習更多的關于Unity引擎的相關內容哦!直接點擊下面顏色字體就可以跳轉啦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/299991.html
標籤:python
下一篇:2021-09-13 字串逆序
