unity制作愤怒的小鸟

我不是女神ヾ 2023-09-27 21:17 232阅读 0赞

文章目录

  • 一、 介绍
  • SpringJoint2D 、line renderer制作发射绳
  • 基类bird脚本的基础功能
  • 给bird添加飞行拖尾效果
  • pig类
  • 游戏胜利的小星星烟花界面
  • 摄像机跟随移动
  • 游戏失败的界面
  • 多种小鸟的制作:黄鸟、绿鸟、黑鸟
  • 地图选择
  • 关卡选择
  • 数据保存
  • 制作多个关卡
  • 场景异步加载
  • 游戏全局管理器
  • 源文件下载

一、 介绍

在这里插入图片描述

SpringJoint2D
line renderer
动画制作
协程
异步资源加载
resource文件夹存储关卡数据
playerprefs存储关卡信息
trail拖尾效果


SpringJoint2D 、line renderer制作发射绳

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


基类bird脚本的基础功能

bird脚本是红鸟的专属脚本,yellow鸟、green鸟、black鸟可以在此基础上进行拓展。

以下是函数的简要作用:

  1. OnMouseDown(): 处理鼠标按下事件,设置isClick为true,并禁用刚体组件。
  2. OnMouseUp(): 处理鼠标抬起事件,设置isClick为false,延迟0.1秒后开始飞行,禁用划线组件,设置canMove为false。
  3. Update(): 处理小鸟移动和相机跟随的逻辑,以及炫技操作。
  4. Fly(): 在飞行状态下播放飞行音效,开启拖尾效果,禁用弹簧关节,5秒后自动切换到下一只小鸟。
  5. Line(): 实现划线逻辑。
  6. AudioPlay(): 实现音效播放。
  7. Next(): 切换到下一只小鸟。
  8. Hurt(): 处理小鸟受伤逻辑。
  9. ShowSkill(): 处理小鸟炫技效果。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public class Bird : MonoBehaviour {

  1. private bool isClick = false; //是否点击了小鸟
  2. public float maxDis = 3; //弹弓的最大拉伸距离
  3. [HideInInspector]
  4. public SpringJoint2D sp; //SpringJoint2D组件
  5. protected Rigidbody2D rg; //Rigidbody2D组件
  6. public LineRenderer right; //右边的划线组件
  7. public Transform rightPos; //右边的点
  8. public LineRenderer left; //左边的划线组件
  9. public Transform leftPos; //左边的点
  10. public GameObject boom; //小鸟死亡的爆炸效果
  11. protected TestMyTrail myTrail; //拖尾效果
  12. private bool canMove = true; //是否可以移动
  13. public float smooth = 3; //相机跟随的平滑度
  14. public AudioClip select; //选择小鸟的音效
  15. public AudioClip fly; //小鸟飞行的音效
  16. private bool isFly = false; //是否在飞行中
  17. public Sprite hurt; //受伤后的图片
  18. protected SpriteRenderer render; //SpriteRenderer组件
  19. private void Awake()
  20. {
  21. sp = GetComponent<SpringJoint2D>();
  22. rg = GetComponent<Rigidbody2D>();
  23. myTrail = GetComponent<TestMyTrail>();
  24. render = GetComponent<SpriteRenderer>();
  25. }
  26. private void OnMouseDown() //鼠标按下
  27. {
  28. if (canMove)
  29. {
  30. AudioPlay(select); //播放选择小鸟的音效
  31. isClick = true; //设置为点击状态
  32. rg.isKinematic = true; //关闭物理效果
  33. }
  34. }
  35. private void OnMouseUp() //鼠标抬起
  36. {
  37. if (canMove)
  38. {
  39. isClick = false; //设置为非点击状态
  40. rg.isKinematic = false; //开启物理效果
  41. Invoke("Fly", 0.1f); //延迟0.1秒后开始飞行
  42. //禁用划线组件
  43. right.enabled = false;
  44. left.enabled = false;
  45. canMove = false; //不可移动
  46. }
  47. }
  48. private void Update()
  49. {
  50. if (isClick) //鼠标一直按下,进行位置的跟随
  51. {
  52. transform.position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
  53. //transform.position += new Vector3(0, 0, 10);
  54. transform.position += new Vector3(0,0,-Camera.main.transform.position.z);
  55. if (Vector3.Distance(transform.position, rightPos.position) > maxDis) //进行位置限定
  56. {
  57. Vector3 pos = (transform.position - rightPos.position).normalized; //单位化向量
  58. pos *= maxDis; //最大长度的向量
  59. transform.position = pos + rightPos.position;
  60. }
  61. Line(); //绘制划线
  62. }
  63. //相机跟随
  64. float posX = transform.position.x;
  65. Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position, new Vector3(Mathf.Clamp(posX,0,15),Camera.main.transform.position.y,
  66. Camera.main.transform.position.z),smooth*Time.deltaTime);
  67. if (isFly)
  68. {
  69. if (Input.GetMouseButtonDown(0))
  70. {
  71. ShowSkill(); //炫技操作
  72. }
  73. }
  74. }
  75. void Fly()
  76. {
  77. isFly = true; //设置为飞行状态
  78. AudioPlay(fly); //播放飞行的音效
  79. myTrail.StartTrails(); //开启拖尾效果
  80. sp.enabled = false; //禁用弹簧关节
  81. Invoke("Next", 5); //飞行5秒后自动切换到下一只小鸟
  82. }
  83. /// <summary>
  84. /// 划线
  85. /// </summary>
  86. void Line()
  87. {
  88. right.enabled = true;
  89. left.enabled = true;
  90. right.SetPosition(0, rightPos.position);
  91. right.SetPosition(1, transform.position);
  92. left.SetPosition(0, leftPos.position);
  93. left.SetPosition(1, transform.position);
  94. }
  95. /// <summary>
  96. /// 下一只小鸟的飞出
  97. /// </summary>
  98. ///
  99. protected virtual void Next()
  100. {
  101. GameManager._instance.birds.Remove(this); //从GameManager中移除当前小鸟
  102. Destroy(gameObject); //销毁当前小鸟
  103. Instantiate(boom, transform.position, Quaternion.identity); //生成爆炸效果
  104. GameManager._instance.NextBird(); //切换到下一只小鸟
  105. }
  106. private void OnCollisionEnter2D(Collision2D collision)
  107. {
  108. isFly = false; //设置为非飞行状态
  109. myTrail.ClearTrails(); //清除拖尾效果
  110. }
  111. public void AudioPlay(AudioClip clip)
  112. {
  113. AudioSource.PlayClipAtPoint(clip, transform.position); //在指定位置播放音效
  114. }
  115. /// <summary>
  116. /// 炫技操作
  117. /// </summary>
  118. public virtual void ShowSkill()
  119. {
  120. isFly = false; //设置为非飞行状态
  121. }
  122. public void Hurt()
  123. {
  124. render.sprite = hurt; //切换为受伤后的图片
  125. }
  126. }

给bird添加飞行拖尾效果

在这里插入图片描述

给bird添加一个子对象,命名为 Trail,为其添加 WeaponTrail.cs脚本、 Mesh Renderer组件,材质为Pocket RPG Trails提供的材质,设置好如下图所示:

在这里插入图片描述

在这里插入图片描述

修改 TestMyTrail.cs代码为如下:

  1. using UnityEngine;
  2. using System.Collections;
  3. public class TestMyTrail : MonoBehaviour {
  4. public WeaponTrail myTrail;
  5. private Animator animator;
  6. private float t = 0.033f;
  7. private float tempT = 0;
  8. private float animationIncrement = 0.003f;
  9. void Start ()
  10. {
  11. animator = GetComponent<Animator>();
  12. }
  13. void LateUpdate()
  14. {
  15. t = Mathf.Clamp(Time.deltaTime, 0, 0.066f);
  16. if (t > 0)
  17. {
  18. while (tempT < t)
  19. {
  20. tempT += animationIncrement;
  21. if (myTrail.time > 0)
  22. {
  23. myTrail.Itterate(Time.time - t + tempT);
  24. }
  25. else
  26. {
  27. myTrail.ClearTrail();
  28. }
  29. }
  30. tempT -= t;
  31. if (myTrail.time > 0)
  32. {
  33. myTrail.UpdateTrail(Time.time, t);
  34. }
  35. }
  36. }
  37. void OnGUI()
  38. {
  39. if (GUI.Button( new Rect( 0, 0, 50, 50), "攻击"))
  40. {
  41. animator.SetTrigger( "Attack");
  42. }
  43. }
  44. }

将 Trail对象赋给 My Trail属性,如下图所示:
在这里插入图片描述

修改 TestMyTrail.cs 代码为如下:

  1. void Start ()
  2. {
  3. animator = GetComponent<Animator>();
  4. // 默认没有拖尾效果
  5. myTrail.SetTime( 0.0f, 0.0f, 1.0f);
  6. }
  7. public void heroAttack()
  8. {
  9. //设置拖尾时长
  10. myTrail.SetTime( 2.0f, 0.0f, 1.0f);
  11. //开始进行拖尾
  12. myTrail.StartTrail( 0.5f, 0.4f);
  13. }
  14. public void heroIdle()
  15. {
  16. //清除拖尾
  17. myTrail.ClearTrail();
  18. }

参考链接:https://blog.csdn.net/akof1314/article/details/37603559

资源链接:https://download.csdn.net/download/akof1314/7610241


pig类

这个脚本可以挂载到pig上,也可以挂在砖头上,受伤后速度值过大直接销毁,速度适中展示“损坏”的效果。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. //导入命名空间
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. //定义一个猪的类
  6. public class Pig : MonoBehaviour {
  7. //定义最大速度和最小速度
  8. public float maxSpeed = 0.01f;
  9. public float minSpeed = 0.005f;
  10. //定义一个SpriteRenderer
  11. private SpriteRenderer render;
  12. //定义一个hurt的Sprite
  13. public Sprite hurt;
  14. //定义一个炸弹和得分的游戏对象
  15. public GameObject boom;
  16. public GameObject score;
  17. //定义三种音效
  18. public AudioClip hurtClip;
  19. public AudioClip dead;
  20. public AudioClip birdCollision;
  21. //判断是否为猪
  22. public bool isPig = false;
  23. //定义一个Awake方法,在脚本被启用前执行一次
  24. private void Awake()
  25. {
  26. //获取SpriteRenderer组件
  27. render = GetComponent<SpriteRenderer>();
  28. }
  29. //定义一个OnCollisionEnter2D方法,在碰撞发生时执行
  30. private void OnCollisionEnter2D(Collision2D collision)
  31. {
  32. //判断碰撞对象是否为Player
  33. if (collision.gameObject.tag == "Player") {
  34. //播放birdCollision音效
  35. AudioPlay(birdCollision);
  36. //让Bird受伤
  37. collision.transform.GetComponent<Bird>().Hurt();
  38. }
  39. //如果相对速度大于最大速度,直接死亡
  40. if (collision.relativeVelocity.magnitude > maxSpeed)
  41. {
  42. Dead();
  43. }
  44. //如果相对速度在最大速度和最小速度之间,播放hurt音效
  45. else if (collision.relativeVelocity.magnitude > minSpeed && collision.relativeVelocity.magnitude < maxSpeed) {
  46. render.sprite = hurt;
  47. AudioPlay(hurtClip);
  48. }
  49. }
  50. //定义一个Dead方法,处理猪死亡的逻辑
  51. public void Dead() {
  52. //如果是猪,从GameManager中移除猪
  53. if (isPig)
  54. {
  55. GameManager._instance.pig.Remove(this);
  56. }
  57. //销毁猪的游戏对象
  58. Destroy(gameObject);
  59. //在猪的位置生成一个炸弹
  60. Instantiate(boom, transform.position, Quaternion.identity);
  61. //在猪的位置生成得分的游戏对象,并延迟1.5秒后销毁
  62. GameObject go = Instantiate(score, transform.position + new Vector3(0,0.5f,0), Quaternion.identity);
  63. Destroy(go, 1.5f);
  64. //播放死亡音效
  65. AudioPlay(dead);
  66. }
  67. //定义一个AudioPlay方法,用于播放音效
  68. public void AudioPlay(AudioClip clip)
  69. {
  70. //在猪的位置播放指定的音效
  71. AudioSource.PlayClipAtPoint(clip, transform.position);
  72. }
  73. }

游戏胜利的小星星烟花界面

在这里插入图片描述

在这里插入图片描述

一颗一颗显示星星:

  1. public void ShowStars() {
  2. StartCoroutine("show");
  3. }
  4. IEnumerator show() {
  5. for (; starsNum < birds.Count + 1; starsNum++)
  6. {
  7. if (starsNum >= stars.Length) {
  8. break;
  9. }
  10. yield return new WaitForSeconds(0.2f);
  11. stars[starsNum].SetActive(true);
  12. }
  13. print(starsNum);
  14. }

摄像机跟随移动

  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,
  4. Camera.main.transform.position.z),smooth*Time.deltaTime);

游戏失败的界面

图片嵌套,设置动画,透明度渐变。

在这里插入图片描述

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class PausePanel : MonoBehaviour
  5. {
  6. private Animator anim;
  7. public GameObject button;
  8. private void Awake()
  9. {
  10. anim = GetComponent<Animator>();
  11. }
  12. public void Retry() {
  13. Time.timeScale = 1;
  14. UnityEngine.SceneManagement.SceneManager.LoadScene(2);
  15. }
  16. /// <summary>
  17. /// 点击了pause按钮
  18. /// </summary>
  19. public void Pause()
  20. {
  21. //1、播放pause动画
  22. anim.SetBool("isPause", true);
  23. button.SetActive(false);
  24. }
  25. /// <summary>
  26. /// 点击了继续按钮
  27. /// </summary>
  28. public void Resume() {
  29. //1、播放resume动画
  30. Time.timeScale = 1;
  31. anim.SetBool("isPause", false);
  32. }
  33. public void Home()
  34. {
  35. Time.timeScale = 1;
  36. UnityEngine.SceneManagement.SceneManager.LoadScene(1);
  37. }
  38. /// <summary>
  39. /// pause动画播放完调用
  40. /// </summary>
  41. public void PauseAnimEnd() {
  42. Time.timeScale = 0;
  43. }
  44. /// <summary>
  45. /// resume动画播放完调用
  46. /// </summary>
  47. public void ResumeAnimEnd() {
  48. button.SetActive(true);
  49. }
  50. }

在这里插入图片描述


多种小鸟的制作:黄鸟、绿鸟、黑鸟

各种鸟,都继承红鸟bird的基础功能,进而拓展自己的功能。

  1. 黄鸟点击屏幕可以加速:
  2. public class YellowBird : Bird {
  3. /// <summary>
  4. /// 重写方法
  5. /// </summary>
  6. public override void ShowSkill()
  7. {
  8. base.ShowSkill();
  9. rg.velocity *= 2;
  10. }
  11. }

在这里插入图片描述

  1. 绿鸟点击屏幕可以回旋:
  2. public class GreenBird : Bird {
  3. public override void ShowSkill()
  4. {
  5. base.ShowSkill();
  6. Vector3 speed = rg.velocity;
  7. speed.x *= -1;
  8. rg.velocity = speed;
  9. }
  10. }

在这里插入图片描述

  1. 黑鸟点击屏幕发生爆炸,把一定范围的pig通过处罚监测存到list中,全部销毁
  2. using System.Collections; //导入命名空间System.Collections
  3. using System.Collections.Generic; //导入命名空间System.Collections.Generic
  4. using UnityEngine; //导入命名空间UnityEngine
  5. public class BlackBird : Bird {
  6. //定义名为BlackBird的类,继承自Bird类
  7. public List<Pig> blocks = new List<Pig>(); //定义名为blocks的Pig类型的列表
  8. /// <summary>
  9. /// 进入触发区域
  10. /// </summary>
  11. /// <param name="collision"></param>
  12. private void OnTriggerEnter2D(Collider2D collision) //当进入触发区域时
  13. {
  14. if (collision.gameObject.tag == "Enemy") {
  15. //如果触碰到的物体标签为“Enemy”
  16. blocks.Add(collision.gameObject.GetComponent<Pig>()); //将触碰到的物体的Pig组件添加到blocks列表中
  17. }
  18. }
  19. /// <summary>
  20. /// 离开触发区域
  21. /// </summary>
  22. /// <param name="collision"></param>
  23. private void OnTriggerExit2D(Collider2D collision) //当离开触发区域时
  24. {
  25. if (collision.gameObject.tag == "Enemy") //如果触碰到的物体标签为“Enemy”
  26. {
  27. blocks.Remove(collision.gameObject.GetComponent<Pig>()); //将触碰到的物体的Pig组件从blocks列表中移除
  28. }
  29. }
  30. public override void ShowSkill() //重写父类的ShowSkill方法
  31. {
  32. base.ShowSkill(); //调用父类的ShowSkill方法
  33. if (blocks.Count > 0 && blocks != null) {
  34. //如果blocks列表中有元素
  35. for (int i = 0; i < blocks.Count; i++) {
  36. //循环遍历blocks列表中的元素
  37. blocks[i].Dead(); //调用Pig类的Dead方法
  38. }
  39. }
  40. OnClear(); //调用自定义的OnClear方法
  41. }
  42. void OnClear() {
  43. //自定义名为OnClear的方法
  44. rg.velocity = Vector3.zero; //将刚体的速度设置为零向量
  45. Instantiate(boom,transform.position,Quaternion.identity); //在对象的位置生成一个boom预制体
  46. render.enabled = false; //关闭SpriteRenderer组件
  47. GetComponent<CircleCollider2D>().enabled = false; //关闭CircleCollider2D组件
  48. myTrail.ClearTrails(); //调用自定义的ClearTrails方法清空拖尾效果
  49. }
  50. protected override void Next() //重写父类的Next方法
  51. {
  52. GameManager._instance.birds.Remove(this); //将当前对象从GameManager类的birds列表中移除
  53. Destroy(gameObject); //销毁对象
  54. GameManager._instance.NextBird(); //调用GameManager类的NextBird方法
  55. }
  56. }

在这里插入图片描述


地图选择

在这里插入图片描述


关卡选择

在这里插入图片描述


数据保存

  1. public void SaveData() {
  2. if (starsNum > PlayerPrefs.GetInt(PlayerPrefs.GetString("nowLevel"))){
  3. PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starsNum);
  4. }
  5. //存储所有的星星个数
  6. int sum = 0;
  7. for (int i = 1; i <= totalNum; i++) {
  8. sum += PlayerPrefs.GetInt("level" + i.ToString());
  9. }
  10. PlayerPrefs.SetInt("totalNum",sum);
  11. //print(PlayerPrefs.GetInt("totalNum"));
  12. }

PlayerPrefs类:用于存储游戏数据,包括玩家的设置和游戏状态。

GetInt()方法:从PlayerPrefs中获取一个整数值。

GetString()方法:从PlayerPrefs中获取一个字符串值。

SetInt()方法:将一个整数值存储到PlayerPrefs中。


制作多个关卡

新建文件夹RESOURCE,自己制作不同的关卡,用于方便后续加载

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


场景异步加载

设置分辨率,加载到选择地图界面。
在这里插入图片描述

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.SceneManagement;
  5. public class LoadLevelAsync : MonoBehaviour {
  6. // Use this for initialization
  7. void Start() {
  8. Screen.SetResolution(960,600,false);
  9. Invoke("Load",2);
  10. }
  11. void Load() {
  12. SceneManager.LoadSceneAsync(1);
  13. }
  14. }

游戏全局管理器

  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; // 小鸟列表
  7. public List<Pig> pig; // 猪列表
  8. public static GameManager _instance; // 游戏管理器实例
  9. private Vector3 originPos; //初始化的位置
  10. public GameObject win; // 胜利界面
  11. public GameObject lose; // 失败界面
  12. public GameObject[] stars; // 星星
  13. private int starsNum = 0; // 星星数量
  14. private int totalNum = 9; // 总星星数量
  15. private void Awake()
  16. {
  17. _instance = this;
  18. if(birds.Count > 0) {
  19. originPos = birds[0].transform.position;
  20. }
  21. }
  22. private void Start()
  23. {
  24. Initialized();
  25. }
  26. /// <summary>
  27. /// 初始化小鸟
  28. /// </summary>
  29. private void Initialized()
  30. {
  31. for(int i = 0; i < birds.Count; i++)
  32. {
  33. if (i == 0) //第一只小鸟
  34. {
  35. birds[i].transform.position = originPos;
  36. birds[i].enabled = true;
  37. birds[i].sp.enabled = true;
  38. }
  39. else
  40. {
  41. birds[i].enabled = false;
  42. birds[i].sp.enabled = false;
  43. }
  44. }
  45. }
  46. /// <summary>
  47. /// 判定游戏逻辑
  48. /// </summary>
  49. public void NextBird()
  50. {
  51. if(pig.Count > 0)
  52. {
  53. if(birds.Count > 0)
  54. {
  55. //下一只飞吧
  56. Initialized();
  57. }
  58. else
  59. {
  60. //输了
  61. lose.SetActive(true);
  62. }
  63. }
  64. else
  65. {
  66. //赢了
  67. win.SetActive(true);
  68. }
  69. }
  70. public void ShowStars() {
  71. StartCoroutine("show");
  72. }
  73. IEnumerator show() {
  74. for (; starsNum < birds.Count + 1; starsNum++)
  75. {
  76. if (starsNum >= stars.Length) {
  77. break;
  78. }
  79. yield return new WaitForSeconds(0.2f);
  80. stars[starsNum].SetActive(true);
  81. }
  82. print(starsNum);
  83. }
  84. public void Replay() {
  85. SaveData();
  86. SceneManager.LoadScene(2);
  87. }
  88. public void Home() {
  89. SaveData();
  90. SceneManager.LoadScene(1);
  91. }
  92. public void SaveData() {
  93. if (starsNum > PlayerPrefs.GetInt(PlayerPrefs.GetString("nowLevel"))){
  94. PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starsNum);
  95. }
  96. //存储所有的星星个数
  97. int sum = 0;
  98. for (int i = 1; i <= totalNum; i++) {
  99. sum += PlayerPrefs.GetInt("level" + i.ToString());
  100. }
  101. PlayerPrefs.SetInt("totalNum",sum);
  102. //print(PlayerPrefs.GetInt("totalNum"));
  103. }
  104. }

维护小鸟列表(birds)和猪列表(pig)。
实现了单例模式,通过静态变量 _instance 获取 GameManager 的实例。
存储初始位置(originPos)。
引用胜利界面(win)和失败界面(lose)的游戏对象。
存储星星的数组(stars)。
跟踪星星数量(starsNum)和总星星数量(totalNum)。
在 Awake 方法中设置 GameManager 的实例和初始位置。
在 Start 方法中调用 Initialized 方法进行初始化。
Initialized 方法用于初始化小鸟列表中的小鸟,将第一只小鸟设置在初始位置,其他小鸟禁用。
NextBird 方法根据游戏逻辑判断游戏输赢,并在相应情况下显示胜利或失败界面。
ShowStars 方法使用协程逐个显示星星。
Show 方法用于协程,控制星星的显示过程。
Replay 方法用于重新加载场景。
Home 方法用于返回主菜单。
SaveData 方法用于保存游戏数据,包括更新关卡的星星数量和总星星数量。



源文件下载


https://wwez.lanzoul.com/iBdeT0whs3gh


发表评论

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

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

相关阅读

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