赞
踩
按鼠标WASD键来控制蛇的走向。
核心的代码如下:
- using UnityEngine;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine.UI;
-
- /// 《UGUI贪吃蛇》
-
- public class TCS2d : MonoBehaviour
- {
-
- public bool isOver = false;
- public bool isStop = false;//是否停止
-
- [SerializeField]
- private Vector2 v2_MoveValue = new Vector2(0, 32);
- public GameObject sheResGm;
- public RectTransform she_Tou;//蛇身体预制件。当吃掉果实,就实例化,生成一个身体
- public GameObject she_NewRes;//一条小蛇预制体。当开始。 实例化小蛇
- public RectTransform img_GuoZi;//蛇将要吃掉的果子。
- public Transform t_SheParent;
- [SerializeField]
- private List<RectTransform> sheListChild = new List<RectTransform>();//蛇的身体组成,开始拖拽了4个在上面(在Unity面板可以看见)
- private List<Vector2> listStartV2 = new List<Vector2>();//用来记录初始的身体部分 坐标
- private RectTransform[] sheStartRectTAry;//用来记录初始 拖拽好的身体部分
- private const int i_MoveSize = 32;//蛇的移动坐标单位
- [SerializeField]
- private float she_Speed = 0.1f;//(移动间隔时间)蛇的移动速度,。越低越快
- public Text t_DeFen;//用来显示当前得分
- public Text t_Title;//用来显示结果
- public GameObject gmEnd_Panel;//结束界面
- private int i_Nunber;
-
- // Use this for initialization
- void Start()
- {
-
- }
-
- /// <summary>初始化
- /// </summary>
- void Init()
- {
- img_GuoZi.transform.SetParent(t_SheParent);//将果子提取出来避免被销毁
- if (sheListChild.Count!=0)
- {//销毁蛇(可能是结束后重新开始, 所以我们销毁蛇的所有身体)
- Destroy(sheListChild[0].parent.gameObject);
- }
-
- sheListChild.Clear();
- GameObject gmIns = Instantiate(she_NewRes) as GameObject;//生成小蛇
- gmIns.transform.SetParent(t_SheParent);
- gmIns.GetComponent<RectTransform>().localScale = Vector3.one;
- gmIns.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
-
- for (int i = 0; i < gmIns.transform.childCount; i++)
- {//初始化蛇
- sheListChild.Add(gmIns.transform.GetChild(i).GetComponent<RectTransform>());
- }
- she_Tou = sheListChild[0];//设置蛇头
- img_GuoZi.transform.SetParent(she_Tou.parent);
- //Debug.Log("Delete:"+i_DeleteCount);
- GuoZi_RandomPosition();//随机果子位置
- v2_MoveValue = new Vector2(-32,0);//设置方向
- isStop = false;
- StartCoroutine("She_Move");//开始蛇的自动移动
- }
-
- void Update()
- {
- //电脑端,检测键盘的按下来控制蛇的移动
- if (Input.GetKeyDown(KeyCode.W))
- {//如果当前向左、右、上、 那么就可以向上,否则向下
- OnClick_BtnFangXiang(1);
- }
- else if (Input.GetKeyDown(KeyCode.S))
- {//如果当前向左、右、下、 那么就可以向下,否则向上
- OnClick_BtnFangXiang(2);
- }
- else if (Input.GetKeyDown(KeyCode.A))
- {//如果当前向上、下、左。 那么就可以向左,否则向右
- OnClick_BtnFangXiang(3);
- }
- else if (Input.GetKeyDown(KeyCode.D))
- {//如果当前向上、下、右。 那么就可以向右,否则向左
- OnClick_BtnFangXiang(4);
- }
- }
-
- /// <summary>携程, 蛇的移动
- /// </summary>
- IEnumerator She_Move()
- {
- while (!isOver)
- {//是否结束
- if (!isStop)
- {//是否暂停
- Move_1();
- }
- yield return new WaitForSeconds(she_Speed);//每隔多少秒移动一下蛇的身体
- }
- yield return null;
- }
-
- public void Move_1()
- {
- Vector2 v2_Jl = she_Tou.anchoredPosition;
- she_Tou.anchoredPosition += v2_MoveValue;
- for (int i = 1; i < sheListChild.Count; i++)
- {
- Vector2 v2_Jl2 = sheListChild[i].anchoredPosition;
- sheListChild[i].anchoredPosition = v2_Jl;
- v2_Jl = v2_Jl2;
- }
- IF_End();
- }
-
- /// <summary>判断是否结束
- /// </summary>
- public void IF_End()
- {
- if (IF_End_1() || IF_End_2())
- {
- StopCoroutine("She_Move");//停止蛇的自动移动
- gmEnd_Panel.SetActive(true);
- isStop = true;
- t_Title.text = "生存失败!!!\n得分:" + i_Nunber;
- }
-
- if ( (int)(Vector2.Distance(she_Tou.anchoredPosition , img_GuoZi.anchoredPosition)) ==0)
- {
- i_Nunber++;
- t_DeFen.text = "得分:" + i_Nunber;
- GuoZi_RandomPosition();
- She_ADD();
- }
- else if (sheListChild.Count == 1000)
- {
- StopCoroutine("She_Move");//停止蛇的自动移动
- gmEnd_Panel.SetActive(true);
- t_Title.text = "恭喜您获得了满分!\n得分:" + i_Nunber;
- }
- }
-
- /// <summary>判断蛇头是不是吃了自己的身体
- /// </summary>
- bool IF_End_1()
- {
- for (int i = 2; i < sheListChild.Count; i++)
- {
- if (she_Tou.anchoredPosition == sheListChild[i].anchoredPosition)
- {
- return true;
- }
- }
- return false;
- }
- /// <summary>判断蛇头是否达到边界
- /// </summary>
- bool IF_End_2()
- {
- if (Mathf.Abs(she_Tou.anchoredPosition.x) > 512 || Mathf.Abs(she_Tou.anchoredPosition.y) > 512)
- {
- return true;
- }
- return false;
- }
-
- /// <summary>蛇的身体变长
- /// </summary>
- public void She_ADD()
- {//生成蛇的身体
- GameObject gmShe = Instantiate(sheResGm) as GameObject;
- gmShe.transform.SetParent(she_Tou.parent);//设定蛇行走的区域为父物体
- gmShe.GetComponent<RectTransform>().localScale = Vector3.one;//初始化缩放
- gmShe.GetComponent<RectTransform>().anchoredPosition = sheListChild[sheListChild.Count - 1].anchoredPosition;
- sheListChild.Add(gmShe.GetComponent<RectTransform>());
- }
-
- /// <summary>开始游戏按钮事件
- /// </summary>
- public void OnClick_Btn_StartGame()
- {
- gmEnd_Panel.SetActive(false);//关闭开始结束界面
- i_Nunber = 0;
- Init();
- }
-
- /// <summary>退出游戏按钮事件
- /// </summary>
- public void OnClick_Btn_Quit()
- {
- Application.Quit();
- }
-
- /// <summary>果子随机位置
- /// </summary>
- private void GuoZi_RandomPosition()
- {
- img_GuoZi.anchoredPosition = Get_Position();
- }
-
- /// <summary>随机果子位置并判断是否与蛇的身体重合
- /// </summary>
- /// <returns></returns>
- Vector2 Get_Position()
- {
- Vector2 v2Random = new Vector2(i_MoveSize * Random.Range(-16, 16), i_MoveSize * Random.Range(-16, 16));
- int i_Count1 = 0;//用来判断果子是不是随机到了蛇的身体上面了,如果是,重新随机
- for (int i = 0; i < sheListChild.Count; i++)
- {
- if (sheListChild[i].anchoredPosition == v2Random)
- {
- i_Count1++;
- break;
- }
- }
- if (i_Count1 > 0)
- {
- Get_Position();
- }
- return v2Random;
- }
-
- /// <summary>方向按钮键。可以手动拖给按钮事件。
- /// Int代表的按键 1:W。 2:S 。 3:A 。 4:D
- /// </summary>
- public void OnClick_BtnFangXiang(int i_Fx)
- {
- if (!isStop)
- {
- switch (i_Fx)
- {
- case 1://如果当前向左、右、上、 那么就可以向上,否则向下
- v2_MoveValue.y = v2_MoveValue.x == -32 || v2_MoveValue.x == 32 || v2_MoveValue.y == 32 ? 32 : -32;
- v2_MoveValue.x = 0;
- //StopCoroutine("");
- isStop = true;
- Move_1();
- isStop = false;
- //StartCoroutine("She_Move");
- break;
- case 2://如果当前向左、右、下、 那么就可以向下,否则向上
- v2_MoveValue.y = v2_MoveValue.x == -32 || v2_MoveValue.x == 32 || v2_MoveValue.y == -32 ? -32 : 32;
- v2_MoveValue.x = 0;
- isStop = true;
- Move_1();
- isStop = false;
- break;
- case 3://如果当前向上、下、左。 那么就可以向左,否则向右
- v2_MoveValue.x = v2_MoveValue.y == -32 || v2_MoveValue.y == 32 || v2_MoveValue.x == -32 ? -32 : 32;
- v2_MoveValue.y = 0;
- isStop = true;
- Move_1();
- isStop = false;
- break;
- case 4://如果当前向上、下、右。 那么就可以向右,否则向左
- v2_MoveValue.x = v2_MoveValue.y == -32 || v2_MoveValue.y == 32 || v2_MoveValue.x == 32 ? 32 : -32;
- v2_MoveValue.y = 0;
- isStop = true;
- Move_1();
- isStop = false;
- break;
- default:
- break;
- }
- }
-
- }
-
- }
工程地址: https://download.csdn.net/download/Highning0007/88015671Unity游戏源码分享-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。