贪吃蛇(基于unity5.6.6f2)

  • 好久没更新过了,最进事很乱,有出去了一趟还没网,以后会一星期更新一次
  • 先上图片

贪吃蛇(基于unity5.6.6f2)

贪吃蛇(基于unity5.6.6f2)

  • 文档

贪吃蛇(基于unity5.6.6f2)

有些比较细的没有进行标注

  • 下面贴代码
  • 主UI
  • public class MainUI : MonoBehaviour {
        //开始按钮
        private Button go_Button;
        //皮肤组
        private IEnumerable<Toggle> SkinComtorller;
        //模式组
        private IEnumerable<Toggle> ModelContorller;
        //上一次分数
        private Text last_Text;
        //最高分数
        private Text best_Text;
        void Start () {
            
            GetMyComponent();
            //最好一步一步来
            GameManger.Instance.TakeOut("best_Score");
            if (GameManger.Instance.best_Score!= "")
            {
                print(GameManger.Instance.best_Score);
                best_Text.text = "最好: 长度" + GameManger.Instance.SocreData(GameManger.Instance.best_Score)[1] + ", 分数" +
                GameManger.Instance.SocreData(GameManger.Instance.best_Score)[0];
                GameManger.Instance.TakeOut("last_Score");
                last_Text.text = "上次: 长度" + GameManger.Instance.SocreData(GameManger.Instance.last_Score)[1] + ", 分数" +
                    GameManger.Instance.SocreData(GameManger.Instance.last_Score)[0];
            }
        }

        private void GetMyComponent()
        {
            //获取按钮绑定点击事件
            go_Button = transform.Find("BgPanel/HomePage/GoButton").GetComponent<Button>();
            go_Button.onClick.AddListener(() => GoButtonOnClick());
            //获取皮肤组中的所有toggle
            SkinComtorller = transform.Find("BgPanel/InspectorPanel/SkinComtorller").GetComponent<ToggleGroup>().ActiveToggles();
            //获取模式组中的所有toggle
            ModelContorller = transform.Find("BgPanel/InspectorPanel/ModelContorller").GetComponent<ToggleGroup>().ActiveToggles();
            //获取上一次分数文本
            last_Text = transform.Find("BgPanel/InspectorPanel/ScoreContorller/LastText").GetComponent<Text>();
            //获取坐高的分数文本
            best_Text = transform.Find("BgPanel/InspectorPanel/ScoreContorller/BestText ").GetComponent<Text>();
        }
        ///记录选中的皮肤
        private void SeletSkin()
        {
            foreach (Toggle t in SkinComtorller)
            {
                if (t.isOn)
                {
                    switch (t.name)
                    {
                        case "ScienceToggle":
                            GameManger.Instance.skin = Skin.蓝色;
                            break;
                        case "YellowToggle":
                            GameManger.Instance.skin = Skin.黄色;
                            break;
                    }
                }
            }
        }
        ///记录选中的模式
        private void SeletModel()
        {
            foreach (Toggle t in ModelContorller)
            {
                if (t.isOn)
                {
                    switch (t.name)
                    {
                        case "BoundaryToggle":
                            GameManger.Instance.model = Model.边界模式;
                            break;
                        case "FreedomToggle":
                            GameManger.Instance.model = Model.自由模式;
                            break;
                    }
                }
            }
        }
        //点击事件
        private void GoButtonOnClick()
        {
            SceneManager.LoadScene("MainGame");
            //进入时将值记录
            SeletModel();
            SeletSkin();
        }
    }

 

  • 游戏管理
  • ///皮肤
    public enum Skin
    {
        黄色,
        蓝色
    }
    ///模式
    public enum Model
    {
        边界模式,
        自由模式
    }
    public class GameManger : MonoBehaviour {
        //设置为单例
        private static GameManger instance;
        public static GameManger Instance
        {
            get { return instance; }
        }
        private void Awake()
        {
            instance = this;
        }
        //定义皮肤变量
        public Skin skin;
        //定义模式变量
        public Model model;
        //定义上一次的分数变量
        public string last_Score;
        //定义最高分的分数变量
        public string best_Score;

        void Start () {
            //在跳转场景的时候对该物体不进行销毁
            DontDestroyOnLoad(gameObject);
        }

        void Update () {
            
        }
        ///数据存储
        public void Storage(string key,string data)
        {
            PlayerPrefs.SetString(key, data);
        }
        //数据取出
        public void TakeOut(string key)
        {
            string data = PlayerPrefs.GetString(key);
            switch (key)
            {
                case "skin":
                    SkinData(data);
                    break;
                case "model":
                    ModelData(data);
                    break;
                case "last_Score":
                    last_Score = data;
                    break;
                case "best_Score":
                    best_Score = data;
                    break;
            }
        }
        //皮肤数据处理
        private void SkinData(string data)
        {
            switch (data)
            {
                case "黄色":
                    skin = Skin.黄色;
                    break;
                case "蓝色":
                    skin = Skin.黄色;
                    break;
            }
        }
        //模式数据处理
        private void ModelData(string data)
        {
            switch (data)
            {
                case "边界模式":
                    model = Model.边界模式 ;
                    break;
                case "自由模式":
                    model = Model.自由模式; ;
                    break;
            }
        }
        //分数处理
        public string[] SocreData(string data)
        {
            string[] sOl = data.Split(':');
            return sOl;
        }
    }

 

  • 食物管理

public class FoodManger : MonoBehaviour {
    //设置为单例模式
    private static FoodManger instance;
    public static FoodManger Instance
    {
        get { return instance; }
    }
    private void Awake()
    {
        instance = this;
    }
    //食物的预设
    private GameObject food_Prefabs;
    //不同类型的食物
    private Sprite [] food_Sprites;
    void Start () {
        food_Prefabs = Resources.Load<GameObject>("Food");
        food_Sprites = Resources.LoadAll<Sprite>("Foods");

        //初始生成食物
        CreatFood();
    }
    
    
    void Update () {
        
    }
    //生成食物
    public  void CreatFood()
    {
        //2D生成的方法
        GameObject go = Instantiate(food_Prefabs,transform);
        //设置位置
        go.transform.localPosition = new Vector3(280 + (30 * Random.Range(0, 32)), 30 + (30 * Random.Range(0, 22)), 0);
        //设置图片
        go.GetComponent<Image>().sprite = food_Sprites[Random.Range(0, food_Sprites.Length)];  
    }
}

 

 

  • 游戏UI
  • public class InspectorManger : MonoBehaviour {

        public Text mode_Text;
        public Text score_Text;
        public Text length_Text;
        public Button home_Button;
        public Button pase_Button;
        private bool ispase = false;
        private Sprite[] pases;
        void Start () {
            pases = Resources.LoadAll<Sprite>("Pase");
            //获取组件
            GetMyComponent();
            home_Button.onClick.AddListener(() => SceneManager.LoadScene("MainUI")
            );
            pase_Button.onClick.AddListener(GamePase);
        }

        private void GamePase()
        {
            if (!ispase)
            {
                Time.timeScale = 0;
                pase_Button.transform.GetChild(0).GetComponent<Image>().sprite = pases[1];
            }
            else
            {
                Time.timeScale = 1;
                pase_Button.transform.GetChild(0).GetComponent<Image>().sprite = pases[0];
            }
            ispase = !ispase;
        }
        //获取组件
        private void GetMyComponent()
        {
            mode_Text = transform.Find("ModelText").GetComponent<Text>();
            score_Text = transform.Find("ScoreText").GetComponent<Text>();
            length_Text = transform.Find("LengthText").GetComponent<Text>();
            home_Button = transform.Find("ButtonManger/HomeButton").GetComponent<Button>();
            pase_Button = transform.Find("ButtonManger/PaseButton").GetComponent<Button>();
        }
    }

 

 

  • 蛇的移动与一部分管理(这个脚本内容有点杂糅了)
  • public enum Direction
    {
        横向,
        纵向
    }
    public class SnakeMove : MonoBehaviour {
        //延时移动时间间隔
        [Range(0, 1)]
        public float timeInterval;
        //当前移动间隔
        private float nowTime;
        //当前移动方向
        public static Direction direction;
        //方向变量
        private int TurnX = 1;
        private int TurnY = 0;
        //蛇的所有身体
        private List<Vector3> snakPos = new List<Vector3>();
        //蛇身
        private GameObject SnakeBandly;
        //当前长度
        private int score = 0;
        //当前分数
        public int length = 0;
        private InspectorManger inspector;
        //存储蛇身图片
        private Sprite[] bandlySprite;
        void Start () {
            //初始化当前间隔
            nowTime = timeInterval;
            //初始化当前方向
            direction = Direction.横向;
            //延时调用时蛇头进行移动
            InvokeRepeating("SnakeMoveHandel", 1, timeInterval);
            //添加当前位置
            snakPos.Add(transform.position);
            //加载蛇身
            SnakeBandly = Resources.Load<GameObject>("SnakeBandly");
            //加载资源
            SnakBandlySprite();
            //获取分数与长度的管理
            inspector = transform.parent.parent.GetChild(0).GetComponent<InspectorManger>();
        }
        
        
        void Update () {
            //变速
            ChangeSpeed();
            //转向
            SnakeHandTurn();
        }
        ///加载蛇身资源
        void SnakBandlySprite()
        {
            switch (GameManger.Instance.skin)
            {
                case Skin.黄色:
                    bandlySprite = Resources.LoadAll<Sprite>("Yellow");
                    GetComponent<Image>().sprite = Resources.Load<Sprite>("sh02");
                    break;
                case Skin.蓝色:
                    bandlySprite = Resources.LoadAll<Sprite>("blue");
                    GetComponent<Image>().sprite = Resources.Load<Sprite>("sh01");
                    break;
            }
        }
        ///改变蛇的速度
        void ChangeSpeed()
        {
            if (timeInterval != nowTime)
            {
                CancelInvoke("SnakeMoveHandel");
                nowTime = timeInterval;
                InvokeRepeating("SnakeMoveHandel", 0, timeInterval);
            }
        }
        ///控制蛇进行转向
        void SnakeHandTurn()
        {
            if (Input.GetMouseButtonDown(0))
            {
                //为了在点击按钮不触发转向
                if (Input.mousePosition.x > 280 && Input.mousePosition.y > 30)
                {
                    switch (direction)
                    {
                        case Direction.横向:
                            if (Input.mousePosition.y > transform.localPosition.y)
                            {
                                //将蛇头方向与移动方向改为向上移动
                                transform.localRotation = Quaternion.Euler(Vector3.zero);
                                TurnX = 0;
                                TurnY = 1;
                            }
                            else
                            {
                                //将蛇头方向与移动方向改为向下移动
                                transform.localRotation = Quaternion.Euler(new Vector3(0, 0, -180));
                                TurnX = 0;
                                TurnY = -1;
                            }
                            direction = Direction.纵向;
                            break;
                        case Direction.纵向:
                            if (Input.mousePosition.x > transform.localPosition.x)
                            {
                                //将蛇头方向与移动方向改为向右移动
                                transform.localRotation = Quaternion.Euler(new Vector3(0, 0, -90));
                                TurnX = 1;
                                TurnY = 0;
                            }
                            else
                            {
                                //将蛇头方向与移动方向改为向左  移动
                                transform.localRotation = Quaternion.Euler(new Vector3(0, 0, 90));
                                TurnX = -1;
                                TurnY = 0;
                            }
                            direction = Direction.横向;
                            break;
                    }
                }
                
            }
        }
        ///是蛇进行移动
        void SnakeMoveHandel()
        {
            transform.localPosition += new Vector3(30*TurnX, 30*TurnY, 0);
            ModelSelet();
            UpdateSnakeBandly();
            

        }
        ///加长身体
        public void AddSnakeBandly()
        {
            GameObject go = Instantiate(SnakeBandly, transform.parent);
            go.transform.position = snakPos[snakPos.Count - 1];
            print(length % 2);
            go.GetComponent<Image>().sprite = bandlySprite[length%2];
            if (transform.parent.childCount > 2)
            {
                //将自身添加进去
                snakPos.Add(go.transform.position);
            }
        }
        ///模式选择
        private void ModelSelet()
        {
            if (GameManger.Instance.model == Model.自由模式)
            {
                transform.parent.parent.Find("BroundManger").gameObject.SetActive(false);
                if (transform.localPosition.x <= 250)
                {
                    transform.localPosition = new Vector3(1250, transform.localPosition.y);
                }
                else if (transform.localPosition.x >= 1280)
                {
                    transform.localPosition = new Vector3(280, transform.localPosition.y);
                }
                else if (transform.localPosition.y >= 720)
                {
                    transform.localPosition = new Vector3(transform.localPosition.x, 30);
                }
                else if (transform.localPosition.y <= 0)
                {
                    transform.localPosition = new Vector3(transform.localPosition.x, 690);
                }
            }
        }
        ///更新蛇身的位置
        void UpdateSnakeBandly()
        {
            if (snakPos.Count >=1&&transform.parent.childCount>1)
            {
                for (int i = 0; i < snakPos.Count; i++)
                {
                    transform.parent.GetChild(i + 1).position = snakPos[i];
                }
                snakPos.Insert(0, transform.position);
                snakPos.RemoveAt(snakPos.Count - 1);
            }
            else
            {
                snakPos[0] = transform.position;
            }
            
        }
        ///增加分数与长度
        public void AddScoreAddLength(int min,int max)
        {
            int num = Random.Range(min, max);
            length++;
            score += num*10;
            //同步UI
            inspector.length_Text.text = "长度:\n" + length;
            inspector.score_Text.text = "分数:\n" + score;
        }
        ///原始增加
        public void AddScoreAddLength()
        {
            length++;
            score+= 10;
            inspector.length_Text.text = "长度:\n" + length;
            inspector.score_Text.text = "分数:\n" + score;
        }
        ///判断分数或者长度将数据存储
        public void ScoreOrLength()
        {
            //取出最高分
            GameManger.Instance.TakeOut("best_Score");
            if (GameManger.Instance.best_Score != "")
            {
                string best = GameManger.Instance.best_Score;
                //将分数与长度切割开
                string[] sOl = GameManger.Instance.SocreData(best);
                //如果比最高分高
                if (int.Parse(sOl[0]) < score)
                {
                    //覆盖最高分
                    GameManger.Instance.Storage("best_Score", score + ":" + length);
                }
            }
            else
            {
                //当最开始时直接将当前分数置为最高分
                GameManger.Instance.Storage("best_Score", score + ":" + length);
            }
            //存储本次的分数
            GameManger.Instance.Storage("last_Score", score + ":" + length);

        }          
    }

  • 蛇的碰撞的管理
  • public class SnakeManger : MonoBehaviour {
        private SnakeMove snake;
        private GameObject Fxp;
        private void Start()
        {
            snake = GetComponent<SnakeMove>();
            Fxp = Resources.Load<GameObject>("ExpFbx");
        }
        private void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.CompareTag("Food"))
            {
                //生成新的食物
                FoodManger.Instance.CreatFood();
                //蛇身加长
                snake.AddSnakeBandly();
                snake.AddScoreAddLength();
                //销毁现在的食物
                Destroy(collision.gameObject);
            }
            else if (collision.CompareTag("Wall"))
            {
                snake.ScoreOrLength();
                //重新开始
                StartCoroutine("SnakeDie");
            }
            else if (collision.CompareTag("Bandly") && snake.length > 2)
            {
                snake.ScoreOrLength();
                StartCoroutine("SnakeDie");
            }
        }
        IEnumerator SnakeDie()
        {
            Instantiate(Fxp);
            yield return new WaitForSeconds(1);
            SceneManager.LoadScene("MainGame");
        }
        //
    }
  • 最后来贴一下工程、安装包X-mind
  • X-mind链接:https://pan.baidu.com/s/1Qvl6r-AJ1gjDSHYEiTNWGQ 
    提取码:pjev 
  • 安装包链接:https://pan.baidu.com/s/1hH6ZA5X-j9Wtl0JGsn_ooA 
    提取码:bbhe 
  • 工程链接:https://pan.baidu.com/s/1KQPuI654_6iBBvtoeWOXug 
    提取码:an8e