2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > unity贪吃蛇c 语言代码 unity实现简单贪吃蛇游戏

unity贪吃蛇c 语言代码 unity实现简单贪吃蛇游戏

时间:2021-01-10 06:16:43

相关推荐

unity贪吃蛇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);

}

}

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。