unity实现简单贪吃蛇游戏

 更新时间:2020年04月17日 08:30:45   作者:EmberWn  
这篇文章主要为大家详细介绍了unity实现简单贪吃蛇游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了unity实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

首先创建一个头部,编写脚本利用WASD控制头部的移动。

Vector3 up=new Vector3(0,1,0);
Vector3 down=new Vector3(0,-1,0);
Vector3 left=new Vector3(-1,0,0);
Vector3 right=new Vector3(1,0,0);
Vector3 now;//头部实际前进方向

  float timer=0f;
  float timerGap=0.1f;
  void Start () 
  {
    now = up;
  }
  void Update () 
  {
    if (now!=up&&now!=down&&Input.GetKey (KeyCode.W))
    {
      now = up;
    }
    if (now!=up&&now!=down&&Input.GetKey (KeyCode.S))
    {
      now = down;
    }
    if (now!=left&&now!=right&&Input.GetKey (KeyCode.A))
    {
      now=left;
    }
    if (now!=left&&now!=right&&Input.GetKey (KeyCode.D))
    {
      now = right;
    }

    timer += Time.deltaTime;

    if (timer > timerGap) 
    {
      //每隔0.1s向当前方向移动一个单位(0.5为头部大小)。
      timer = 0;
      transform.position = 0.5f * now + transform.position;

    }

  }

然后就是创建初始身体,实现身体跟随头部。采用的方法是将身体放进一个数组,然后下标0的身体移动到头部之前的位置,然后下标 i 的身体移动到 i-1 的position。

创建初始身体,并放入数组。

public GameObject body;//身体预设体
List<GameObject> snakeBody = new List<GameObject>(); 

  void Awake()
  {
    for (int i = 0; i < 3; ++i) 
    {
      GameObject newbodynext=Instantiate (body, 
      transform.position-(i+1)*new Vector3(0,0.5f,0),
      Quaternion.identity)as GameObject;
      snakeBody.Add (newbodynext);
    }
  }

实现跟随

void Update () 
  {
    if (now!=up&&now!=down&&Input.GetKey (KeyCode.W))
    {
      now = up;
    }
    if (now!=up&&now!=down&&Input.GetKey (KeyCode.S))
    {
      now = down;
    }
    if (now!=left&&now!=right&&Input.GetKey (KeyCode.A))
    {
      now=left;
    }
    if (now!=left&&now!=right&&Input.GetKey (KeyCode.D))
    {
      now = right;
    }

    timer += Time.deltaTime;

    if (timer > timerGap) 
    {
      Vector3 tmpPosition = transform.position;//记录头部变化前的位置
      List<Vector3> tmpList = new List<Vector3> ();//记录身体变化前的位置 

      for (int i = 0; i < snakeBody.Count; ++i) 
      {
        tmpList.Add (snakeBody [i].transform.position);
      }

      timer = 0;


      transform.position = 0.5f * now + transform.position;

      snakeBody [0].transform.position = tmpPosition;//将0移到头部之前的位置


      //依次前移身体的位置
      for (int i = 1; i < snakeBody.Count; ++i) 
      {
        snakeBody [i].transform.position = tmpList [i - 1];
      }

    }

}

初始蛇创建好后,就开始添加食物,和增长蛇的身体。还有检测游戏失败,即撞到身体或者边界,采用事件触发检测完成。

创建食物

public GameObject foodPrefab;//食物预设体
void Start () {
    now = up;

    createFood ();


  }

  void createFood()
  {

    float x = Random.Range(-6.5f, 6.5f);
    float y = Random.Range(-4.5f, 4.5f);          
    Instantiate(foodPrefab,new Vector3(x,y,0f),Quaternion.identity);
  }

触发检测

void OnTriggerEnter(Collider other) 
  {  //这个other就是被碰撞体

    if (other.gameObject.tag.Equals("Food")) 
    {

      Destroy(other.gameObject);

      GameObject newbodynext = Instantiate (body,
      snakeBody[snakeBody.Count-1].transform.position,
      Quaternion.identity)as GameObject;

      snakeBody.Add (newbodynext);//增加蛇的身体
      createFood();
    }
    else if(other.gameObject.tag.Equals("Body"))
    {
      SceneManager.LoadScene("Snake", LoadSceneMode.Single);//重新开始
    }
  }


  void OnTriggerExit(Collider other)
  {
    if (other.gameObject.tag.Equals("Boundary")) 
      SceneManager.LoadScene("Snake", LoadSceneMode.Single);
  }

完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class HeadMove : MonoBehaviour {



  public GameObject body;
  public GameObject foodPrefab;


  Vector3 up=new Vector3(0,1,0);
  Vector3 down=new Vector3(0,-1,0);
  Vector3 left=new Vector3(-1,0,0);
  Vector3 right=new Vector3(1,0,0);
  Vector3 now;


  float timer=0f;
  float timerGap=0.1f;

  List<GameObject> snakeBody = new List<GameObject>();  
  // Use this for initialization

  void Awake()
  {
    for (int i = 0; i < 3; ++i) 
    {
      GameObject newbodynext=Instantiate (body, transform.position-(i+1)*new Vector3(0,0.5f,0),Quaternion.identity)as GameObject;
      snakeBody.Add (newbodynext);
    }
  }
  void Start () {
    now = up;

    createFood ();


  }

  void createFood()
  {

    float x = Random.Range(-6.5f, 6.5f);
    float y = Random.Range(-4.5f, 4.5f);          
    Instantiate(foodPrefab,new Vector3(x,y,0f),Quaternion.identity);
  }

  // Update is called once per frame
  void Update () 
  {
    if (now!=up&&now!=down&&Input.GetKey (KeyCode.W))
    {
      now = up;
    }
    if (now!=up&&now!=down&&Input.GetKey (KeyCode.S))
    {
      now = down;
    }
    if (now!=left&&now!=right&&Input.GetKey (KeyCode.A))
    {
      now=left;
    }
    if (now!=left&&now!=right&&Input.GetKey (KeyCode.D))
    {
      now = right;
    }

    timer += Time.deltaTime;

    if (timer > timerGap) 
    {
      Vector3 tmpPosition = transform.position;
      List<Vector3> tmpList = new List<Vector3> (); 

      for (int i = 0; i < snakeBody.Count; ++i) 
      {
        tmpList.Add (snakeBody [i].transform.position);
      }

      timer = 0;


      transform.position = 0.5f * now + transform.position;

      snakeBody [0].transform.position = tmpPosition;


      for (int i = 1; i < snakeBody.Count; ++i) 
      {
        snakeBody [i].transform.position = tmpList [i - 1];
      }

    }

  }



  void OnTriggerEnter(Collider other) 
  {  //这个other就是被碰撞体

    if (other.gameObject.tag.Equals("Food")) 
    {

      Destroy(other.gameObject);
      GameObject newbodynext = Instantiate (body,snakeBody[snakeBody.Count-1].transform.position,Quaternion.identity)as GameObject;
      snakeBody.Add (newbodynext);
      createFood();
    }
    //由于身体和头部一开始就接触,所以将身体的碰撞半径减小到0.4
    else if(other.gameObject.tag.Equals("Body"))
    {
      SceneManager.LoadScene("Snake", LoadSceneMode.Single);
    }
  }


  void OnTriggerExit(Collider other)
  {
    if (other.gameObject.tag.Equals("Boundary")) 
      SceneManager.LoadScene("Snake", LoadSceneMode.Single);
  }
}

将该脚本挂载在头部对象上然后添加身体和食物预设体,再添加边界即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#调用dos窗口获取相关信息的方法

    C#调用dos窗口获取相关信息的方法

    这篇文章主要介绍了C#调用dos窗口获取相关信息的方法,涉及C#调用dos窗口及进程操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • c# 并行的实现示例

    c# 并行的实现示例

    本文主要介绍了c# 并行的实现示例,我们使用 Parallel.ForEach 方法并结合 File.ReadAllLines 来提高读取速度,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Unity UI实现循环播放序列图

    Unity UI实现循环播放序列图

    这篇文章主要为大家详细介绍了Unity UI实现循环播放序列图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C#使用TcpListener及TcpClient开发一个简单的Chat工具实例

    C#使用TcpListener及TcpClient开发一个简单的Chat工具实例

    下面小编就为大家分享一篇C#使用TcpListener及TcpClient开发一个简单的Chat工具实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 深入理解C#中常见的委托

    深入理解C#中常见的委托

    这篇文章主要介绍了C# 委托(Delegate)的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下,希望能够帮助到你
    2021-07-07
  • 时间戳与时间相互转换(php .net精确到毫秒)

    时间戳与时间相互转换(php .net精确到毫秒)

    本文给大家分享的时间戳与时间相互转换(php .net精确到毫秒) ,感兴趣的朋友一起学习吧
    2015-09-09
  • C#在验证文件共享模式下实现多线程文件写入

    C#在验证文件共享模式下实现多线程文件写入

    这篇文章主要为大家详细介绍了C#在验证文件共享模式下实现多线程文件写入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2024-01-01
  • C#匿名方法与Delegate类型转换错误分析

    C#匿名方法与Delegate类型转换错误分析

    这篇文章主要介绍了C#匿名方法与Delegate类型转换错误,较为详细的分析了C#匿名方法的用法及Delegate类型转换错误问题解决方法,具有一定的实用价值,需要的朋友可以参考下
    2014-11-11
  • C#中的IEnumerable简介及简单实现实例

    C#中的IEnumerable简介及简单实现实例

    这篇文章主要介绍了C#中的IEnumerable简介及简单实现实例,本文讲解了IEnumerable一些知识并给出了一个简单的实现,需要的朋友可以参考下
    2015-03-03
  • C#检查远程或本地磁盘使用率

    C#检查远程或本地磁盘使用率

    要检查磁盘的使用情况确定程序放哪个服务器和清理垃圾,所以写个小程序帮忙检查。本文给大家介绍C#检查远程或本地磁盘使用率的相关知识,感兴趣的朋友一起学习吧
    2016-04-04

最新评论