当前位置:   article > 正文

Unity游戏源码分享-Unity3d-UGUI实现的贪食蛇小游戏_unity小游戏源码

unity小游戏源码

 按鼠标WASD键来控制蛇的走向。

核心的代码如下:

  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine.UI;
  5. /// 《UGUI贪吃蛇》
  6. public class TCS2d : MonoBehaviour
  7. {
  8. public bool isOver = false;
  9. public bool isStop = false;//是否停止
  10. [SerializeField]
  11. private Vector2 v2_MoveValue = new Vector2(0, 32);
  12. public GameObject sheResGm;
  13. public RectTransform she_Tou;//蛇身体预制件。当吃掉果实,就实例化,生成一个身体
  14. public GameObject she_NewRes;//一条小蛇预制体。当开始。 实例化小蛇
  15. public RectTransform img_GuoZi;//蛇将要吃掉的果子。
  16. public Transform t_SheParent;
  17. [SerializeField]
  18. private List<RectTransform> sheListChild = new List<RectTransform>();//蛇的身体组成,开始拖拽了4个在上面(在Unity面板可以看见)
  19. private List<Vector2> listStartV2 = new List<Vector2>();//用来记录初始的身体部分 坐标
  20. private RectTransform[] sheStartRectTAry;//用来记录初始 拖拽好的身体部分
  21. private const int i_MoveSize = 32;//蛇的移动坐标单位
  22. [SerializeField]
  23. private float she_Speed = 0.1f;//(移动间隔时间)蛇的移动速度,。越低越快
  24. public Text t_DeFen;//用来显示当前得分
  25. public Text t_Title;//用来显示结果
  26. public GameObject gmEnd_Panel;//结束界面
  27. private int i_Nunber;
  28. // Use this for initialization
  29. void Start()
  30. {
  31. }
  32. /// <summary>初始化
  33. /// </summary>
  34. void Init()
  35. {
  36. img_GuoZi.transform.SetParent(t_SheParent);//将果子提取出来避免被销毁
  37. if (sheListChild.Count!=0)
  38. {//销毁蛇(可能是结束后重新开始, 所以我们销毁蛇的所有身体)
  39. Destroy(sheListChild[0].parent.gameObject);
  40. }
  41. sheListChild.Clear();
  42. GameObject gmIns = Instantiate(she_NewRes) as GameObject;//生成小蛇
  43. gmIns.transform.SetParent(t_SheParent);
  44. gmIns.GetComponent<RectTransform>().localScale = Vector3.one;
  45. gmIns.GetComponent<RectTransform>().anchoredPosition = Vector2.zero;
  46. for (int i = 0; i < gmIns.transform.childCount; i++)
  47. {//初始化蛇
  48. sheListChild.Add(gmIns.transform.GetChild(i).GetComponent<RectTransform>());
  49. }
  50. she_Tou = sheListChild[0];//设置蛇头
  51. img_GuoZi.transform.SetParent(she_Tou.parent);
  52. //Debug.Log("Delete:"+i_DeleteCount);
  53. GuoZi_RandomPosition();//随机果子位置
  54. v2_MoveValue = new Vector2(-32,0);//设置方向
  55. isStop = false;
  56. StartCoroutine("She_Move");//开始蛇的自动移动
  57. }
  58. void Update()
  59. {
  60. //电脑端,检测键盘的按下来控制蛇的移动
  61. if (Input.GetKeyDown(KeyCode.W))
  62. {//如果当前向左、右、上、 那么就可以向上,否则向下
  63. OnClick_BtnFangXiang(1);
  64. }
  65. else if (Input.GetKeyDown(KeyCode.S))
  66. {//如果当前向左、右、下、 那么就可以向下,否则向上
  67. OnClick_BtnFangXiang(2);
  68. }
  69. else if (Input.GetKeyDown(KeyCode.A))
  70. {//如果当前向上、下、左。 那么就可以向左,否则向右
  71. OnClick_BtnFangXiang(3);
  72. }
  73. else if (Input.GetKeyDown(KeyCode.D))
  74. {//如果当前向上、下、右。 那么就可以向右,否则向左
  75. OnClick_BtnFangXiang(4);
  76. }
  77. }
  78. /// <summary>携程, 蛇的移动
  79. /// </summary>
  80. IEnumerator She_Move()
  81. {
  82. while (!isOver)
  83. {//是否结束
  84. if (!isStop)
  85. {//是否暂停
  86. Move_1();
  87. }
  88. yield return new WaitForSeconds(she_Speed);//每隔多少秒移动一下蛇的身体
  89. }
  90. yield return null;
  91. }
  92. public void Move_1()
  93. {
  94. Vector2 v2_Jl = she_Tou.anchoredPosition;
  95. she_Tou.anchoredPosition += v2_MoveValue;
  96. for (int i = 1; i < sheListChild.Count; i++)
  97. {
  98. Vector2 v2_Jl2 = sheListChild[i].anchoredPosition;
  99. sheListChild[i].anchoredPosition = v2_Jl;
  100. v2_Jl = v2_Jl2;
  101. }
  102. IF_End();
  103. }
  104. /// <summary>判断是否结束
  105. /// </summary>
  106. public void IF_End()
  107. {
  108. if (IF_End_1() || IF_End_2())
  109. {
  110. StopCoroutine("She_Move");//停止蛇的自动移动
  111. gmEnd_Panel.SetActive(true);
  112. isStop = true;
  113. t_Title.text = "生存失败!!!\n得分:" + i_Nunber;
  114. }
  115. if ( (int)(Vector2.Distance(she_Tou.anchoredPosition , img_GuoZi.anchoredPosition)) ==0)
  116. {
  117. i_Nunber++;
  118. t_DeFen.text = "得分:" + i_Nunber;
  119. GuoZi_RandomPosition();
  120. She_ADD();
  121. }
  122. else if (sheListChild.Count == 1000)
  123. {
  124. StopCoroutine("She_Move");//停止蛇的自动移动
  125. gmEnd_Panel.SetActive(true);
  126. t_Title.text = "恭喜您获得了满分!\n得分:" + i_Nunber;
  127. }
  128. }
  129. /// <summary>判断蛇头是不是吃了自己的身体
  130. /// </summary>
  131. bool IF_End_1()
  132. {
  133. for (int i = 2; i < sheListChild.Count; i++)
  134. {
  135. if (she_Tou.anchoredPosition == sheListChild[i].anchoredPosition)
  136. {
  137. return true;
  138. }
  139. }
  140. return false;
  141. }
  142. /// <summary>判断蛇头是否达到边界
  143. /// </summary>
  144. bool IF_End_2()
  145. {
  146. if (Mathf.Abs(she_Tou.anchoredPosition.x) > 512 || Mathf.Abs(she_Tou.anchoredPosition.y) > 512)
  147. {
  148. return true;
  149. }
  150. return false;
  151. }
  152. /// <summary>蛇的身体变长
  153. /// </summary>
  154. public void She_ADD()
  155. {//生成蛇的身体
  156. GameObject gmShe = Instantiate(sheResGm) as GameObject;
  157. gmShe.transform.SetParent(she_Tou.parent);//设定蛇行走的区域为父物体
  158. gmShe.GetComponent<RectTransform>().localScale = Vector3.one;//初始化缩放
  159. gmShe.GetComponent<RectTransform>().anchoredPosition = sheListChild[sheListChild.Count - 1].anchoredPosition;
  160. sheListChild.Add(gmShe.GetComponent<RectTransform>());
  161. }
  162. /// <summary>开始游戏按钮事件
  163. /// </summary>
  164. public void OnClick_Btn_StartGame()
  165. {
  166. gmEnd_Panel.SetActive(false);//关闭开始结束界面
  167. i_Nunber = 0;
  168. Init();
  169. }
  170. /// <summary>退出游戏按钮事件
  171. /// </summary>
  172. public void OnClick_Btn_Quit()
  173. {
  174. Application.Quit();
  175. }
  176. /// <summary>果子随机位置
  177. /// </summary>
  178. private void GuoZi_RandomPosition()
  179. {
  180. img_GuoZi.anchoredPosition = Get_Position();
  181. }
  182. /// <summary>随机果子位置并判断是否与蛇的身体重合
  183. /// </summary>
  184. /// <returns></returns>
  185. Vector2 Get_Position()
  186. {
  187. Vector2 v2Random = new Vector2(i_MoveSize * Random.Range(-16, 16), i_MoveSize * Random.Range(-16, 16));
  188. int i_Count1 = 0;//用来判断果子是不是随机到了蛇的身体上面了,如果是,重新随机
  189. for (int i = 0; i < sheListChild.Count; i++)
  190. {
  191. if (sheListChild[i].anchoredPosition == v2Random)
  192. {
  193. i_Count1++;
  194. break;
  195. }
  196. }
  197. if (i_Count1 > 0)
  198. {
  199. Get_Position();
  200. }
  201. return v2Random;
  202. }
  203. /// <summary>方向按钮键。可以手动拖给按钮事件。
  204. /// Int代表的按键 1:W。 2:S 。 3:A 。 4:D
  205. /// </summary>
  206. public void OnClick_BtnFangXiang(int i_Fx)
  207. {
  208. if (!isStop)
  209. {
  210. switch (i_Fx)
  211. {
  212. case 1://如果当前向左、右、上、 那么就可以向上,否则向下
  213. v2_MoveValue.y = v2_MoveValue.x == -32 || v2_MoveValue.x == 32 || v2_MoveValue.y == 32 ? 32 : -32;
  214. v2_MoveValue.x = 0;
  215. //StopCoroutine("");
  216. isStop = true;
  217. Move_1();
  218. isStop = false;
  219. //StartCoroutine("She_Move");
  220. break;
  221. case 2://如果当前向左、右、下、 那么就可以向下,否则向上
  222. v2_MoveValue.y = v2_MoveValue.x == -32 || v2_MoveValue.x == 32 || v2_MoveValue.y == -32 ? -32 : 32;
  223. v2_MoveValue.x = 0;
  224. isStop = true;
  225. Move_1();
  226. isStop = false;
  227. break;
  228. case 3://如果当前向上、下、左。 那么就可以向左,否则向右
  229. v2_MoveValue.x = v2_MoveValue.y == -32 || v2_MoveValue.y == 32 || v2_MoveValue.x == -32 ? -32 : 32;
  230. v2_MoveValue.y = 0;
  231. isStop = true;
  232. Move_1();
  233. isStop = false;
  234. break;
  235. case 4://如果当前向上、下、右。 那么就可以向右,否则向左
  236. v2_MoveValue.x = v2_MoveValue.y == -32 || v2_MoveValue.y == 32 || v2_MoveValue.x == 32 ? 32 : -32;
  237. v2_MoveValue.y = 0;
  238. isStop = true;
  239. Move_1();
  240. isStop = false;
  241. break;
  242. default:
  243. break;
  244. }
  245. }
  246. }
  247. }

工程地址: https://download.csdn.net/download/Highning0007/88015671Unity游戏源码分享-

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/587948
推荐阅读
相关标签
  

闽ICP备14008679号