siki学院愤怒的小鸟脚本

ゝ一世哀愁。 2022-05-24 09:38 433阅读 0赞

GameManager.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. public class GameManager : MonoBehaviour {
  6. public List<Bird> birds;//场景中的小鸟作为元素的List,实际上是小鸟物体的Bird组件作为元素
  7. public List<Break> pigs;//场景中的猪作为元素的List,实际上是猪的Break组件作为元素
  8. private bool Win = false,Lose = false;//赢和输状态波尔值
  9. public Vector3 BirdsBornPos;//下一只小鸟出生传送点
  10. private GameObject LoseResult;//输了之后要显示的界面
  11. private GameObject WinResult;//赢了之后要显示的界面
  12. private GameObject BackAppear;//输或赢都显示的背景暗淡,附带有一段Color动画
  13. public GameObject[] Stars;//评分用的三个星星的List
  14. private GameObject pausePanel;//暂停界面
  15. private GameObject pauseButton;//暂停按钮
  16. public static GameManager _instance;//对GameManager的单例化
  17. private int CurrentStars;//临时存储当前关卡过关后获得的星星数
  18. private int sum;//临时使用的整型统计变量
  19. private GameObject LevelResult;//一个Canvas物体
  20. private Camera UIcamera;//专用以渲染UI类物体的摄像机
  21. private void Awake()
  22. {
  23. _instance = this;//单例语句
  24. if (birds.Count > 0) BirdsBornPos = birds[0].gameObject.transform.position;//给小鸟出生瞬移点一个初始值
  25. LevelResult = GameObject.Find("LevelResult");
  26. UIcamera = GameObject.Find("UICamera").GetComponent<Camera>();//一些赋值
  27. BackAppear = LevelResult.transform.Find("BackAppear").gameObject;
  28. //查找active gameobject的hidden child gameobject
  29. WinResult = LevelResult.transform.Find("Win").gameObject;
  30. LoseResult = LevelResult.transform.Find("Lose").gameObject;
  31. BackAppear.transform.SetSiblingIndex(0);
  32. //设置backappear为子物体列表里第一个渲染的(最后面)/通过调整Hierarchy的层级排序也可以确定渲染的顺序,在上的先渲染
  33. pauseButton = GameObject.Find("Pause").transform.Find("pauseButton").gameObject;
  34. pausePanel = GameObject.Find("Pause").transform.Find("pausePanel").gameObject;
  35. //指定暂停按钮和面板物体
  36. Stars[0] = GameObject.Find("LevelResult").transform.Find("Win").transform.Find("Stars").transform.Find("left").gameObject;
  37. Stars[1] = GameObject.Find("LevelResult").transform.Find("Win").transform.Find("Stars").transform.Find("middle").gameObject;
  38. Stars[2] = GameObject.Find("LevelResult").transform.Find("Win").transform.Find("Stars").transform.Find("right").gameObject;
  39. //指定左中右三个胜利星星
  40. Canvas canvas = LevelResult.GetComponent<Canvas>();//先设定rendermode再设定相机
  41. canvas.renderMode= RenderMode.ScreenSpaceCamera;
  42. canvas.worldCamera = UIcamera;
  43. //设置canvas的渲染相机
  44. }
  45. private void Start()
  46. {
  47. Initialize();
  48. //if (BackAppear) Debug.Log("Found");
  49. //查找失败会返回一个空指针,否则是有值的
  50. //else Debug.Log("Missing");
  51. }
  52. public void Initialize()//重新对小鸟们的属性控制
  53. {
  54. for(int i = 0; i < birds.Count; i++)
  55. {
  56. if (i == 0)
  57. {
  58. birds[i].gameObject.transform.position = BirdsBornPos;
  59. birds[i].enabled = true;//对于component的可用性使用enabled
  60. birds[i].sp.enabled = true;//启用弹簧
  61. }
  62. else
  63. {
  64. birds[i].enabled = false;
  65. birds[i].sp.enabled = false;
  66. }
  67. }
  68. }
  69. public void JudgeLevelResult()
  70. {
  71. if (Win == false&&pigs.Count == 0)
  72. {
  73. Win = true;
  74. WinResult.SetActive(true);//对于gameobject的可用性使用setactive
  75. BackAppear.SetActive(true);
  76. StartCoroutine("ShowStars");//协程显示星星
  77. }
  78. if (Lose == false&&pigs.Count > 0 && birds.Count == 0)
  79. {
  80. Lose = true;
  81. LoseResult.SetActive(true);
  82. BackAppear.SetActive(true);//背景逐渐变黑,实质上是BackAppear物体的激活,关于它的动画是自动播放的
  83. }
  84. }
  85. IEnumerator ShowStars()
  86. {
  87. for(CurrentStars = 0; CurrentStars < birds.Count&&CurrentStars<3; CurrentStars++)//显示星星不超过3个并且显示星星数是剩余小鸟的数量加一
  88. {
  89. yield return new WaitForSeconds(0.5f);//每个星星显示的间隔
  90. Stars[CurrentStars].SetActive(true);
  91. }
  92. SaveData();//显示完星星存储一下关卡星星的数据
  93. }
  94. private void SaveData()
  95. {
  96. if (CurrentStars > PlayerPrefs.GetInt(PlayerPrefs.GetString("CurrentTheme")+ PlayerPrefs.GetString("CurrentLevel")))//只有刷新过往记录才执行存储
  97. {
  98. PlayerPrefs.SetInt(PlayerPrefs.GetString("CurrentTheme")+PlayerPrefs.GetString("CurrentLevel"), CurrentStars);//向对应的“目前地图+目前关卡”键值存整型值
  99. }
  100. switch (PlayerPrefs.GetString("CurrentTheme"))//分类讨论
  101. {
  102. case "T1":
  103. sum = 0;
  104. for(int i = 1; i <= 12; i++)
  105. {
  106. sum += PlayerPrefs.GetInt("T1"+"level"+i);
  107. }
  108. break;
  109. case "T2":
  110. sum = 0;
  111. for (int i = 1; i <= 12; i++)
  112. {
  113. sum += PlayerPrefs.GetInt("T1" + "level" + i);
  114. }
  115. for (int i = 1; i <= 8; i++)
  116. {
  117. sum += PlayerPrefs.GetInt("T2"+"level" + i);
  118. }
  119. break;
  120. case "T3":
  121. sum = 0;
  122. for (int i = 1; i <= 12; i++)
  123. {
  124. sum += PlayerPrefs.GetInt("T1" + "level" + i);
  125. }
  126. for (int i = 1; i <= 8; i++)
  127. {
  128. sum += PlayerPrefs.GetInt("T2" + "level" + i);
  129. }
  130. for (int i = 1; i <= 1; i++)
  131. {
  132. sum += PlayerPrefs.GetInt("T3"+"level" + i);
  133. }
  134. break;//遍历已解锁的地图的所有关卡的星星数
  135. }
  136. PlayerPrefs.SetInt("CollectedNum", sum);//保存已收集星星总数,赋值计算好的sum
  137. }
  138. public void Pause()
  139. {
  140. Time.timeScale = 0;//控制时间速度为零
  141. pauseButton.SetActive(false);//隐藏暂停按钮
  142. pausePanel.SetActive(true);//显示暂停面板
  143. }
  144. public void Resume()
  145. {
  146. Time.timeScale = 1;//恢复时间速度
  147. pausePanel.SetActive(false);//逆着操作上两步
  148. pauseButton.SetActive(true);
  149. }
  150. public void BacktoLevelMenu()
  151. {
  152. //LoadSceneAsync和LoadScene延迟那么一小点时间,用来避免场景装载的速度过慢影响玩家体验
  153. SceneManager.LoadSceneAsync("002-levels");//装载levels场景
  154. if (PlayerPrefs.GetString("CurrentTheme") == "T1")
  155. {
  156. GameObject.Find("Canvas").transform.Find("Map").gameObject.SetActive(false);
  157. GameObject.Find("Canvas").transform.Find("LevelsPanel-1").gameObject.SetActive(true);
  158. }
  159. else if(PlayerPrefs.GetString("CurrentTheme") == "T2")
  160. {
  161. GameObject.Find("Canvas").transform.Find("Map").gameObject.SetActive(false);
  162. GameObject.Find("Canvas").transform.Find("LevelsPanel-2").gameObject.SetActive(true);
  163. }
  164. else if (PlayerPrefs.GetString("CurrentTheme") == "T3")
  165. {
  166. GameObject.Find("Canvas").transform.Find("Map").gameObject.SetActive(false);
  167. GameObject.Find("Canvas").transform.Find("LevelsPanel-3").gameObject.SetActive(true);
  168. }
  169. else
  170. {
  171. }
  172. }
  173. public void RestartThisLevel()
  174. {
  175. SceneManager.LoadSceneAsync("003-game");//重新装载当前场景
  176. Time.timeScale = 1;
  177. }
  178. public void EnterGame()
  179. {
  180. GameObject.Find("Canvas").transform.Find("Start").gameObject.SetActive(false);//开始游戏按钮
  181. GameObject.Find("Canvas").transform.Find("hint").gameObject.SetActive(true);//加载游戏的文字提示
  182. Invoke("LoadMapsMenu",2.2f);//有一个假装loading的等待时间哈哈
  183. }
  184. private void LoadMapsMenu()
  185. {
  186. SceneManager.LoadSceneAsync("002-levels");
  187. }
  188. public void ShowReadme()
  189. {
  190. GameObject.Find("Canvas").transform.Find("ReadMe").gameObject.SetActive(true);//一张说明图片
  191. GameObject.Find("Canvas").transform.Find("ReadButton").gameObject.SetActive(false);//“如何玩”按钮
  192. GameObject.Find("Canvas").transform.Find("Iknew").gameObject.SetActive(true);//“嗯嗯”按钮
  193. }
  194. public void HideReadme()//和ShowReadme功能相反
  195. {
  196. GameObject.Find("Canvas").transform.Find("ReadMe").gameObject.SetActive(false);
  197. GameObject.Find("Canvas").transform.Find("ReadButton").gameObject.SetActive(true);
  198. GameObject.Find("Canvas").transform.Find("Iknew").gameObject.SetActive(false);
  199. }
  200. public void Quit()//退出游戏程序
  201. {
  202. Application.Quit();
  203. }
  204. }

Bird.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Bird : MonoBehaviour {
  5. private bool isClick = false;//正在点击
  6. protected bool dead = false;
  7. private bool CanControlCamera = true;//当前是否可以通过方向键控制相机
  8. private Transform stickMidPos;//两个发射树杈的中间点
  9. public GameObject burst;//小鸟死亡的烟雾动画
  10. public float maxDistance = 1.8f;//拖拽小鸟的最大限制距离
  11. private bool CanClick = true;//可以拖动小鸟
  12. [HideInInspector]public SpringJoint2D sp;//小鸟的弹簧组件
  13. protected Rigidbody2D rg;//小鸟的刚体组件
  14. protected SpriteRenderer SR;//小鸟的图片渲染组件
  15. public Sprite Wait,Selected,Launched,Skilling,Injured;//等待、被点击、被发射、施展技能、受伤 各种状态的小鸟图片
  16. private bool lockrotation = true;//锁定小鸟的旋转角度
  17. private LineRenderer LauchStick_rightPoint_LineRenderer;//左右树杈两个画线渲染组件
  18. private LineRenderer LauchStick_leftPoint_LineRenderer;
  19. private Transform LauchStick_rightPosition;//左右两个树杈枝头的位置
  20. private Transform LauchStick_leftPosition;
  21. private Trail ItsTrail;//拖尾脚本组件
  22. private bool CanUseSkill;//可以使用技能
  23. public AudioClip birdClickSound;//小鸟被点击(选择)的声音
  24. public AudioClip birdFlySound;//小鸟被弹射瞬间的声音
  25. public float CameraSmooth = 3;//镜头跟随的平滑度
  26. private float BirdPosX;//用来存储鸟的x坐标
  27. public static Bird _instance;//Bird脚本的单例
  28. private void Awake()
  29. {
  30. _instance = this;//单例方法
  31. Camera.main.transform.position = new Vector3(1, Camera.main.transform.position.y, Camera.main.transform.position.z);//每个小鸟上弹射架的瞬间相机位置都强制被设置为一个初始位置
  32. sp = GetComponent<SpringJoint2D>();
  33. rg = GetComponent<Rigidbody2D>();//各种组件变量的赋初值
  34. SR = GetComponent<SpriteRenderer>();
  35. if(sp.enabled==false)SR.sprite = Wait;//若弹簧组件为禁用,小鸟的图像为等待状态,这时小鸟躺在地上
  36. LauchStick_rightPoint_LineRenderer = GameObject.Find("rightPos").GetComponent<LineRenderer>();
  37. LauchStick_leftPoint_LineRenderer = GameObject.Find("leftPos").GetComponent<LineRenderer>();
  38. LauchStick_rightPosition = GameObject.Find("rightPos").transform;
  39. LauchStick_leftPosition = GameObject.Find("leftPos").transform;
  40. ItsTrail = GetComponent<Trail>();
  41. stickMidPos = GameObject.Find("midPos").transform;
  42. }
  43. private void OnMouseDown()//每当按下鼠标
  44. {
  45. if (CanClick)//在可以拖动小鸟的时候
  46. {
  47. LauchStick_rightPoint_LineRenderer.enabled = true;//两个画线组件激活
  48. LauchStick_leftPoint_LineRenderer.enabled = true;
  49. SR.sprite = Selected;//小鸟图像变化
  50. AudioSource.PlayClipAtPoint(birdClickSound, Camera.main.transform.position);//播放点击音效
  51. CanControlCamera = false;//这时不能通过方向键控制相机
  52. isClick = true;//正在点击
  53. rg.isKinematic = true;//此时小鸟的运动只受到脚本的控制
  54. CanUseSkill = false;//不能使用技能
  55. }
  56. }
  57. private void OnMouseUp()//鼠标抬起
  58. {
  59. isClick = false;
  60. //禁用划线
  61. LauchStick_rightPoint_LineRenderer.enabled = false;
  62. LauchStick_leftPoint_LineRenderer.enabled = false;
  63. ItsTrail.ShowTrail();//开始显示拖尾
  64. rg.isKinematic = false;//恢复动力学影响
  65. lockrotation = false;//不锁镜头
  66. if (CanClick) {
  67. CanUseSkill = true;
  68. AudioSource.PlayClipAtPoint(birdFlySound,Camera.main.transform.position);
  69. SR.sprite = Launched;
  70. Invoke("Fly", 0.1f);//加一点延迟不然飞不出去
  71. }
  72. CanClick = false;//这时不能再拖动小鸟
  73. }
  74. private void Update()
  75. {
  76. if (CanUseSkill)//使用技能
  77. {
  78. if (Input.GetMouseButtonDown(0))
  79. {
  80. UseSkill();//释放技能并改变图片
  81. SR.sprite = Skilling;
  82. }
  83. }
  84. //锁定角度
  85. if (lockrotation) transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);
  86. if (isClick&&CanClick)//拖动小鸟
  87. {
  88. transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition)+new Vector3(0,0,10);
  89. if (Vector3.Distance(transform.position, stickMidPos.position) > maxDistance)//限制拖动长度
  90. {
  91. Vector3 e_pos = (transform.position - stickMidPos.position).normalized;
  92. transform.position = stickMidPos.position + maxDistance * e_pos;
  93. }
  94. DrawLauchStickLine();
  95. }
  96. //镜头跟随
  97. BirdPosX = GameManager._instance.birds[0].transform.position.x;//在update里每帧更新鸟的x坐标
  98. if(CanControlCamera==false)Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position,//将第一个Vector3坐标参数按照第三个参数的平滑度过渡到第二个Vector3坐标参数
  99. new Vector3(Mathf.Clamp(BirdPosX,1,39),//将摄像机坐标限制在1-39,当BirdPosX在这个范围,Vector3的第一个参数才有效
  100. Camera.main.transform.position.y,
  101. Camera.main.transform.position.z),
  102. CameraSmooth);
  103. //镜头控制
  104. if (CanControlCamera&&Input.GetKey(KeyCode.LeftArrow)&&Camera.main.transform.position.x>=1.15)
  105. {
  106. Camera.main.transform.position = new Vector3(Camera.main.transform.position.x-0.15f, Camera.main.transform.position.y,Camera.main.transform.position.z);
  107. //Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position,new Vector3(Camera.main.transform.position.x - 2, Camera.main.transform.position.y, Camera.main.transform.transform.position.z), CameraSmooth);
  108. }
  109. else if (CanControlCamera&&Input.GetKey(KeyCode.RightArrow)&&Camera.main.transform.position.x<38.85)
  110. {
  111. Camera.main.transform.position = new Vector3(Camera.main.transform.position.x + 0.15f, Camera.main.transform.position.y, Camera.main.transform.position.z);
  112. //Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, new Vector3(Camera.main.transform.position.x + 2, Camera.main.transform.position.y, Camera.main.transform.transform.position.z), CameraSmooth);
  113. }
  114. }
  115. void Fly()
  116. {
  117. sp.enabled = false;//弹簧组建取消
  118. Invoke("Dead", 5f);//飞出5秒后强制死亡
  119. }
  120. void DrawLauchStickLine()
  121. {
  122. LauchStick_leftPoint_LineRenderer.SetPosition(0,transform.position);
  123. LauchStick_leftPoint_LineRenderer.SetPosition(1, LauchStick_leftPosition.position);
  124. LauchStick_rightPoint_LineRenderer.SetPosition(0, transform.position);//通过给定一个画线组件的坐标点位置来画线
  125. LauchStick_rightPoint_LineRenderer.SetPosition(1, LauchStick_rightPosition.position);
  126. }
  127. public void RemoveBird()
  128. {
  129. dead = true;
  130. GameManager._instance.birds.Remove(this);
  131. Destroy(gameObject);//在从数组中移除后再实际摧毁它,如果物体已经被摧毁从数组中移除就会不可行
  132. if (GameManager._instance.birds.Count != 0) GameManager._instance.Initialize();//当还有鸟时初始化小鸟状态
  133. GameManager._instance.JudgeLevelResult();
  134. lockrotation = true;
  135. CanControlCamera = true;//可以自由控制相机观察场景
  136. CanClick = true;//可以拖动下一个小鸟
  137. Camera.main.transform.position = new Vector3(1, Camera.main.transform.position.y, Camera.main.transform.position.z);
  138. }
  139. public void Dead()
  140. {
  141. gameObject.SetActive(false);//在此先隐藏这个鸟
  142. if (dead == false)//这个条件是为了防止黑鸟爆炸后仍然播放小烟雾
  143. {
  144. Instantiate(burst, transform.position, Quaternion.identity);
  145. }
  146. Invoke("RemoveBird", 1.5f);//从播放烟雾到实际移除的延迟
  147. }
  148. private void OnCollisionEnter2D(Collision2D collision)
  149. {
  150. ItsTrail.CloseTrail();//当碰到任何物体时小鸟不再显示拖尾
  151. if(collision.gameObject.tag=="ground")CanUseSkill = false;//小鸟的技能只能在为接触到地面上时触发
  152. if (collision.relativeVelocity.magnitude > 3.0&&collision.gameObject.tag!="bird")//一定的相对速度导致小鸟受伤
  153. {
  154. SR.sprite = Injured;
  155. }
  156. }
  157. public virtual void UseSkill()
  158. {
  159. CanUseSkill = false;//每个小鸟活着的时候只能使用一次技能
  160. }
  161. }

Break.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Break : MonoBehaviour {
  5. public float DeadSpeed;
  6. public float minSpeed;
  7. private SpriteRenderer state_image;
  8. public Sprite hurt;
  9. public GameObject burst;
  10. public AudioClip hurtSound;
  11. public AudioClip destroySound;
  12. public GameObject purplescore3000;
  13. private void Awake()
  14. {
  15. state_image = GetComponent<SpriteRenderer>();//获取一下图片渲染组件
  16. }
  17. private void OnCollisionEnter2D(Collision2D collision)
  18. {
  19. if (collision.relativeVelocity.magnitude > DeadSpeed)//当碰撞相对速度大于死亡速度直接死亡
  20. {
  21. if(gameObject.name == "TNT")//对于TNT建筑物体执行爆破函数
  22. {
  23. gameObject.GetComponent<TNT>().Explode();
  24. }
  25. DeadPig();//敌人死亡
  26. AudioSource.PlayClipAtPoint(destroySound,Camera.main.transform.position);
  27. }
  28. else if (collision.relativeVelocity.magnitude > minSpeed && collision.relativeVelocity.magnitude < DeadSpeed)//relative.magnitude相对速度的量化
  29. {
  30. //改猪的sprite为受伤状态
  31. state_image.sprite = hurt;
  32. AudioSource.PlayClipAtPoint(hurtSound,Camera.main.transform.position);
  33. }
  34. }
  35. public void DeadPig()
  36. {
  37. Destroy(gameObject);//先摧毁这个物体
  38. GameObject tempscore = Instantiate(purplescore3000,transform.position+new Vector3(0f,1f,0f),Quaternion.identity);//显示分数图片
  39. Destroy(tempscore, 1.2f);//分数浮一会儿就消失
  40. GameManager._instance.pigs.Remove(this);//从GameManager的pigs组里移除对应元素
  41. Instantiate(burst,transform.position,Quaternion.identity);//死亡烟雾
  42. GameManager._instance.JudgeLevelResult();
  43. }
  44. }

MapSelect.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class MapSelect : MonoBehaviour {
  6. public int StarsRequireNum = 0;//开启这个关卡需要的星星总数
  7. private bool CanSelectThisMap = false;//控制关卡是否可以选择的波尔变量
  8. private int sum;//临时用来统计加法运算和的变量
  9. public GameObject locked;//地图图片的锁图像
  10. public GameObject starDisplay;//每个地图图片上伴随的大星星和一个解锁要求星星数量
  11. private void Start()
  12. {
  13. //PlayerPrefs.DeleteAll();这句用来清除所有经过PlayerPrefs语句保存的键值对数据
  14. switch (gameObject.name)
  15. {
  16. case "map1":
  17. sum = 0;
  18. for (int i = 1; i <= 12; i++)
  19. {
  20. sum += PlayerPrefs.GetInt("T1" + "level" + i);
  21. }
  22. gameObject.transform.Find("star").transform.Find("starscount").GetComponent<Text>().text = sum + "/36";//控制已获得的星星数量显示
  23. break;
  24. case "map2":
  25. sum = 0;
  26. for (int i = 1; i <= 8; i++)
  27. {
  28. sum += PlayerPrefs.GetInt("T2" + "level" + i);
  29. }
  30. gameObject.transform.Find("star").transform.Find("starscount").GetComponent<Text>().text = sum + "/24";
  31. break;
  32. case "map3":
  33. sum = 0;
  34. for (int i = 1; i <= 1; i++)
  35. {
  36. sum += PlayerPrefs.GetInt("T3" + "level" + i);
  37. }
  38. gameObject.transform.Find("star").transform.Find("starscount").GetComponent<Text>().text = sum + "/3";
  39. break;
  40. }
  41. if(PlayerPrefs.GetInt("CollectedNum") >= StarsRequireNum)
  42. {
  43. //当已收集的星星数量不小于地图要求的数量就执行解锁代码
  44. locked.SetActive(false);
  45. starDisplay.SetActive(true);
  46. CanSelectThisMap = true;
  47. }
  48. else
  49. {
  50. locked.SetActive(true);
  51. starDisplay.SetActive(false);
  52. CanSelectThisMap = false;
  53. }
  54. //print(PlayerPrefs.GetInt("CollectedNum"));//这一句用来调试
  55. }
  56. public void SelectedMap()
  57. {
  58. if (CanSelectThisMap)
  59. {
  60. //用来隐藏地图选择界面并显示对应的关卡界面
  61. if (gameObject.name == "map1")
  62. {
  63. gameObject.transform.parent.parent.transform.Find("LevelsPanel-1").gameObject.SetActive(true);
  64. PlayerPrefs.SetString("CurrentTheme","T1");
  65. }
  66. else if (gameObject.name == "map2") {
  67. gameObject.transform.parent.parent.transform.Find("LevelsPanel-2").gameObject.SetActive(true);
  68. PlayerPrefs.SetString("CurrentTheme","T2");
  69. }
  70. else if (gameObject.name == "map3"){
  71. gameObject.transform.parent.parent.transform.Find("LevelsPanel-3").gameObject.SetActive(true);
  72. PlayerPrefs.SetString("CurrentTheme","T3");
  73. }
  74. else if(gameObject.name == "map_more")
  75. {
  76. Debug.Log("暂未开发");
  77. }
  78. transform.parent.gameObject.SetActive(false);
  79. }
  80. }
  81. }

LevelSelect.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using UnityEngine.SceneManagement;
  6. public class LevelSelect : MonoBehaviour {
  7. private bool CanEnter = false;//每个关卡按钮有一个“可进入”波尔值
  8. public Sprite LockImage;//锁的图像
  9. public Sprite UnlockImage;//没锁的图像
  10. public Sprite nostar,onestar,twostar,fullstar;//小星星的图像,和按钮相联,和保存的关卡星星数值同步
  11. private void Start () {
  12. if (int.Parse(gameObject.transform.Find("num").GetComponent<Text>().text) == 1)//每个主题的关卡一都为开启状态
  13. {
  14. CanEnter = true;
  15. }
  16. else if(PlayerPrefs.GetInt( PlayerPrefs.GetString("CurrentTheme")+"level" + (int.Parse(gameObject.transform.Find("num").GetComponent<Text>().text) -1) ) > 0)//如果上一关星星数不为零,此关卡可进入
  17. {
  18. CanEnter = true;
  19. }
  20. if (CanEnter)
  21. {
  22. gameObject.GetComponent<Image>().sprite = UnlockImage;//对于可进入的关卡,按钮样貌会改变
  23. gameObject.transform.Find("starsGot").gameObject.SetActive(true);
  24. gameObject.transform.Find("num").gameObject.SetActive(true);
  25. switch (PlayerPrefs.GetInt(PlayerPrefs.GetString("CurrentTheme")+gameObject.name))
  26. {
  27. case 0://根据关卡星星数控制小星星图像的选择性显示
  28. gameObject.transform.Find("starsGot").gameObject.GetComponent<Image>().sprite = nostar;
  29. break;
  30. case 1:
  31. gameObject.transform.Find("starsGot").gameObject.GetComponent<Image>().sprite = onestar;
  32. break;
  33. case 2:
  34. gameObject.transform.Find("starsGot").gameObject.GetComponent<Image>().sprite = twostar;
  35. break;
  36. case 3:
  37. gameObject.transform.Find("starsGot").gameObject.GetComponent<Image>().sprite = fullstar;
  38. break;
  39. default:
  40. break;
  41. }
  42. }
  43. else
  44. {//锁上时的图像变化
  45. gameObject.GetComponent<Image>().sprite = LockImage;
  46. gameObject.transform.Find("starsGot").gameObject.SetActive(false);
  47. gameObject.transform.Find("num").gameObject.SetActive(false);
  48. }
  49. }
  50. public void BackToMapMenu()
  51. {//返回地图选择界面,使用transform.parent方法调用父对象
  52. gameObject.transform.parent.parent.gameObject.SetActive(false);
  53. gameObject.transform.parent.parent.parent.Find("Map").gameObject.SetActive(true);
  54. }
  55. public void LevelSelected()
  56. {
  57. if (CanEnter)
  58. {
  59. PlayerPrefs.SetString("CurrentLevel",gameObject.name);//改变当前关卡的数值,每个按钮游戏物体的名字都是“levelxx”
  60. SceneManager.LoadSceneAsync("003-game");//进入实际游戏
  61. }
  62. }
  63. }

Burst.cs

用在烟雾动画上

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Burst : MonoBehaviour {
  5. public void Destroying()
  6. {
  7. Destroy(gameObject);//给Burst脚本的特定摧毁物体方法,在动画的最后一帧执行
  8. }
  9. }

BlackBird.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Black_bird : Bird {
  5. public List<Break> blocks = new List<Break>();//用来存储黑鸟检测范围内的可摧毁对象,实际上存的是Break组件
  6. public GameObject burst3;//黑鸟专用的爆炸动画
  7. public AudioClip boom;//一个爆炸声
  8. public override void UseSkill()//继承Bird里的UseSkill方法
  9. {
  10. base.UseSkill();
  11. AudioSource.PlayClipAtPoint(boom,Camera.main.transform.position);
  12. if (blocks != null && blocks.Count > 0)//摧毁黑鸟杀伤范围内的所有物体(执行blocks组里每个元素的Dead方法)
  13. {
  14. for(int i = 0; i < blocks.Count; i++)
  15. {
  16. blocks[i].DeadPig();
  17. }
  18. }
  19. gameObject.SetActive(false);//在此先隐藏这个鸟
  20. if(dead==false)Instantiate(burst3, transform.position, Quaternion.identity);
  21. dead = true;
  22. }
  23. private void OnTriggerEnter2D(Collider2D collision)//通过一个大圆形状的Trigger Collider动态的控制blocks组里的元素
  24. {
  25. if (collision.gameObject.tag == "pig" || collision.gameObject.tag == "wood")
  26. {
  27. blocks.Add(collision.gameObject.GetComponent<Break>());
  28. //Debug.Log("添加了一个周围物体");
  29. }
  30. }
  31. private void OnTriggerExit2D(Collider2D collision)
  32. {
  33. if (collision.gameObject.tag == "pig" || collision.gameObject.tag == "wood")
  34. {
  35. blocks.Remove(collision.gameObject.GetComponent<Break>());
  36. //Debug.Log("离开了一个周围物体");
  37. }
  38. }
  39. }

GreenBird.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class GreenBird : Bird {
  5. public override void UseSkill()
  6. {
  7. base.UseSkill();
  8. rg.velocity = new Vector2(-rg.velocity.x,rg.velocity.y);//技能是横轴的分速度反向
  9. SR.flipX=true;//鸟的图像横向反转
  10. }
  11. }

YellowBird.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class YellowBird : Bird {
  5. public override void UseSkill()
  6. {
  7. base.UseSkill();
  8. rg.velocity *= 2;//黄鸟的技能是刚体速度加倍,嗖的一下飞出去
  9. }
  10. }

LoadLevel.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class LoadLevel : MonoBehaviour
  5. {
  6. private void Awake()
  7. {
  8. Instantiate(Resources.Load(PlayerPrefs.GetString("CurrentTheme") + PlayerPrefs.GetString("CurrentLevel")));//在Resources素材文件夹里根据“当前地图名+当前关卡名”读取预存的游戏关卡场景,
  9. //关卡预制体的文件名都是“Txlevelxx”
  10. }
  11. }

setting.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class setting : MonoBehaviour {
  5. void Start () {
  6. if(gameObject.name == "BackAppear")
  7. {
  8. gameObject.GetComponent<RectTransform>().sizeDelta = new Vector2(1240,600);//用以控制所有关卡判断结果时显示的背景暗淡图片的大小,因为当时关卡预制体已经做好了,手动调整太麻烦
  9. }
  10. Screen.SetResolution(1234,530,true);//设置游戏窗口为一个特定的值并全屏显示,因为并不懂如何做到屏幕自适应并保持比例合适,从一开始开发就没有想到这个问题
  11. }
  12. }

TNT.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class TNT : MonoBehaviour {
  5. //和blackbird脚本差不多
  6. public List<Break> blocks = new List<Break>();
  7. public GameObject burst3;
  8. public void Explode()
  9. {
  10. if (blocks != null && blocks.Count > 0)
  11. {
  12. for (int i = 0; i < blocks.Count; i++)
  13. {
  14. blocks[i].DeadPig();
  15. }
  16. }
  17. gameObject.SetActive(false);//在此先隐藏这个鸟
  18. }
  19. private void OnTriggerEnter2D(Collider2D collision)
  20. {
  21. if (collision.gameObject.tag == "pig" || collision.gameObject.tag == "wood")
  22. {
  23. blocks.Add(collision.gameObject.GetComponent<Break>());
  24. //Debug.Log("添加了一个周围物体");
  25. }
  26. }
  27. private void OnTriggerExit2D(Collider2D collision)
  28. {
  29. if (collision.gameObject.tag == "pig" || collision.gameObject.tag == "wood")
  30. {
  31. blocks.Remove(collision.gameObject.GetComponent<Break>());
  32. //Debug.Log("离开了一个周围物体");
  33. }
  34. }
  35. }

Trail.cs

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Trail : MonoBehaviour {
  5. //一个复制挪用来的刀光残影效果插件,改了改变成小鸟拖尾效果
  6. public WeaponTrail myTrail;
  7. private float t = 0.033f;
  8. private float tempT = 0;
  9. private float animationIncrement = 0.003f;
  10. void Start()
  11. {
  12. // 默认没有拖尾效果
  13. myTrail.SetTime(0.0f, 0.0f, 1.0f);
  14. }
  15. public void ShowTrail()
  16. {
  17. //设置拖尾时长
  18. myTrail.SetTime(0.5f, 0.0f, 1.0f);
  19. //开始进行拖尾
  20. myTrail.StartTrail(0.5f, 0.4f);
  21. }
  22. public void CloseTrail()
  23. {
  24. //清除拖尾
  25. myTrail.ClearTrail();
  26. }
  27. void LateUpdate()
  28. {
  29. t = Mathf.Clamp(Time.deltaTime, 0, 0.066f);
  30. if (t > 0)
  31. {
  32. while (tempT < t)
  33. {
  34. tempT += animationIncrement;
  35. if (myTrail.time > 0)
  36. {
  37. myTrail.Itterate(Time.time - t + tempT);
  38. }
  39. else
  40. {
  41. myTrail.ClearTrail();
  42. }
  43. }
  44. tempT -= t;
  45. if (myTrail.time > 0)
  46. {
  47. myTrail.UpdateTrail(Time.time, t);
  48. }
  49. }
  50. }
  51. }

发表评论

表情:
评论列表 (有 0 条评论,433人围观)

还没有评论,来说两句吧...

相关阅读

    相关 愤怒小鸟 Day 1

    目录 1.资源导入,场景简单搭建 2. springjoint组建介绍 3. 小鸟的拖拽 4.拖拽距离最大限定 5.小鸟的飞出 6.猪的受伤 7.弹弓划线操作

    相关 愤怒小鸟 Day 2

    目录 1.游戏逻辑的判定,实现多只小鸟的飞出 2.解决重复划线,小鸟轮换速度突然变大的问题 3.添加小鸟飞出的拖尾效果 4.整合场景,解决无法显示划线弹弓的问题 5.

    相关 愤怒小鸟 Day 3

    目录 1.添加镜头跟随 2.音乐的添加 3.添加黄色小鸟 4.添加绿色的小鸟 5.添加黑色小鸟 6.处理黑色小鸟的爆炸问题 7.处理星星数组越界的问题 8.制作