文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用unity怎么实现一个贪吃蛇游戏

2023-06-14 09:49

关注

使用unity怎么实现一个贪吃蛇游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

具体内容如下

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怎么实现一个贪吃蛇游戏的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯