软件编程
位置:首页>> 软件编程>> C#编程>> unity实现简单贪吃蛇游戏

unity实现简单贪吃蛇游戏

作者:EmberWn  发布时间:2023-05-25 23:59:53 

标签: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);
 }
}

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

unity实现简单贪吃蛇游戏

unity实现简单贪吃蛇游戏

来源:https://blog.csdn.net/blubluhao/article/details/77946116

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com