unity中其实很多东西都是在使用的过程中慢慢积累的,今天我们就来学习U3D实战之CandyCrush。

下图是一种颜色的糖果属性面板。

                       

代码控制如下:
  1. //控制生成糖果的类型
  2. private int candyTypeNumber = 7;
  3. //生成糖果材质素材
  4. public GameObject[] BGs;
  5. private GameObject bg;
  6. //指示糖果的颜色
  7. public int type;
  8. //生成对GameController的引用
  9. public GameController gameController;
  10. private SpriteRenderer sr;
  11. //生成随机颜色的糖果
  12. private void AddRandomBG()
  13. {
  14. //如果糖果已有颜色,就不再生成
  15. if (bg != null)
  16. return;
  17. //随机生成一种颜色的糖果
  18. type = Random.Range(0, Mathf.Min(candyTypeNumber,BGs.Length));
  19. bg = (GameObject)Instantiate(BGs[type]);
  20. sr = bg.GetComponent<SpriteRenderer>();
  21. bg.transform.parent = this.transform;
  22. }
需要注意的是,在这里面并不是我们共有多少种类型的糖果就随机在这里面取值,因为如果类型过多,新生成的糖果有可能无法和原有的糖果进行匹配消除,导致玩家到最后是消无可消的情况。这个值要通过实际情况来确定,在我的代码中,我的取值为 candyTypeNumber = 7。
在生成所有的糖果时,我们还需要检查是否在刚生成时就有糖果可以匹配消除。其中检查是否有匹配情况分为同行的检查和同的检查,方法如下:
  1. //返回布尔值,显示是否能够交换
  2. private bool CheckMatches()
  3. {
  4. return CheckHotizontalMatches() || ChecVerticalMatches();
  5. }
这两种方法比较类似,我们只介绍在同一行的情况,也就是水平方向的检查,垂直方向与此类似:
  1. //检查水平方向是否有可以消除的
  2. private bool CheckHotizontalMatches()
  3. {
  4. bool result = false;
  5. for (int rowIndex = 0; rowIndex < rowNumber; rowIndex++)
  6. {
  7. for (int columnIndex = 0; columnIndex < columnNumber - 2; columnIndex++)
  8. {
  9. if ((GetCandy(rowIndex, columnIndex).type == GetCandy(rowIndex, columnIndex + 1).type) &&
  10. (GetCandy(rowIndex, columnIndex + 1).type == GetCandy(rowIndex, columnIndex + 2).type))
  11. {
  12. //播放匹配音效
  13. audio.PlayOneShot(mathThreeClip);
  14. result = true;
  15. Debug.Log(columnIndex + "" + columnIndex + 1 + "" + columnIndex + 2);
  16. AddMatches(GetCandy(rowIndex, columnIndex));
  17. AddMatches(GetCandy(rowIndex, columnIndex + 1));
  18. AddMatches(GetCandy(rowIndex, columnIndex + 2));
  19. }
  20. }
  21. }
  22. return result;
  23. }
在这里面,实现的主要功能是,对于每一行的糖果,检查它们是否有三个或三个以上的糖果类型是一样的,如果有这样的情况发生,那么我们就把这样的糖果放在匹配数组中去,匹配数组用来统一处理同类型糖果的消除。
今天就先到这里,代码有点多,我写的也有点乱,不过只要了解大概的思想就可以了,毕竟这不是唯一的方法,实现起来是多种多样的。谢谢大家的阅读!