按鼠标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/88015671