当前位置:   article > 正文

Unity实现羊了个羊小游戏(超简单版)练习版_unity 羊了个羊

unity 羊了个羊

unity2d(urp)实现,有音乐切换,音乐大小调整,羊了个羊简单内容实现(第一关),卡牌移动和消失等主要功能,卡牌移动动画使用dotweenpro插件实现,美术直接从手机上抠下来的,除美术外均无CV内容。用数组实现了一个简单的删除队列的数据结构,用以防止快速点击卡牌时误删其他新加入删除队列的同类型的卡牌,主体代码均带注释,部分变量无注释,练习项目比较简单,仅用于参考学习,不得作其他使用,若作他用引起麻烦,与本人无关,打包的unity资源包和android apk已上传,可直接下载.

下面展示主要代码(大部分代码写到一个类里面了,所以只展示卡牌类的代码):

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using DG.Tweening;
  5. using UnityEngine.UI;
  6. using Unity.VisualScripting;
  7. using UnityEngine.Rendering;
  8. using System.Runtime.CompilerServices;
  9. using UnityEngine.UIElements;
  10. using TMPro;
  11. public class Card_event : MonoBehaviour
  12. {
  13. public int card_type = 0;//卡牌类型0:胡萝卜1:玉米2:草3:铃铛
  14. public bool card_is_enable = true;//此卡牌是否被使用
  15. public GameObject systemevent;
  16. public GameObject game_over_ui;
  17. private int delete_count = 3;//集齐N张卡片后删除
  18. public int init_max_delete = 3;//方便在unity里面初始化最大卡牌数
  19. private void Awake()
  20. {
  21. //初始化删除卡牌数
  22. delete_count = init_max_delete;
  23. //为卡牌添加点击事件
  24. GetComponent<UnityEngine.UI.Button>().onClick.AddListener(move_to);
  25. }
  26. // Start is called before the first frame update
  27. void Start()
  28. {
  29. }
  30. // Update is called once per frame
  31. void Update()
  32. {
  33. }
  34. public void move_to()
  35. {
  36. if(card_is_enable == false)//如果卡牌已被使用则不能再移动此卡牌
  37. {
  38. return;
  39. }
  40. for(int i = 0; i < systemevent.GetComponent<Game_over_btn>().first_level.Length; i++)//如果第一层的卡牌被使用,对应在其下的卡牌设置为可以使用,否则无法使用下层卡牌
  41. {
  42. if (systemevent.GetComponent<Game_over_btn>().first_level[i] == null)
  43. {
  44. continue;
  45. }
  46. if (gameObject.Equals(systemevent.GetComponent<Game_over_btn>().first_level[i].gameObject)){
  47. systemevent.GetComponent<Game_over_btn>().second_level[i].GetComponent<Card_event>().card_is_enable = true;
  48. break;
  49. }
  50. }
  51. for(int i = 0; i < systemevent.GetComponent<card_slot>().solt_enable.Length; i++)//检查当前是否有可用卡槽
  52. {
  53. if (systemevent.GetComponent<card_slot>().solt_enable[i] == null)//检测到第i个卡槽可用
  54. {
  55. transform.DOMove(systemevent.GetComponent<card_slot>().slot[i].transform.position, 0.8f);//移动卡牌到该卡槽位置
  56. systemevent.GetComponent<card_slot>().solt_enable[i] = this.gameObject;//设置此卡槽已被占用
  57. GetComponent<UnityEngine.UI.Button>().enabled = false;//设置此卡牌已被使用
  58. switch(card_type)//记录此类卡牌在卡槽中的数量
  59. {
  60. case 0:
  61. systemevent.GetComponent<card_slot>().carrot++;
  62. break;
  63. case 1:
  64. systemevent.GetComponent<card_slot>().grass++;
  65. break;
  66. case 2:
  67. systemevent.GetComponent<card_slot>().corn++;
  68. break;
  69. case 3:
  70. systemevent.GetComponent<card_slot>().bell++;
  71. break;
  72. default:
  73. break;
  74. }
  75. switch (card_type)//检测此类卡牌在卡槽中的数量是否已达到需要删除的数量
  76. {
  77. case 0:
  78. if(systemevent.GetComponent<card_slot>().carrot == delete_count)//如果已经达到执行一下程序
  79. {
  80. int k = 0;
  81. for (int j = 0; j < systemevent.GetComponent<card_slot>().solt_enable.Length; j++)
  82. {
  83. if (k >= delete_count)//把N张此类卡牌放入删除队列,以防在删除之前加入了同类型卡牌导致误删新加入的同类卡牌,达到数量后不再将此类卡牌放入删除队列,待队列删除完成再继续加入
  84. {
  85. break;
  86. }
  87. if (systemevent.GetComponent<card_slot>().solt_enable[j] == null)//检查所有卡牌,检查卡牌是否还在场上,如果没有则跳过
  88. {
  89. continue;
  90. }
  91. if (systemevent.GetComponent<card_slot>().solt_enable[j].GetComponent<Card_event>().card_type == card_type)//检查所有场上的卡牌,将所有在卡槽上的此类卡牌按顺序添加N张到删除队列中
  92. {
  93. systemevent.GetComponent<Game_over_btn>().delete_queene[systemevent.GetComponent<Game_over_btn>().delete_queene_cur] = (systemevent.GetComponent<card_slot>().solt_enable[j]);//把卡牌放入删除队列
  94. systemevent.GetComponent<Game_over_btn>().delete_queene_cur++;//删除队列加1
  95. systemevent.GetComponent<card_slot>().solt_enable[j] = null;//设置该卡槽可用
  96. k++;//加入删除的队列的数量+1
  97. }
  98. }
  99. Invoke("delay_change_img", 1f);//1s后执行sprite变换,实现消失动画效果
  100. Invoke("delay_delete", 1.1f);//从队列中删除这N个卡牌,并销毁其对象
  101. systemevent.GetComponent<card_slot>().carrot = 0;
  102. }
  103. break;
  104. case 1:
  105. if (systemevent.GetComponent<card_slot>().grass == delete_count)
  106. {
  107. int k = 0;
  108. for (int j = 0; j < systemevent.GetComponent<card_slot>().solt_enable.Length; j++)
  109. {
  110. if (k >= delete_count)
  111. {
  112. break;
  113. }
  114. if (systemevent.GetComponent<card_slot>().solt_enable[j] == null)
  115. {
  116. continue;
  117. }
  118. if (systemevent.GetComponent<card_slot>().solt_enable[j].GetComponent<Card_event>().card_type == card_type)
  119. {
  120. systemevent.GetComponent<Game_over_btn>().delete_queene[systemevent.GetComponent<Game_over_btn>().delete_queene_cur] = (systemevent.GetComponent<card_slot>().solt_enable[j]);
  121. systemevent.GetComponent<Game_over_btn>().delete_queene_cur++;
  122. systemevent.GetComponent<card_slot>().solt_enable[j] = null;
  123. k++;
  124. }
  125. }
  126. Invoke("delay_change_img", 1f);
  127. Invoke("delay_delete", 1.1f);
  128. systemevent.GetComponent<card_slot>().grass = 0;
  129. }
  130. break;
  131. case 2:
  132. if (systemevent.GetComponent<card_slot>().corn == delete_count)
  133. {
  134. int k = 0;
  135. for (int j = 0; j < systemevent.GetComponent<card_slot>().solt_enable.Length; j++)
  136. {
  137. if (k >= delete_count)
  138. {
  139. break;
  140. }
  141. if (systemevent.GetComponent<card_slot>().solt_enable[j] == null)
  142. {
  143. continue;
  144. }
  145. if (systemevent.GetComponent<card_slot>().solt_enable[j].GetComponent<Card_event>().card_type == card_type)
  146. {
  147. systemevent.GetComponent<Game_over_btn>().delete_queene[systemevent.GetComponent<Game_over_btn>().delete_queene_cur] = (systemevent.GetComponent<card_slot>().solt_enable[j]);
  148. systemevent.GetComponent<Game_over_btn>().delete_queene_cur++;
  149. systemevent.GetComponent<card_slot>().solt_enable[j] = null;
  150. k++;
  151. }
  152. }
  153. Invoke("delay_change_img", 1f);
  154. Invoke("delay_delete", 1.1f);
  155. systemevent.GetComponent<card_slot>().corn = 0;
  156. }
  157. break;
  158. case 3:
  159. if (systemevent.GetComponent<card_slot>().bell == delete_count)
  160. {
  161. int k = 0;
  162. for (int j = 0; j < systemevent.GetComponent<card_slot>().solt_enable.Length; j++)
  163. {
  164. if (k >= delete_count)
  165. {
  166. break;
  167. }
  168. if (systemevent.GetComponent<card_slot>().solt_enable[j] == null)
  169. {
  170. continue;
  171. }
  172. if (systemevent.GetComponent<card_slot>().solt_enable[j].GetComponent<Card_event>().card_type == card_type)
  173. {
  174. systemevent.GetComponent<Game_over_btn>().delete_queene[systemevent.GetComponent<Game_over_btn>().delete_queene_cur] = (systemevent.GetComponent<card_slot>().solt_enable[j]);
  175. systemevent.GetComponent<Game_over_btn>().delete_queene_cur++;
  176. systemevent.GetComponent<card_slot>().solt_enable[j] = null;
  177. k++;
  178. }
  179. }
  180. Invoke("delay_change_img", 1f);
  181. Invoke("delay_delete", 1.1f);
  182. systemevent.GetComponent<card_slot>().bell = 0;
  183. }
  184. break;
  185. default:
  186. break;
  187. }
  188. card_is_enable = false;//设置卡牌已被使用
  189. for (int w = 0; w < systemevent.GetComponent<card_slot>().all_cards.Length; w++)//检查所有卡牌是否被启用,如果没有全部启用,不执行后面的程序直接返回函数
  190. {
  191. if (systemevent.GetComponent<card_slot>().all_cards[w] != null)
  192. {
  193. if (systemevent.GetComponent<card_slot>().all_cards[w].GetComponent<Card_event>().card_is_enable != false)
  194. {
  195. return;
  196. }
  197. }
  198. }
  199. for (int e = 0; e < systemevent.GetComponent<card_slot>().solt_enable.Length; e++)//如果所有卡牌都被使用,检查卡槽中是否还有卡牌,如果有就判定玩家游戏失败,如果没有则判定玩家获得游戏胜利
  200. {
  201. if (systemevent.GetComponent<card_slot>().solt_enable[e] == false)
  202. {
  203. systemevent.GetComponent<card_slot>().gameover_text.text = "你赢了!";
  204. game_over_ui.SetActive(true);
  205. return;
  206. }
  207. }
  208. systemevent.GetComponent<card_slot>().gameover_text.text = "你输了!";
  209. game_over_ui.SetActive(true);
  210. return;
  211. }
  212. }
  213. systemevent.GetComponent<card_slot>().gameover_text.text = "你输了!";
  214. game_over_ui.SetActive(true);
  215. }
  216. public void delay_delete()
  217. {
  218. for (int i = 0; i < delete_count; i++)//删除删除队列中的前N个对象指向的实体,并将这N个对象删除出队列,队列指向归零,但不一定队列里面没有对象,如果前面的一组还没有删除,后面就出现了需要新的需要删除的一组,新的一组会加入队列,等待前一组删除完毕再进行删除操作
  219. {
  220. Destroy(systemevent.GetComponent<Game_over_btn>().delete_queene[0]);
  221. for (int k = 0; k < systemevent.GetComponent<Game_over_btn>().delete_queene_cur; k++)
  222. {
  223. systemevent.GetComponent<Game_over_btn>().delete_queene[k] = systemevent.GetComponent<Game_over_btn>().delete_queene[k + 1];
  224. }
  225. systemevent.GetComponent<Game_over_btn>().delete_queene_cur--;
  226. }
  227. }
  228. public void delay_change_img()
  229. {
  230. for (int i = 0; i < delete_count; i++)//将删除队列中的前N个马上要删除的对象的sprite换成消失动画sprite,实现消失动画
  231. {
  232. systemevent.GetComponent<Game_over_btn>().delete_queene[i].GetComponent<UnityEngine.UI.Image>().sprite = Resources.Load<Sprite>("disappear");
  233. }
  234. }
  235. }

游戏界面:

基于Unity引擎的简单版本羊了个羊小游戏(Unity学习)

感谢阅读!

感谢阅读!

感谢阅读!

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

闽ICP备14008679号