unity:贪吃蛇
Posted 肖尘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity:贪吃蛇相关的知识,希望对你有一定的参考价值。
SatUIController代码
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);
SnakeHead代码
using System.Collections;
using System.Collections.Generic;
//using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class SnakeHead : MonoBehaviour
public List<Transform> bodyList = new List<Transform>();
public float velocity = 0.35f;
public int step;
private int x;
private int y;
private Vector3 headPos;
private Transform canvas;
private bool isDie = false;
public AudioClip eatClip;
public AudioClip dieClip;
public GameObject dieEffect;
public GameObject bodyPrefab;
public Sprite[] bodySprites = new Sprite[2];
void Awake()
canvas = GameObject.Find("Canvas").transform;
//通过Resources.Load(string path)方法加载资源,path的书写不需要加Resources/以及文件扩展名
gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>(PlayerPrefs.GetString("sh", "sh02"));
bodySprites[0] = Resources.Load<Sprite>(PlayerPrefs.GetString("sb01", "sb0201"));
bodySprites[1] = Resources.Load<Sprite>(PlayerPrefs.GetString("sb02", "sb0202"));
void Start()
InvokeRepeating("Move", 0, velocity);
x = 0;y = step;
void Update()
if (Input.GetKeyDown(KeyCode.Space) && MainUIController.Instance.isPause == false && isDie == false)
CancelInvoke();
InvokeRepeating("Move", 0, velocity - 0.2f);
if (Input.GetKeyUp(KeyCode.Space) && MainUIController.Instance.isPause == false && isDie == false)
CancelInvoke();
InvokeRepeating("Move", 0, velocity);
if (Input.GetKey(KeyCode.W) && y != -step && MainUIController.Instance.isPause == false && isDie == false)
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);
x = 0;y = step;
if (Input.GetKey(KeyCode.S) && y != step && MainUIController.Instance.isPause == false && isDie == false)
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 180);
x = 0; y = -step;
if (Input.GetKey(KeyCode.A) && x != step && MainUIController.Instance.isPause == false && isDie == false)
gameObject.transform.localRotation = Quaternion.Euler(0, 0, 90);
x = -step; y = 0;
if (Input.GetKey(KeyCode.D) && x != -step && MainUIController.Instance.isPause == false && isDie == false)
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); //蛇头向期望位置移动
if (bodyList.Count > 0)
//由于我们是双色蛇身,此方法弃用
//bodyList.Last().localPosition = headPos; //将蛇尾移动到蛇头移动前的位置
//bodyList.Insert(0, bodyList.Last()); //将蛇尾在List中的位置更新到最前
//bodyList.RemoveAt(bodyList.Count - 1); //移除List最末尾的蛇尾引用
//由于我们是双色蛇身,使用此方法达到显示目的
for (int i = bodyList.Count - 2; i >= 0; i--) //从后往前开始移动蛇身
bodyList[i + 1].localPosition = bodyList[i].localPosition; //每一个蛇身都移动到它前面一个节点的位置
bodyList[0].localPosition = headPos; //第一个蛇身移动到蛇头移动前的位置
void Grow()
Audiosource.PlayClipAtPoint(eatClip, Vector3.zero);
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);
void Die()
AudioSource.PlayClipAtPoint(dieClip, Vector3.zero);
CancelInvoke();
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));
IEnumerator GameOver(float t)
yield return new WaitForSeconds(t);
UnityEngine.SceneManagement.SceneManager.LoadScene(1);
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 if (collision.gameObject.CompareTag("Reward"))
Destroy(collision.gameObject);
MainUIController.Instance.UpdateUI(Random.Range(5, 15) * 10);
Grow();
else if (collision.gameObject.CompareTag("Body"))
Die();
else
if (MainUIController.Instance.hasBorder)
Die();
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
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以上是关于unity:贪吃蛇的主要内容,如果未能解决你的问题,请参考以下文章