C#小游戏之贪吃蛇

  贪吃蛇

注意步骤如下
     * 1.确定蛇方向 ,wsad键控制
     * 2.蛇头/蛇身预设物
     * 3.碰撞食物,生成随机食物

     

设计较为简单,源码如下:

 

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.SceneManagement;

//贪吃蛇
public class SnakeMove : MonoBehaviour {
 
    //控制蛇头移动函数二维
    Vector3 SnakeVec = Vector3.up;
    //蛇头
    public GameObject SnakeHead;
    //食物,多种
    public GameObject[] SnakeFood;

    //是否要创建身体
    public bool IsGreat = false;

    //存储身体位置信息
    List<Transform> SnakeList = new List<Transform>();
    public float Speed = 1f;
    // Use this for initialization
    void Start () {
        for (int i = 0; i < 4; i++)
        {
            Invoke("OnGreatFood",0.3f);  //初始值生成4个
        }
        InvokeRepeating("OnGreatMoveHead", 0, Speed);
    }
    
    // Update is called once per frame
    void Update () {
        SnakeVec = SnakeHeadVec();


        if (Input.GetKeyDown(KeyCode.K))
        {
            for (int i = 0; i < SnakeList.Count; i++)
            {
                SnakeList.RemoveAt(i);
                Destroy(SnakeList[i].gameObject,2);
            }
        }
    }

    //定义随机生成食物  Quaternion.identity每旋转前的初始角度   指Quaternion(0,0,0,0)
    public void OnGreatFood()  
    {
        int i = Random.Range(0,SnakeFood.Length);
        Vector3 FoodVec = new Vector3(Random.Range(-10,10),Random.Range(-10,10),-0.5f);
        GameObject clone =    Instantiate(SnakeFood[i] ,FoodVec ,Quaternion.identity);
        clone.GetComponent<Renderer>().material.color = new Color(Random.value ,Random.value ,Random.value ,Random.Range(0.5f,0.8f));
    }
    //移动函数
    private Vector2 SnakeHeadVec()
    {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            CancelInvoke("OnGreatMoveHead");
            InvokeRepeating("OnGreatMoveHead",0,Speed * 0.1f);
        }
        if (Input.GetKeyUp(KeyCode.Q))
        {
            CancelInvoke("OnGreatMoveHead");
            InvokeRepeating("OnGreatMoveHead", 0, Speed );
        }
        if (Input.GetKeyDown(KeyCode.W) && SnakeVec != Vector3.down)
        {
            SnakeVec = Vector3.up;
            transform.localRotation = Quaternion.Euler(0,0,0);
        }
        else if (Input.GetKeyDown(KeyCode.S) &&  SnakeVec != Vector3.up)
        {
            SnakeVec = Vector3.down;
            transform.localRotation = Quaternion.Euler(0, 0, -180);
        }
        else if (Input.GetKeyDown(KeyCode.A) && SnakeVec != Vector3.right)
        {
            SnakeVec = Vector3.left;
            transform.localRotation = Quaternion.Euler(0, 0, 90);
        }
        else if (Input.GetKeyDown(KeyCode.D) && SnakeVec != Vector3.left)
        {
            SnakeVec = Vector3.right;
            transform.localRotation = Quaternion.Euler(0, 0, -90);
        }
        return SnakeVec;
    }
    //产生碰撞,检测碰撞是谁?
    private void OnTriggerEnter(Collider other)
    {
        if (other.tag == "SnakeFood")
        {
            Destroy(other.gameObject); //删除碰到的物
            IsGreat = true;  //创建身体
            Invoke("OnGreatFood", 0.3f);   //延迟0.3f生成

        }
        else if (other.tag == "SnakeBody")
        {
            Debug.Log("我是身体,我输出了");
        }
        else
        {
            SceneManager.LoadScene("Snake");
        }
    }

    //定义移动/生成身体/存入数组
    public void OnGreatMoveHead()
    {
        //获取初始头的位置
        Vector3 HeadVec = transform.position;
        if (IsGreat == true)  //如果产生碰撞,就开始生成身体
        {
            Vector3 HeadVector = HeadVec;
            GameObject HandClone;
            HandClone = Instantiate(SnakeHead ,HeadVector ,Quaternion .identity);  //生成身体,赋值

            Color HandColor = new Color(Random.value ,Random.value ,Random.value);
            HandClone.GetComponent<Renderer>().material.color = HandColor;

            //存入数组
            SnakeList.Insert(0,HandClone.transform);
            IsGreat = false;//这里记得关,否则会一直生成身体
        }
        else if (SnakeList.Count > 0)
        {

            SnakeList.Last().position  = HeadVec;
            SnakeList.Insert(0,SnakeList.Last());
            SnakeList.RemoveAt(SnakeList.Count - 1);
        }
        //transform.Translate(SnakeVec );
        transform.position =transform.position + SnakeVec;
    }

}
 

上边代码可以直接套用,基本功能实现;

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值