利用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);    }}

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