unity实现简单的贪吃蛇游戏
更新时间:2021年3月31日 20:00 点击:1981
本文实例为大家分享了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.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); } } }
代码放置如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
相关文章
- 这篇文章主要为大家详细介绍了Unity时间戳的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
Unity中 ShaderGraph 实现旋涡传送门效果入门级教程(推荐)
通过Twirl 旋转节点对Gradient Noise 梯度噪声节点进行操作,就可得到一个旋转的旋涡效果。具体实现代码跟随小编一起通过本文学习下吧...2021-07-11- 本文主要介绍了4种延时执行的方法,主要包括Update计时器,Invoke,协程,DoTween,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-07
- 这篇文章主要为大家详细介绍了Unity shader实现遮罩效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了unity 判断鼠标是否在哪个UI上的两种实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
- 这篇文章主要为大家详细介绍了Unity实现换装系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-11
- 这篇文章主要给大家介绍了关于利用unity代码C#封装为dll的相关资料,文中通过图文将实现的方法介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要为大家详细介绍了Unity Shader实现径向模糊效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-09
- 这篇文章主要为大家详细介绍了JavaScript实现网页贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-07-28
- 这篇文章主要介绍了unity 实现摄像机绕某点旋转一周,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要为大家详细介绍了Unity实现截图功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了Unity中EventTrigger的几种使用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
- 这篇文章主要为大家详细介绍了Unity Shader实现2D水流效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了Unity 按钮添加OnClick事件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
- 这篇文章主要为大家详细介绍了Unity使用EzySlice实现模型多边形顺序切割,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
- 这篇文章主要为大家详细介绍了Unity Shader实现描边OutLine效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家详细介绍了Unity Shader实现裁切效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要为大家分析了C#贪吃蛇游戏的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 这篇文章主要介绍了javascript实现贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-28
- 这篇文章主要为大家详细介绍了unity实现车方向盘转动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25