当前位置:   article > 正文

Unity学习记录:制作双屏垃圾分类小游戏_unity 双屏幕

unity 双屏幕

一:逻辑梳理

要实现的功能

游戏操作

在规定时间内,垃圾通过拖拽进入正确垃圾桶的容器,垃圾在这里消失,飞入第二个屏上对应垃圾桶的位置并实现加分和加时间的效果,垃圾拖拽进入不正确的垃圾桶,垃圾会返回到原来的位置,同时,相应的时间也会减少

胜利和失败的条件:

胜利:垃圾全部分类完毕,并且时间不为零,游戏胜利,

失败:时间为0,垃圾未分类结束,游戏失败

游戏结束后,可以点击屏幕可以重新进入游戏,重新进入游戏时,垃圾的排列会发生变化

游戏代码梳理

需要一个每个垃圾自己的类,涉及垃圾自己的属性,都放在这个类里面,例如:垃圾的拖拽,整个游戏中,只有垃圾需要拖拽的功能,这个是只属于垃圾的功能,就放在这个类里面

每个垃圾桶自己的类,涉及垃圾桶的属性,都放在这里面,例如:垃圾进入和离开垃圾桶的碰撞器

垃圾和垃圾桶之间交互的管理类,例如:垃圾和垃圾桶之间分类正确加分,错误减分,垃圾的布局

游戏胜利和失败等都是在这个类中

双屏显示的类

二:效果展示

三:UI布局和代码书写

1.双屏的设置

新建两个canvas,分别命名:MainCanvas和ViceCanvas,新建一个摄像机,名为:ViceCamera

设置MainCamera和MainCanvas属性,如图所示

 ViceCamera和ViceCanvas的Target Display设置为DisPlay2,把ViceCamera上面的Audio Listence删掉,一个场景中只需要一个Audio Listence

新建一个C#脚本,名为:SplitScreen,编写代码

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 分屏代码
  6. /// </summary>
  7. public class SplitScreen : MonoBehaviour
  8. {
  9. void Start()
  10. {
  11. if (Display.displays.Length > 1)
  12. Display.displays[1].Activate();
  13. if (Display.displays.Length > 2)
  14. Display.displays[2].Activate();
  15. }
  16. }

二:垃圾的设置

在MainCanvas下面新建一个空物体:GarbagePanel ,铺满全屏,管理类的代码放在这个上面,一直都显示

在GarbagePanel下面新建一个空物体:root,铺满全屏,作为垃圾分类主界面的容器,所有的图片文字视频都放在这里面

在root下

新建图片:bg,铺满全屏,把背景图片拖进去,

新建空物体:garbageItemContent,铺满全屏,用来存放所有垃圾,把所有的垃圾都拖进来,作为他的子物体,每个垃圾都添加BoxCollide2Dr和Rigibody2D,手动调节碰撞盒的大小,(这里设置的是100*100),将Rigibody2D的重力值大小设为0(防止垃圾往下坠落)设置垃圾的标签,不同的垃圾设置不同的标签recycle,dry,wet,hamful

 新建C#脚本:GarbageItem,运用鼠标拖拽的三个接口实现垃圾拖拽的操作

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. public class GarbageItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  6. {
  7. Vector2 offest; //鼠标的偏移量
  8. Vector2 startPos; //垃圾初始位置
  9. Vector2 oldPos; //鼠标拖拽结束之后的位置
  10. RectTransform rect; //垃圾的RectTransform(当垃圾消失(垃圾的setactive为false)时,垃圾的RectTransform为空)
  11. //组件初始化
  12. void InitCompoment()
  13. {
  14. if (rect==null)
  15. {
  16. rect = GetComponent<RectTransform>();
  17. }
  18. }
  19. //数据初始化
  20. void InitData(Vector2 pos)
  21. {
  22. //组件初始化
  23. InitCompoment();
  24. //位置初始化
  25. startPos = pos;
  26. RestoreOriginPos();
  27. //TODO:与垃圾桶的关系
  28. }
  29. //位置修改
  30. void RestoreOriginPos()
  31. {
  32. //获取初始位置
  33. startPos = rect.anchoredPosition;
  34. }
  35. //鼠标开始拖拽
  36. public void OnBeginDrag(PointerEventData eventData)
  37. {
  38. //拖拽过程中的偏移量
  39. offest = eventData.position - (Vector2)transform.position;
  40. }
  41. //鼠标拖拽过程
  42. public void OnDrag(PointerEventData eventData)
  43. {
  44. //垃圾的位置限制,不能拖出屏幕外
  45. Vector2 pos = eventData.position - offest;
  46. transform.position = new Vector3(Mathf.Clamp(pos.x, 0, Screen.width), Mathf.Clamp(pos.y, 0, Screen.width), 0);
  47. //拖拽完毕后的位置
  48. oldPos = eventData.position - offest;
  49. }
  50. //拖拽结束
  51. public void OnEndDrag(PointerEventData eventData)
  52. {
  53. //TODO:完成加分,加时间等操作,需要与垃圾桶,和管理者交互
  54. }
  55. }

 

 但是,我们只是做到了垃圾的拖拽,但是与垃圾桶的交互和游戏的逻辑制作,后面会做这些工作

三:垃圾桶的设置

新建一个空物体:TrashCanRoot,放在屏幕上方,调整大小

在TrashCanRoot的下面新建四个图片,代表四种类型的垃圾桶,每个垃圾筒上都添加BoxCollider2D和Rigidbody2D组件,在BoxCollider2D中勾选IsTrigger,设置Rigidbody2D的重力值为0,并为每个垃圾桶添加标签,如图所示

 新建C#脚本:Trash

在GarbageItem中添加垃圾桶的引用,并实现封装

在数据初始化中添加:Trash = null;

在鼠标拖拽结束的代码中,添加

 编辑Trash脚本

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. /// <summary>
  5. /// 垃圾桶
  6. /// </summary>
  7. public class Trash : MonoBehaviour
  8. {
  9. #region 垃圾进入垃圾桶的碰撞器
  10. private void OnTriggerEnter2D(Collider2D collision)
  11. {
  12. if (collision.transform.GetComponent<GarbageItem>() != null)
  13. collision.transform.GetComponent<GarbageItem>().Trash = this;
  14. }
  15. #endregion
  16. #region 物体离开垃圾桶的碰撞器
  17. private void OnTriggerExit2D(Collider2D collision)
  18. {
  19. //离开后设置垃圾桶为空
  20. if (collision.transform.GetComponent<GarbageItem>() != null)
  21. collision.transform.GetComponent<GarbageItem>().Trash = null;
  22. }
  23. #endregion
  24. }

副屏上面的界面

四:游戏管理者

新建四个空物体,挂载Audio Source组件,把对应的音效文件拖入Clip中,如图

编写脚本

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine.UI;
  4. using UnityEngine;
  5. using UnityEngine.Audio;
  6. using Interface;
  7. using DG.Tweening;
  8. /// <summary>
  9. /// 垃圾分类面板脚本
  10. /// </summary>
  11. public class GarbagePanel : MonoBehaviour, BubbleContent
  12. {
  13. public bool isGameOver; //游戏是否结束 true结束 false未结束
  14. int createNumber = 0; //随机次数 为了创建垃圾item的不同位置
  15. int sumScore = 0; //总分数(由垃圾item容器子物体数量决定)
  16. int timer = 300; //时间
  17. public int score = 0; //分数
  18. GarbageItem currentItem; //当前正在拖拽的垃圾item
  19. Tweener addTimerTweener; //加减时间动画
  20. [Header("游戏最大持续时间")]
  21. public int maxTimer = 180;
  22. [Header("退出按钮")]
  23. [SerializeField] Button quitBtn;
  24. [Header("正确、错误、游戏胜利、游戏失败音效")]
  25. [SerializeField] AudioSource correntAudio;
  26. [SerializeField] AudioSource errorAudio;
  27. [SerializeField] AudioSource victoryAudio;
  28. [SerializeField] AudioSource defeatedAudio;
  29. [Header("游戏胜利/失败Text,2屏时间、分数、加时间Text,点击屏幕刷新游戏按钮")]
  30. [SerializeField] Text gameOverTxt;
  31. public Text timeTxt;
  32. public Text scoreTxt;
  33. [SerializeField] Button refreshBtn;
  34. [Header("2屏加时间Text,加减分颜色")]
  35. [SerializeField] Color addColor;
  36. [SerializeField] Color subtractColor;
  37. [SerializeField] Text addTimerTxt;
  38. [Header("加分星星动画预设,星星容器")]
  39. [SerializeField] Transform starPrefab;
  40. [SerializeField] Transform starContent;
  41. List<Transform> starPool; //星星对象池
  42. List<Transform> moveStarList; //正在播放的星星特效
  43. [Header("2屏的垃圾桶位置")]
  44. public Transform twoSceneTrashPos;
  45. [Header("1屏 所有垃圾item存放容器")]
  46. public Transform garbageItemContent;
  47. [Header("垃圾分类root,2屏垃圾分类界面")]
  48. [SerializeField] GameObject root;
  49. [SerializeField] GameObject twoSceneRoot;
  50. List<GarbageItem> moveGarbageList; //正在dotween移动的垃圾item
  51. List<Vector2> garbageItemPosRotList; //垃圾item的所有位置
  52. Dictionary<string, Transform> twoSceneTrashPosDic; //2屏的垃圾桶位置字典
  53. public Dictionary<string, Transform> TwoSceneTrashPosDic { get => twoSceneTrashPosDic; set => twoSceneTrashPosDic = value; } //封装 GarbageItem调用
  54. public List<GarbageItem> MoveGarbageList { get => moveGarbageList; }
  55. public GarbageItem CurrentItem { get => currentItem; set => currentItem = value; }
  56. //单例
  57. static GarbagePanel instance;
  58. public static GarbagePanel GetInstance()
  59. {
  60. return instance;
  61. }
  62. void Awake()
  63. {
  64. instance = this;
  65. }
  66. void Start()
  67. {
  68. starPool = new List<Transform>();
  69. moveStarList = new List<Transform>();
  70. moveGarbageList = new List<GarbageItem>();
  71. //DoTween动画
  72. addTimerTweener = addTimerTxt.DOFade(0, 2f);
  73. addTimerTweener.SetAutoKill(false);
  74. addTimerTweener.Pause();
  75. //默认颜色透明
  76. addTimerTxt.color = new Color32(0, 0, 0, 0);
  77. //初始化所有垃圾的位置
  78. garbageItemPosRotList = new List<Vector2>();
  79. foreach (Transform item in garbageItemContent)
  80. {
  81. garbageItemPosRotList.Add(item.GetComponent<RectTransform>().anchoredPosition);
  82. }
  83. //2垃圾桶位置字典初始化
  84. twoSceneTrashPosDic = new Dictionary<string, Transform>();
  85. foreach (Transform item in twoSceneTrashPos)
  86. {
  87. twoSceneTrashPosDic.Add(item.tag, item);
  88. }
  89. //按钮监听
  90. quitBtn.onClick.AddListener(ReturnMainPanel);
  91. refreshBtn.onClick.AddListener(RefreshGame);
  92. }
  93. #region 游戏刷新
  94. IEnumerator timerIE; //时间倒数
  95. void RefreshGame()
  96. {
  97. //游戏未结束
  98. isGameOver = false;
  99. //不为空 先停止协程,然后在开启,防止冲突
  100. if (timerIE != null)
  101. StopCoroutine(timerIE);
  102. //音效停止
  103. StopAllAudio();
  104. //隐藏刷新,游戏结束提示按钮
  105. refreshBtn.gameObject.SetActive(false);
  106. gameOverTxt.gameObject.SetActive(false);
  107. //回收所有加分星星
  108. RecycleAllStar();
  109. //刷新垃圾item布局
  110. RefreshGarbage();
  111. //总分数、时间、分数 初始化
  112. sumScore = garbageItemContent.childCount;
  113. score = 0;
  114. timer = maxTimer;
  115. scoreTxt.text = "分数:" + score.ToString();
  116. timeTxt.text = "时间:" + timer.ToString();
  117. //开启协程
  118. timerIE = GameTime();
  119. StartCoroutine(timerIE);
  120. }
  121. #endregion
  122. #region 刷新垃圾item布局
  123. public void RefreshGarbage()
  124. {
  125. int count = garbageItemContent.childCount;
  126. //创建次数超过垃圾最大数量时为0
  127. if (createNumber > count - 1)
  128. createNumber = 0;
  129. for (int i = 0; i < count; i++)
  130. {
  131. int index = i + createNumber;
  132. //当下标超出最后一位时为0
  133. if (index > count - 1)
  134. index = Mathf.Abs(count - index);
  135. //位置初始化
  136. garbageItemContent.GetChild(i).GetComponent<GarbageItem>().InitData(garbageItemPosRotList[index]);
  137. }
  138. //创建数量加1
  139. createNumber++;
  140. }
  141. #endregion
  142. #region 游戏时间
  143. IEnumerator GameTime()
  144. {
  145. while (timer > 0)
  146. {
  147. yield return new WaitForSeconds(1f);
  148. //当游戏时间结束前,游戏胜利可以将timer等于-1
  149. timer--;
  150. if (timer<=0)
  151. timer = 0;
  152. timeTxt.text = "时间:" + timer;
  153. }
  154. //停止所有正在移动的垃圾item和星星动画
  155. StopAllGarbageItemAndStar();
  156. //游戏结束判断
  157. if (score >= sumScore)
  158. {
  159. Debug.Log("时间结束:" + score + " child:" + sumScore);
  160. GameVictory(); //游戏胜利
  161. }
  162. else
  163. GameDefeated(); //游戏失败
  164. }
  165. /// <summary>
  166. /// 游戏胜利
  167. /// </summary>
  168. void GameVictory()
  169. {
  170. //游戏结束
  171. isGameOver = true;
  172. //停止所有正在移动的垃圾item和星星动画
  173. StopAllGarbageItemAndStar();
  174. VictoryAudio(); //胜利音效
  175. //刷新按钮,游戏结束Txt显示
  176. refreshBtn.gameObject.SetActive(true);
  177. gameOverTxt.gameObject.SetActive(true);
  178. gameOverTxt.text = "游戏胜利";
  179. }
  180. /// <summary>
  181. /// 游戏失败
  182. /// </summary>
  183. void GameDefeated()
  184. {
  185. //游戏结束
  186. isGameOver = true;
  187. //停止所有正在移动的垃圾item和星星动画
  188. StopAllGarbageItemAndStar();
  189. DefeatedAudio();//失败音效
  190. //刷新按钮,游戏结束Txt显示
  191. refreshBtn.gameObject.SetActive(true);
  192. gameOverTxt.gameObject.SetActive(true);
  193. gameOverTxt.text = "游戏失败";
  194. }
  195. #endregion
  196. #region 加分(星星效果)
  197. /// <summary>
  198. /// 加分
  199. /// </summary>
  200. /// <param name="pos">垃圾item消失的位置</param>
  201. public void AddScore(Vector3 pos)
  202. {
  203. //获取星星动画,修改位置
  204. Transform star = GetStar();
  205. star.position = pos;
  206. star.gameObject.SetActive(true);
  207. //星星正在播放 添加到列表
  208. moveStarList.Add(star);
  209. }
  210. //获取星星
  211. Transform GetStar()
  212. {
  213. Transform star;
  214. //判断对象池是否存在item
  215. if (starPool.Count > 0)
  216. {
  217. star = starPool[0];
  218. starPool.Remove(star);
  219. }
  220. else
  221. star = Instantiate(starPrefab, starContent);
  222. return star;
  223. }
  224. //星星回收(动画播放完毕后,回收星星到对象池中)由动画关键帧调用
  225. public void RecycleStar(Transform star)
  226. {
  227. /*回收*/
  228. //星星播放结束 从列表移除
  229. moveStarList.Remove(star);
  230. star.gameObject.SetActive(false);
  231. starPool.Add(star);
  232. 加分
  233. //score++;
  234. //scoreTxt.text = "分数:" + score.ToString();
  235. 加时间
  236. //ADDTimer();
  237. 播放音效
  238. //CorrentAudio();
  239. //判断所有垃圾分类完成
  240. if (score >= sumScore)
  241. {
  242. Debug.Log("加分结束胜利:" + score + " child:" + sumScore);
  243. //停止时间协程
  244. StopCoroutine(timerIE);
  245. GameVictory(); //游戏胜利
  246. }
  247. }
  248. /// <summary>
  249. /// 回收所有加分星星
  250. /// </summary>
  251. void RecycleAllStar()
  252. {
  253. for (int i = 0; i < starContent.childCount; i++)
  254. {
  255. Transform star = starContent.GetChild(i);
  256. star.gameObject.SetActive(false);
  257. //对象池中不存在此星星时,回收
  258. if (starPool.IndexOf(star) == -1)
  259. starPool.Add(star);
  260. }
  261. }
  262. #endregion
  263. #region 加减游戏时间
  264. /// <summary>
  265. /// 游戏时间+2秒
  266. /// </summary>
  267. public void ADDTimer()
  268. {
  269. addTimerTxt.text = "时间+2";
  270. addTimerTxt.color = addColor;
  271. addTimerTweener.Restart();
  272. timer += 2;
  273. if (timer >= maxTimer)
  274. timer = maxTimer;
  275. timeTxt.text = "时间:" + timer.ToString();
  276. }
  277. /// <summary>
  278. /// 游戏时间-2秒
  279. /// </summary>
  280. public void SubtractTimer()
  281. {
  282. addTimerTxt.text = "时间-2";
  283. addTimerTxt.color = subtractColor;
  284. addTimerTweener.Restart();
  285. timer -= 2;
  286. if (timer <= 0)
  287. {
  288. timer = 0;
  289. //游戏失败
  290. GameDefeated();
  291. }
  292. timeTxt.text = "时间:" + timer.ToString();
  293. }
  294. #endregion
  295. #region 隐藏并停止所有动画及效果
  296. /// <summary>
  297. /// 隐藏并停止所有垃圾动画效果、星星效果、正在拖拽的物体
  298. /// 防止游戏结束时,
  299. /// </summary>
  300. void StopAllGarbageItemAndStar()
  301. {
  302. if (currentItem != null)
  303. {
  304. currentItem.RestoreOriginPos();
  305. currentItem = null;
  306. }
  307. //循环所有在移动的item
  308. for (int i = 0; i < MoveGarbageList.Count; i++)
  309. MoveGarbageList[i].StopDoTween(); //停止dotween动画
  310. for (int i = 0; i < moveStarList.Count; i++)
  311. {
  312. //隐藏星星
  313. moveStarList[i].gameObject.SetActive(false);
  314. //添加到对象池中
  315. starPool.Add(moveStarList[i]);
  316. }
  317. }
  318. #endregion
  319. #region 音效播放
  320. /// <summary>
  321. /// 正确
  322. /// </summary>
  323. public void CorrentAudio()
  324. {
  325. correntAudio.Play();
  326. }
  327. /// <summary>
  328. /// 错误
  329. /// </summary>
  330. public void ErrorAudio()
  331. {
  332. errorAudio.Play();
  333. }
  334. /// <summary>
  335. /// 胜利
  336. /// </summary>
  337. public void VictoryAudio()
  338. {
  339. victoryAudio.Play();
  340. }
  341. /// <summary>
  342. /// 失败
  343. /// </summary>
  344. public void DefeatedAudio()
  345. {
  346. defeatedAudio.Play();
  347. }
  348. /// <summary>
  349. /// 停止所有音效
  350. /// </summary>
  351. public void StopAllAudio()
  352. {
  353. correntAudio.Stop();
  354. errorAudio.Stop();
  355. victoryAudio.Stop();
  356. defeatedAudio.Stop();
  357. }
  358. #endregion
  359. }

GarbageItem中代码的添加和修改

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.EventSystems;
  5. using UnityEngine.UI;
  6. using DG.Tweening;
  7. /// <summary>
  8. /// 垃圾Item
  9. /// </summary>
  10. public class GarbageItem : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler
  11. {
  12. Vector2 offset; //偏移量
  13. Vector2 oldPos; //鼠标拖拽结束之后的位置
  14. Vector2 originPos; //物体原点位置
  15. RectTransform rect;
  16. Trash trash; //垃圾桶
  17. public Trash Trash { get => trash; set => trash = value; }
  18. #region 组件初始化
  19. void ThisGetCompontent()
  20. {
  21. if (rect == null)
  22. {
  23. rect = GetComponent<RectTransform>();
  24. }
  25. }
  26. #endregion
  27. #region 数据初始化
  28. public void InitData(Vector2 pos)
  29. {
  30. //组件初始化
  31. ThisGetCompontent();
  32. //刷新后 垃圾桶为空
  33. Trash = null;
  34. //位置修改
  35. originPos = pos;
  36. RestoreOriginPos();
  37. //显示
  38. gameObject.SetActive(true);
  39. }
  40. #endregion
  41. //位置还原
  42. public void RestoreOriginPos()
  43. {
  44. rect.anchoredPosition = originPos;
  45. }
  46. //开始拖拽
  47. public void OnBeginDrag(PointerEventData eventData)
  48. {
  49. GarbagePanel.GetInstance().CurrentItem = this;
  50. offset = eventData.position - (Vector2)transform.position;
  51. }
  52. //拖拽
  53. public void OnDrag(PointerEventData eventData)
  54. {
  55. //游戏结束 不执行操作
  56. if (GarbagePanel.GetInstance().isGameOver)
  57. return;
  58. Vector3 pos = eventData.position - offset;
  59. transform.position = new Vector3(Mathf.Clamp(pos.x, 0, Screen.width), Mathf.Clamp(pos.y, 0, Screen.height), 0);
  60. oldPos = eventData.position - offset;
  61. }
  62. //拖拽结束
  63. Tweener tweener;
  64. public void OnEndDrag(PointerEventData eventData)
  65. {
  66. //游戏结束 不执行操作
  67. if (GarbagePanel.GetInstance().isGameOver)
  68. return;
  69. //垃圾桶不为空,代表垃圾进入了垃圾桶
  70. if (trash != null)
  71. {
  72. //判断垃圾与垃圾桶的tag是否相同
  73. if (trash.tag==transform.tag)
  74. {
  75. //Debug.Log("正确,执行位移,并加分");
  76. //加分
  77. GarbagePanel.GetInstance().score++;
  78. GarbagePanel.GetInstance().scoreTxt.text = "分数:" + GarbagePanel.GetInstance().score.ToString();
  79. //加时间
  80. GarbagePanel.GetInstance().ADDTimer();
  81. // 播放音效
  82. GarbagePanel.GetInstance(). CorrentAudio();
  83. //dotween动画正在移动,添加自己
  84. GarbagePanel.GetInstance().MoveGarbageList.Add(this);
  85. //修改垃圾item在2屏的垃圾桶位置
  86. rect.anchoredPosition = originPos;
  87. Debug.Log(rect);
  88. rect.SetParent(GarbagePanel.GetInstance().twoSceneTrashPos);
  89. rect.anchoredPosition = GarbagePanel.GetInstance().TwoSceneTrashPosDic[transform.tag].GetComponent<RectTransform>().anchoredPosition;
  90. tweener = rect.DOAnchorPos(new Vector2(rect.anchoredPosition.x, -14), 1f);
  91. tweener.OnComplete((TweenCallback)delegate
  92. {
  93. //Debug.Log("消失");
  94. //dotween移动结束,移除自己
  95. GarbagePanel.GetInstance().MoveGarbageList.Remove(this);
  96. //加分
  97. GarbagePanel.GetInstance().AddScore(transform.position);
  98. //修改为1屏的父物体
  99. gameObject.SetActive(false);
  100. rect.SetParent((Transform)GarbagePanel.GetInstance().garbageItemContent);
  101. });
  102. }
  103. else
  104. {
  105. //减时间
  106. GarbagePanel.GetInstance().SubtractTimer();
  107. //播放错误音效
  108. GarbagePanel.GetInstance().ErrorAudio();
  109. //垃圾回到原来的位置
  110. rect.anchoredPosition = originPos;
  111. //Debug.Log("错误");
  112. }
  113. }
  114. else
  115. {
  116. //垃圾回到原来的位置
  117. rect.anchoredPosition = originPos;
  118. }
  119. //拖拽结束 设置为空
  120. GarbagePanel.GetInstance().CurrentItem = null;
  121. //加分结束后,垃圾桶设置为空
  122. trash = null;
  123. }
  124. /// <summary>
  125. /// 停止dotween动画
  126. /// </summary>
  127. public void StopDoTween()
  128. {
  129. //dotween移动结束,移除自己
  130. GarbagePanel.GetInstance().MoveGarbageList.Remove(this);
  131. //停止并杀死动画,防止有残留
  132. tweener.Pause();
  133. tweener.Kill();
  134. //隐藏自己,并修改为1屏的父物体
  135. gameObject.SetActive(false);
  136. rect.SetParent(GarbagePanel.GetInstance().garbageItemContent);
  137. }
  138. }

五:package下载

垃圾分类小游戏_unity3d - Unity3D模型_U3D_免费下载-爱给网

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

闽ICP备14008679号