c#语言做贪吃蛇,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 snakeBody = new List();

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 tmpList = new List ();//记录身体变化前的位置

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 snakeBody = new List();

// 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 tmpList = new List ();

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

}

}

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

106d6c9061ea43c5f71b0ba501977e4e.png

8f71cb6d61a6c0cf270f5e2d0de4d57b.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值