愤怒的小鸟 Day 3

秒速五厘米 2022-04-12 13:55 336阅读 0赞

目录

1.添加镜头跟随

2.音乐的添加

3.添加黄色小鸟

4.添加绿色的小鸟

5.添加黑色小鸟

6.处理黑色小鸟的爆炸问题

7.处理星星数组越界的问题

8.制作选择地图UI界面

10.制作关卡选择界面

11.添加地图选择和关卡选择界面的交互

12.存储关卡星星数据

13.关卡选择,场景跳转


1.添加镜头跟随

在Bird中添加相机跟随的脚本

  1. //相机跟随
  2. float posX = transform.position.x;
  3. Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, new Vector3(Mathf.Clamp(posX, 0, 15), Camera.main.transform.position.y, Camera.main.transform.position.z),smooth*Time.deltaTime);

运行程序,结果如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70

2.音乐的添加

在Bird脚本中添加音乐的代码

  1. public AudioClip select;
  2. public AudioClip fly;
  3. public void AudioPlay(AudioClip clip)
  4. {
  5. AudioSource.PlayClipAtPoint(clip, transform.position);
  6. }

然后在合适的地方进行引用

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 1watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 2

同样的在Pig脚本中进行相同的操作

  1. public AudioClip hurtClip;
  2. public AudioClip dead;
  3. public AudioClip birdCollision;
  4. public void AudioPlay(AudioClip clip)
  5. {
  6. AudioSource.PlayClipAtPoint(clip, transform.position);
  7. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 3

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 4

3.添加黄色小鸟

20181205202600720.png

修改Bird代码

  1. private bool isFly;
  2. /// <summary>
  3. /// 释放技能的操作
  4. /// </summary>
  5. public virtual void ShowSkill()
  6. {
  7. isFly = false;
  8. }

添加YellowBird脚本继承Bird脚本,然后重写ShowSkill方法

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class YellowBird : Bird {
  5. /// <summary>
  6. /// 重写方法
  7. /// </summary>
  8. public override void ShowSkill()
  9. {
  10. base.ShowSkill();
  11. rg.velocity *= 2;
  12. }
  13. }

4.添加绿色的小鸟

20181205205644780.png

添加GreenBird脚本继承Bird脚本,然后重写ShowSkill方法

  1. public override void ShowSkill()
  2. {
  3. base.ShowSkill();
  4. Vector3 speed = rg.velocity;
  5. speed.x *= -1;
  6. rg.velocity = speed;
  7. }

然后给小鸟们添加受伤的图片

  1. public Sprite hurt;
  2. private SpriteRenderer render;
  3. public void Hurt()
  4. {
  5. render.sprite = hurt;
  6. }

在Pig合适的地方进行调用

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 5

5.添加黑色小鸟

20181205215948254.png

添加BlackBird脚本继承Bird脚本,然后重写ShowSkill方法

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class BlackBird : Bird {
  5. public List<Pig> blocks = new List<Pig>();
  6. /// <summary>
  7. /// 进入触发区域
  8. /// </summary>
  9. /// <param name="collision"></param>
  10. private void OnTriggerEnter2D(Collider2D collision)
  11. {
  12. if(collision.gameObject.tag == "Enemy")
  13. {
  14. blocks.Add(collision.gameObject.GetComponent<Pig>());
  15. }
  16. }
  17. /// <summary>
  18. /// 离开触发区
  19. /// </summary>
  20. /// <param name="collision"></param>
  21. private void OnTriggerExit2D(Collider2D collision)
  22. {
  23. blocks.Remove(collision.gameObject.GetComponent<Pig>());
  24. }
  25. public override void ShowSkill()
  26. {
  27. base.ShowSkill();
  28. if(blocks.Count > 0 && blocks != null)
  29. {
  30. for(int i = 0; i > blocks.Count; i++)
  31. {
  32. blocks[i].Dead();
  33. }
  34. }
  35. }
  36. }

6.处理黑色小鸟的爆炸问题

给黑色小鸟添加爆炸的代码

  1. public override void ShowSkill()
  2. {
  3. base.ShowSkill();
  4. if(blocks.Count > 0 && blocks!=null)
  5. {
  6. for(int i = 0; i < blocks.Count; i++)
  7. {
  8. blocks[i].Dead();
  9. print("1");
  10. }
  11. }
  12. OnClear();
  13. }
  14. void OnClear()
  15. {
  16. rg.velocity = Vector3.zero;
  17. Instantiate(boom, transform.position, Quaternion.identity);
  18. render.enabled = false;
  19. GetComponent<CircleCollider2D>().enabled = false;
  20. myTrail.ClearTrails();
  21. }
  22. protected override void Next()
  23. {
  24. GameManager._instance.birds.Remove(this);
  25. Destroy(gameObject);
  26. GameManager._instance.NextBird();
  27. }

运行结果,代码如下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 6

7.处理星星数组越界的问题

在出现星星的地方添加下面的代码

  1. IEnumerator Show()
  2. {
  3. for (int i = 0; i < birds.Count + 1; i++)
  4. {
  5. if(i >= stars.Length)
  6. {
  7. break;
  8. }
  9. yield return new WaitForSeconds(0.2f);
  10. stars[i].SetActive(true);
  11. }
  12. }

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 7

8.制作选择地图UI界面

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 8

9.地图选择的逻辑编写

给每个地图添加新脚本MapSelect,并添加Button组件

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class MapSelect : MonoBehaviour {
  5. public int starsNum = 0;
  6. private bool isSelect = false;
  7. public GameObject locks;
  8. public GameObject stars;
  9. private void Start()
  10. {
  11. if (PlayerPrefs.GetInt("totalNum", 0) >= starsNum)
  12. {
  13. isSelect = true;
  14. }
  15. if (isSelect)
  16. {
  17. locks.SetActive(false);
  18. stars.SetActive(true);
  19. }
  20. }
  21. }

10.制作关卡选择界面

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 9

11.添加地图选择和关卡选择界面的交互

在MapSelect中添加下面的代码,进行鼠标交互

  1. public void Selected()
  2. {
  3. if (isSelect)
  4. {
  5. panel.SetActive(true);
  6. map.SetActive(false);
  7. }
  8. }

然后在各个按钮上给按钮注册该事件

12.存储关卡星星数据

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvdXpodWFuamluZzE4NDk_size_16_color_FFFFFF_t_70 10

首先在LevelSelect中添加代码,用来存储当前的关卡

  1. public void Selected()
  2. {
  3. if (isSelect)
  4. {
  5. PlayerPrefs.SetString("nowLevel", "level" + gameObject.name);
  6. }
  7. }

然后在GameManager中添加代码,用来存储当前关卡的星星数量以及调用它

  1. public void Replay()
  2. {
  3. SaveData();
  4. SceneManager.LoadScene(2);
  5. }
  6. public void Home()
  7. {
  8. SaveData();
  9. SceneManager.LoadScene(1);
  10. }
  11. public void SaveData()
  12. {
  13. PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starsNum);
  14. }

13.关卡选择,场景跳转

首先创建关卡level1并保存为预制体,如下图所示

20181210194417665.png

在02-game的摄像机上添加新的脚本LoadLevel用来加载关卡

  1. public class LoadLevel : MonoBehaviour {
  2. private void Awake()
  3. {
  4. Instantiate(Resources.Load(PlayerPrefs.GetString("nowLevel")));
  5. }
  6. }

发表评论

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

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

相关阅读

    相关 愤怒小鸟 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.制作