成果展示
操作步骤
- 新建一个2D工程项目,导入资源包。新建三个文件夹,分别命名为“Scene”,“Prefebs”和“Scripts”,用于存放游戏场景,制作的预制件和脚本。
- 新建一个plane,命名为BackGround,附上资源包中的Ground材质。添加一个灯光,给游戏场景打光。新建一个Cube,命名为SnakeHead,附上SnakeHead材质。新建一个Cube,命名为SnakeBody,附上SnakeBody材质,并拖入Prefebs文件夹。再新建一个Cube,命名为Food,附上Food材质,拖入Prefebs文件夹,由于后期食物随机产生。在BackGround中新建四个空项目,当作游戏场景的边界,当蛇碰到边界或者自己的身体的时候,游戏结束。注意:要删去背景的Box Collider组件,否则蛇身会一直碰到背景,导致游戏无法运行。
- 新建一个脚本,命名为MoveSnake,通过这个脚本让贪吃蛇动起来。脚本内容如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using UnityEngine.SceneManagement; public class MoveSnake : MonoBehaviour { List<Transform> body = new List<Transform>(); Vector2 direction = Vector2.up; public GameObject snakeBody; private bool flag; float speed = 0.3f; // Start is called before the first frame update void Start() { InvokeRepeating("move", speed, speed); } void move() { Vector2 position = transform.position; if (flag) { GameObject newBody = (GameObject)Instantiate(snakeBody, position, Quaternion.identity); body.Insert(0, newBody.transform); flag = false; } else if (body.Count>0) { body.Last().position = position; body.Insert(0, body.Last().transform); body.RemoveAt(body.Count - 1); } this.transform.Translate(direction); } // Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.W)) { direction = Vector2.up; } else if (Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown(KeyCode.S)) { direction = Vector2.down; } else if (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A)) { direction = Vector2.left; } else if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) { direction = Vector2.right; } } void OnTriggerEnter(Collider coll) { if (coll.transform.CompareTag("Food")) { Destroy(coll.gameObject); flag = true; } else { SceneManager.LoadScene(0); } } }
通过这个脚本可以让贪吃蛇根据按键向不同方向运动,吃掉食物并产生新的SnakeBody。将这个脚本附给SnakeBody,这个地方选择预制件文件夹中的SnakeBody,从而产生新的身体。
- 新建一个脚本,命名为FoodCreate,用于随机生成食物。脚本内容如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FoodCreate : MonoBehaviour { public GameObject snakeFood; public int x_limit = 30; public int y_limit = 20; void Food() { int x = Random.Range(-x_limit, x_limit); int y = Random.Range(-y_limit, y_limit); Instantiate(snakeFood, new Vector2(x, y), Quaternion.identity); } // Start is called before the first frame update void Start() { InvokeRepeating("Food", 2, 3); } // Update is called once per frame void Update() { } }
将这个脚本附给摄像机,并设置摄像机视图的长度和宽度,SnakeFood选择预制件文件夹中的Food,从而在场景中随机产生食物。
- 新建一个场景,命名为LoadGame,用于游戏结束后重新开始游戏。场景内新建一个Text,适当修改大小和位置。在文本框输入,修改字体大小和颜色。
- 新建一个脚本,命名为SnakeUi,用于对场景的控制。脚本内容如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class SnakeUi : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0)) { SceneManager.LoadScene(1); } } }
该脚本用于游戏结束时弹出另一个界面,并通过单击鼠标再次进行游戏。
- 打开游戏场景,点击,将游戏场景设置为第一个场景。再点击游戏结束场景,设置为第二个场景。如图
- 调试运行。
来源:oschina
链接:https://my.oschina.net/u/4462201/blog/3213180