愤怒的小鸟 Day 3

1.添加镜头跟随

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

//相机跟随
        float posX = transform.position.x;
        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);

运行程序,结果如下: 

2.音乐的添加

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


    public AudioClip select;
    public AudioClip fly;
 public void AudioPlay(AudioClip clip)
    {
        AudioSource.PlayClipAtPoint(clip, transform.position);
    }

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

 

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

 public AudioClip hurtClip;
 public AudioClip dead;
 public AudioClip birdCollision;

    public void AudioPlay(AudioClip clip)
    {
        AudioSource.PlayClipAtPoint(clip, transform.position);
    }

 

3.添加黄色小鸟

修改Bird代码

    private bool isFly;
    /// <summary>
    /// 释放技能的操作
    /// </summary>
    public virtual void ShowSkill()
    {
        isFly = false;

    }

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

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

public class YellowBird : Bird {

    /// <summary>
    /// 重写方法
    /// </summary>
    public override void ShowSkill()
    {
        base.ShowSkill();
        rg.velocity *= 2;
    }
}

4.添加绿色的小鸟

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

    public override void ShowSkill()
    {
        base.ShowSkill();
        Vector3 speed = rg.velocity;
        speed.x *= -1;
        rg.velocity = speed;
    }

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

 public Sprite hurt;
 private SpriteRenderer render;

    public void Hurt()
    {
        render.sprite = hurt;
    }

在Pig合适的地方进行调用

5.添加黑色小鸟

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

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

public class BlackBird : Bird {

    public List<Pig> blocks = new List<Pig>();

    /// <summary>
    /// 进入触发区域
    /// </summary>
    /// <param name="collision"></param>
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.gameObject.tag == "Enemy")
        {
            blocks.Add(collision.gameObject.GetComponent<Pig>());
        }
    }

    /// <summary>
    /// 离开触发区
    /// </summary>
    /// <param name="collision"></param>
    private void OnTriggerExit2D(Collider2D collision)
    {
        blocks.Remove(collision.gameObject.GetComponent<Pig>());
    }

    public override void ShowSkill()
    {
        base.ShowSkill();
        if(blocks.Count > 0 && blocks != null)
        {
            for(int i = 0; i > blocks.Count; i++)
            {
                blocks[i].Dead();
            }
        }
    }

}

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

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

    public override void ShowSkill()
    {
        base.ShowSkill();
        if(blocks.Count > 0 && blocks!=null)
        {
            for(int i = 0; i < blocks.Count; i++)
            {
                blocks[i].Dead();
                print("1");
            }
        }
        OnClear();
    }

    void OnClear()
    {
        rg.velocity = Vector3.zero;
        Instantiate(boom, transform.position, Quaternion.identity);
        render.enabled = false;
        GetComponent<CircleCollider2D>().enabled = false;
        myTrail.ClearTrails();
    }

    protected override void Next()
    {
        GameManager._instance.birds.Remove(this);
        Destroy(gameObject);
        GameManager._instance.NextBird();
    }

运行结果,代码如下

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

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

    IEnumerator Show()
    {
        for (int i = 0; i < birds.Count + 1; i++)
        {
            if(i >= stars.Length)
            {
                break;
            }
            yield return new WaitForSeconds(0.2f);
            stars[i].SetActive(true);
        }
    }

8.制作选择地图UI界面

9.地图选择的逻辑编写

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

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

public class MapSelect : MonoBehaviour {

    public int starsNum = 0;
    private bool isSelect = false;

    public GameObject locks;
    public GameObject stars;

    private void Start()
    {
        if (PlayerPrefs.GetInt("totalNum", 0) >= starsNum)
        {
            isSelect = true;
        }

        if (isSelect)
        {
            locks.SetActive(false);
            stars.SetActive(true);
        }
    }
}

10.制作关卡选择界面

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

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

    public void Selected()
    {
        if (isSelect)
        {
            panel.SetActive(true);
            map.SetActive(false);
        }
    }

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

12.存储关卡星星数据

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

    public void Selected()
    {
        if (isSelect)
        {
            PlayerPrefs.SetString("nowLevel", "level" + gameObject.name);
        }
    }

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

    public void Replay()
    {
        SaveData();
        SceneManager.LoadScene(2);
    }

    public void Home()
    {
        SaveData();
        SceneManager.LoadScene(1);
    }

    public void SaveData()
    {
        PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starsNum);
    }

13.关卡选择,场景跳转

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

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

public class LoadLevel : MonoBehaviour {

    private void Awake()
    {
        Instantiate(Resources.Load(PlayerPrefs.GetString("nowLevel")));
    }
}

猜你喜欢

转载自blog.csdn.net/kouzhuanjing1849/article/details/84779415