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);
  }
}

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

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

(0)

相关推荐

  • unity实现贪吃蛇游戏

    unity贪吃蛇基本原理实现,供大家参考,具体内容如下 原理: 1.每个身体跟着前面的身体移动: 2.蛇头自动一直向前走,可以向左或者向右转弯. 思想: 贪吃蛇的身体有若干个,每个身体有共同的特性,就是跟着前面的身体移动,这里把蛇的身体抽象出出来,用一个SnackBody类来表达,每一节身体都new出一个SnackBody对象,然后操作这个对象实现功能:蛇头可以看做特殊的蛇身体.应该有一个管理器来管理所有的蛇身体,所以有个SnackController类来管理.每段蛇身都有Front,self,

  • Unity实现3D贪吃蛇的移动代码

    本文实例为大家分享了Unity实现3D贪吃蛇移动的具体代码,供大家参考,具体内容如下 记录一下前段时间写到的一个3D贪吃蛇的移动代码. 链接:Unity实现3D贪吃蛇 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GameManager : MonoBehaviour { List<Transform> bodyL

  • unity使用链表实现贪吃蛇游戏

    今天介绍一下如何利用链表结构来创建一条贪吃蛇. 要实现的功能很简单,按下空格键使蛇加长一节,每次按下空格就在蛇尾加一个cube.按下左方向键,控制蛇的移动.如图所示: //贪吃蛇的中心是:定义蛇身第一节,即链表头为temp.链表的子节点为next.蛇头带着temp(链表头)走,temp带着next(链表子节点)走. 1. 创建一个cube设为预设体,作为蛇身的节点.在预设体上面添加BodyScript脚本. using UnityEngine; using System.Collections;

  • 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 tim

  • js实现简单贪吃蛇游戏

    本文实例为大家分享了js实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 上下左右键控制方向使贪吃蛇吃葡萄 吃5个葡萄,游戏结束时左上角为总得分. 运行结果: 界面和css代码这里就不加赘述了,主要贴js代码(加了注释): var config = { width: 20, //一个格子的宽度 height: 20, //一个格子的高度 tr: 30, //行数 td: 30 //列数 } var snake = null, //Snake的实例 food = null, //Food的实

  • 基于Java实现简单贪吃蛇游戏

    本文实例为大家分享了Java实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 贪吃蛇小游戏制作方法 首先需要的准备有: 1.掌握Java基础知识,即Java SE 2.了解一定的GUI知识 3.自定义的贪吃蛇图片(可以在网上找到) 如果以上三点都没有,也不要紧,完全可以看我之前的博文来进行学习!!!! 学习贪吃蛇的目的 一:了解GUI 对前端的知识进行了解 二:了解监听器的作用 熟练掌握监听器(重点) 三:为枯燥乏味的学习提高兴趣(大重点!!) 贪吃蛇小游戏运行效果 设计思路: 由Game

  • C++实现简单贪吃蛇游戏

    我大概在一个多月前把自己上学期写的c代码的贪吃蛇游戏push到csdn上,并且说c风格的贪吃蛇写起来有些麻烦(贪吃蛇游戏的c语言实现),准备用面向对象的c++再写一遍.现在我们专业恰好刚教完了c++,学校也布置了一道简单的贪吃蛇的编程题目,实现下来,的确觉得c++的思路清晰很多,所以再次把c++的代码push上来,供大家对比参考:) 直接上代码,c++把整个游戏拆分成几个文件,分开上,有一定的c++基础的同学应该可以很容易看懂. 1.全局头文件(global.hpp) #ifndef _GLOB

  • python实现简单贪吃蛇游戏

    本文实例为大家分享了python实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 代码: from turtle import * from random import randrange from time import sleep ### 定义变量 snake = [[0,0],[10,0],[20,0],[30,0],[40,0],[50,0]] apple_x = randrange(-20,20)*10 apple_y = randrange(-20,20)*10 aim_x = 1

  • unity实现简单的贪吃蛇游戏

    本文实例为大家分享了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

  • JS实现简单贪吃蛇小游戏

    本文实例为大家分享了JS实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 1.使用语言 HTML+CSS+JavaScript 2.使用工具 visual studio code 3.GitHub项目地址:贪吃蛇 4.项目运行截图: 5.项目功能分析:主要使用数组来存储蛇的位置,地图和蛇都是一个二维数组,对于有蛇的地方,地图的CSS就会发生改变,同时添加了添加了一个音乐播放按钮,通过CSS动画实现旋转. 6.项目代码:(项目代码有详细的注释) snake.html <!-- * @Auth

  • Java实现简单的贪吃蛇游戏

    本文实例为大家分享了Java实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 代码 启动类 package snake; import javax.swing.*; //游戏的主启动类 public class StartGame { public static void main(String[] args) { JFrame frame = new JFrame("贪吃蛇"); frame.setBounds(10,10,900,720); frame.setResizabl

  • C语言实现简单的贪吃蛇游戏

    本文实例为大家分享了C语言实现简单贪吃蛇游戏的具体代码,供大家参考,具体内容如下 用指针数组来表示蛇,p[0]表示蛇头 控制方向:w,s,a,d-->上下左右 j,k-->加速.减速 键盘控制需要用到线程 编译时需要在后面加     -lpthread 代码: #include <stdio.h> #include <pthread.h> #include <stdlib.h> #include <time.h> #include <uni

  • 利用C/C++实现较完整贪吃蛇游戏

    记得在大一时刚学习c/c++语言,学到一半突然想用这门语言做一些小游戏出来,首先想到的便是贪吃蛇.于是本人利用空余时间写出了这么一个简单的小游戏. 由于当时的我还没有能力构造出用户界面,故直接使用dos界面运行.那么问题来了,如何让一个字符在dos界面上自由移动???对于这个问题我采用的解决方案是实现gotoxy函数来控制指针位置从而实现字符的移动.那么我们就先来实现这个函数. gotoxy 函数并非系统函数,我将其储存于 gotoxy.h 的头文件中方便调用. gotoxy.h #includ

随机推荐