利用unity实现简单的贪吃蛇游戏
来源:互联网 发布:天龙八部天空视角数据 编辑:程序博客网 时间:2024/05/13 05:25
首先创建一个头部,编写脚本利用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 0
- 利用unity实现简单的贪吃蛇游戏
- 简单贪吃蛇游戏的C++实现
- 简单的贪吃蛇游戏实现
- 简单的贪吃蛇游戏实现
- Unity实现简单贪吃蛇
- 简单的贪吃蛇游戏
- JavaScript实现一个简单的贪吃蛇游戏
- 简单贪吃蛇游戏的c语言实现
- C++类方法实现简单的贪吃蛇游戏
- Unity贪吃蛇类游戏重要方法和功能的实现
- 贪吃蛇的简单实现
- 一个简单的游戏--贪吃蛇
- 贪吃蛇游戏的简单设计
- c#简单贪吃蛇游戏的思想
- 简单的贪吃蛇游戏 代码
- qtday03 简单版的贪吃蛇游戏
- 贪吃蛇游戏实现
- C++实现的贪吃蛇游戏
- 跨域ajax请求如何携带cookie
- LeetCode 141 Linked List Cycle
- ioni3 http请求数据绑定时数组嵌套的显示问题
- Linux 命令自动补齐快捷键
- Windows下制作Linux系统启动盘进行Linux安装
- 利用unity实现简单的贪吃蛇游戏
- 牛客网-剑指offer-04-重建二叉树
- 文章标题
- 网页布局之div与table的比较
- java.lang.IllegalArgumentException: pointerIndex out of range
- 十六 iOS之 酷炫弹幕(二)
- php缓存技术详细介绍及php缓存的实现代码
- spacetree组织架构图 实现异步加载子节点,和定制化内容展示
- ucos-iii学习之任务优先级