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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章