说明:本次学习开始于2018年9月23日,至9月26日已看完全部教学视频,并已基本完成该案例的制作,历时四天。本文档为我在学习过程中,通过记事本记录的学习过程,对于该游戏案例的制作过程并不十分详尽,不作为教程使用,仅用于自己学习参考,记录于此,聊表心意。

★★黄色加速小鸟(继承自红色)

基本思路,在红色小鸟的脚本中添加是否处于飞行中的判断,具体做法是,声明一个bool变量isfly,初始值为false,在鼠标按下调用飞行函数的时候,设置值为true,在小鸟碰撞检测的函数中设置为false。

然后添加一个释放技能函数showskill,在update中,在双重判断下执行(是否处于飞行中,和是否按下了鼠标左键),showskill函数中首先写上将isfly值改为false,以保证只能释放一次技能。
    public virtual void ShowSkill() {
        isFly = false;
    }
为了继承,将释放技能函数设置为虚函数,并将Rigidbody2D属性设置为保护,以便子类中调用。

子类的设置,新建脚本,继承birds,重写showskill函数,先调用基类的函数,然后将速度设置为原来的两倍。
    public override void ShowSkill()
    {
        base.ShowSkill();
        rg.velocity *= 2;
    }
新的黄色小鸟添加脚本后,需要在面板中重新赋值。

★★绿色回旋小鸟

方法同黄色,只是技能代码不同
    public override void ShowSkill()
    {
        base.ShowSkill();
        Vector3 speed = rg.velocity;
        speed.x *= -1;
        rg.velocity = speed;
    }

★★小鸟受伤

与小猪受伤类似,先声明
    private SpriteRenderer render;
    public Sprite hurt;
在awake中得到组件
        render = GetComponent<SpriteRenderer>();
在碰撞时改变图集
        if (isShoot) {
            render.sprite = hurt;
        }
注意,这里为了避免一开始小鸟就受伤,所以用一个bool变量来标记小鸟是否被发射出。

★★黑色爆炸小鸟

首先制作黑色小鸟
复制一个红色的,改图片,给赋值,去掉原来的代码,加上黑色的代码,再加一个碰撞器,注意勾选上触发器trigger,改大些(爆炸范围,碰到就死)。

然后来说代码,用一个pig类型的表来装在爆炸范围内的猪和木头。
    public List<Pig> block = new List<Pig>();
    
    //进入触发区
    private void OnTriggerEnter2D(Collider2D collsion) {
        if (collsion.gameObject.tag == "Enemy") {
            block.Add(collsion.gameObject.GetComponent<Pig>());
        }
    }
    //出触发区
    private void OnTriggerExit2D(Collider2D collsion) {
        if (collsion.gameObject.tag == "Enemy")
        {
            block.Remove(collsion.gameObject.GetComponent<Pig>());
        }
    }
其中,用标签类识别敌人。
在技能释放中销毁这些物体。
        while (block.Count > 0 && block != null) {
            block[0].PigDead();
        }
★注意【foreach循环中是能对list集合进行读取,而不能去销毁表中的内容。】
【for循环会记录当前读取到的下标位置,而物体销毁掉后,剩余物体在表中的位置会发生变化,导致销毁不完全。】

黑鸟爆炸后,原地隐藏,及后事处理。
    void OnClear() {
        rg.velocity = Vector3.zero;
        Instantiate(boom, transform.position, Quaternion.identity);
        render.enabled = false;
        GetComponent<CircleCollider2D>().enabled = false;
    }
其中,包括对小鸟速度的设置(刚体速度设为0,小鸟不再动),生成爆炸预制体,不再渲染显示,取消激活其碰撞体。
重写销毁方法,只需去掉生成爆炸预制体。
    protected override void DestoryBird()
    {
        GameManager._instance.birds.Remove(this);
        Destroy(gameObject);
        GameManager._instance.NextBird();
    }

★★场景补全

★★好吧从这里开始要划水水了

添加布置木头和猪猪。

★★选择地图界面的UI

添加画布,图片。
可以更改画布的尺寸。有三种UI尺寸模式。

★★地图选择实现

在每一个关卡地图上,有锁定和已激活两个ui界面,同时只显示一个。
为地图UI添加代码,添加一个变量(激活该关卡需要的星星数量),和一个标志符(是否能激活),在start函数中写,如果总星星数大于激活需要星星数,则设置标识符为已激活。继续判断是否激活,若激活则显示星星数量UI,未激活显示锁定UI。
    void Start () {
        if (PlayerPrefs.GetInt("totalStar", 0) >= starNum) {
            isSelect = true;
        }
        if (isSelect) {
            locks.SetActive(false);
            stars.SetActive(true);
        }
    }
其中,锁定UI和星星UI需要在编辑器赋值。总星星数用Unity提供的键值对存储给出。
这样在每一次进入关卡选择场景,都会判断激活的地图(根据事先确定好的限制星星数量)

★★关卡界面UI

多是一些图集的设置,主要关键点是逻辑和层次关系要理清楚,在此简述逻辑。

首先是空物体的关卡面板(下有如返回这样的按钮,空物体的关卡容器(加grid layout group组件对其内的每个关卡进行排布管理)),容器中装统一的关卡图标,每个关卡为一个图集,其下还有要显示用的关卡数字,获得的星星。

代码逻辑部分
    public bool isSelect = false;
    public Sprite levelBG;
    private Image image;
    void Awake() {
        image = GetComponent<Image>();
    }
    void Start () {
        if (transform.parent.GetChild(0).name == gameObject.name) {
            isSelect = true;
        }
        if (isSelect) {
            image.overrideSprite = levelBG;
            transform.Find("num").gameObject.SetActive(true);
        }
    }
其中,每个关卡都放上脚本,默认时为显示锁图标,在开始时对其判断是否解锁,每一个可以选择的关卡,重写图片为激活状态的图片,将数字激活显示,其中用第一个子物体名字相等确保第一关处于激活。

★★实现从地图到关卡的选择

在mapselect脚本中添加选择事件,激活levelpanel的UI,隐藏map的UI。
    public GameObject panel;
    public GameObject map;
    public void Select() {
        if (isSelect) {
            panel.SetActive(true);
            map.SetActive(false);
        }
    }
其中,需要给不同的map赋上不同的值,map属性的值都一样,levelpanel的值则需对应起来,并在每个map中都添加鼠标点击事件,分别调用各自的select函数。

★★游戏结束,星星数据的存储

首先在关卡选择处,选择成功后,存储当前关卡信息。
        if (isSelect)
        {
            PlayerPrefs.SetString("newLevel", "level"+gameObject.name);
        }
在游戏管理类中,写存储信息函数。
    public void SaveData() {
        if (starNum > PlayerPrefs.GetInt(PlayerPrefs.GetString("nowLevel"), 0)) {
            PlayerPrefs.SetInt(PlayerPrefs.GetString("nowLevel"), starNum);
        }
    }
在游戏结束,显示星星面板中,结算星星后调用存储。

总星星数的存储。
        int sum = 0;
        for (int i = 1; i <= totalStar; i++) {
            sum += PlayerPrefs.GetInt(PlayerPrefs.GetString("level" + i.ToString()));
        }
        PlayerPrefs.SetInt("totalStar", sum);
    }
其中每次都从第一个关卡开始求和,计算出总数后存到totalStar中。

★★场景加载

将已制作好的游戏场景中的除了主摄像机都放到level01空物体下,制成预制体,类似的制作不同关卡的预制体,放到Resources资源目录下,以备调用。

在主摄像机上挂载加载代码。
    private void Awake() {
        Instantiate(Resources.Load(PlayerPrefs.GetString("nowLevel")));
    }
在关卡选择时加载游戏场景。
        if (isSelect)
        {
            PlayerPrefs.SetString("nowLevel", "level"+gameObject.name);
            SceneManager.LoadScene(2);
        }
    }
并将其注册到每一个关卡按钮点击事件中。

★★后续关卡的解锁

在关卡选择代码中,在start函数中判断了第一个关卡后,再判断后面的的关卡是否可选
        if (transform.parent.GetChild(0).name == gameObject.name)
        {
            isSelect = true;
        }
        else {
            int beforeStar = int.Parse(gameObject.name) - 1;
            if (PlayerPrefs.GetInt("level" + beforeStar.ToString()) > 0) {
                isSelect = true;
            }
        }
其中,先获得前一个关卡的星星数量,若果大于0则可以选则。

★★文本框中星星数量的实现。

int counts = 0;
            for (int i = startLevel; i <= endLevel; i++) {
                counts += PlayerPrefs.GetInt("level" + i.ToString(), 0);
            }
            starText.text = counts.ToString() + "/20";

★★异步加载

void Start () {
        PlayerPrefs.DeleteAll();
        SceneManager.LoadSceneAsync(1);
    }

★★完善与发布

★★bug修复

1,待定小鸟可以点击的问题:将canMove属性默认为false,在初始化小鸟函数中再设置为true。

2,暂停时小鸟可以点击的问题:个人觉得其解决方法不是很妥当,此处略去。

3,小鸟飞行中点击暂停会释放技能的问题:可以通过设置UI界面的【raycast target】属性,不勾选可以不做交互,让鼠标点击穿过这层UI。

siki学院_Unity初级案例_愤怒的小鸟_学习笔记3/3相关推荐

  1. siki学院_Unity初级案例_愤怒的小鸟_学习笔记1/3

    说明:本次学习开始于2018年9月23日,至9月26日已看完全部教学视频,并已基本完成该案例的制作,历时四天.本文档为我在学习过程中,通过记事本记录的学习过程,对于该游戏案例的制作过程并不十分详尽,不 ...

  2. siki学院_Unity初级案例_愤怒的小鸟_学习笔记2/3

    说明:本次学习开始于2018年9月23日,至9月26日已看完全部教学视频,并已基本完成该案例的制作,历时四天.本文档为我在学习过程中,通过记事本记录的学习过程,对于该游戏案例的制作过程并不十分详尽,不 ...

  3. siki学院unity初级案例炸弹人取空位置点的Bug

    问题描述:   在学习Unity初级案例炸弹人时,当取地图上的空位置点时,出现InitMap(2,2)取值不正确的情况.   程序获取的空位置点数   空位置图如下:   从图中可以看出空位置点数应为 ...

  4. python语言有哪两个系列_(转)Python学习笔记系列——Python是一种纯粹的语言

    在摸索适合自己的语言学习方法,看到一篇好文章,转之,侵删. Python的语法范式相当多.知识点相当细,但是Python是一种内在一致性很好的语言,理解了几条基本的规则,就很容易理解大部分语法与现象. ...

  5. y空间兑换代码_【CV学习笔记】色彩空间

    关注"深度学习冲鸭",一起学习一起冲鸭! 设为星标,第一时间获取更多干货 作者:云时之间来源:知乎链接:https://zhuanlan.zhihu.com/p/103387082 ...

  6. cs客户端 实时权限_【CS学习笔记】7、SMBbean的作用

    0x00 SMB Beacon 简介 SMB Beacon 使用命名管道通过一个父 Beacon 进行通信.这种对等通信对同一台主机上的 Beacon 和跨网络的 Beacon 都有效.Windows ...

  7. 得到app文稿导出_得到app学习笔记作为知识付费者,如何把所学内容快速输出?...

    原标题:得到app学习笔记作为知识付费者,如何把所学内容快速输出? 零.引子 昨天看到老公票圈更新了一条段子: 我就是那个伪勤奋者,在知识焦虑的胁迫下,这些年买了不知多少视频.微课.教程还有得到专栏. ...

  8. 案例驱动式Python学习笔记【第一篇】便捷水果店

    前言 后续的此系列博文用于记录案例式Python学习笔记记录,供本人和感兴趣的小伙伴一起学习!!人生苦短,我学Python! 驱动案例 便捷水果店:请为水果店开发一个收银的小程序,已知水果单价和购买重 ...

  9. group by rollup 变量名为空值_【Python学习笔记】07、数据类型和变量

    在Python中,能够直接处理的数据类型有以下几种: 整数 Python可以处理任意大小的整数,包括负整数,例如:1,100,-8080,0,等等. 计算机由于使用二进制,所以,有时候用十六进制表示整 ...

最新文章

  1. Java NIO与IO的区别和比较
  2. ubuntu下连接mysql出现Access denied for user ‘rose‘@‘localhost‘ (using password: NO)的解决方法
  3. java super object,java学习记录笔记--继承,super,Object类
  4. python数字信号处理应用中文pdf_人邮新书 Python数字信号处理应用 Python在DSP中应用教程 Python基础 Pytho...
  5. 作者:张岩,男,北京大学教授、博士生导师。
  6. 随便选一张扑克牌_教大家怎么快速记忆扑克牌?一学就会
  7. 2场直播丨MySQL 数据库最常见的 6 类故障的排除方法、2020数据技术嘉年华·金融峰会暨数据库大咖讲坛(第4期)...
  8. C++20 模式下将启用协程支持 CC 11
  9. cad的font文件夹有字体但是标注显示问号的问题
  10. bc547可以用8050代换吗_常用三极管代换型号
  11. 浅谈12306核心模型设计思路和架构设计
  12. U8C报表模板已设置,任务已分配仍无法查看报表数据
  13. 乔治城大学计算机科学硕士2019,[2019世界大学排名]2019乔治城大学排名
  14. vue获取地址栏参数
  15. json.decoder.JSONDecodeError: Expecting value: line column (char )
  16. 以树莓派为控制中心的软硬件之开发之脑电波模块
  17. 用SVD压缩彩色图片(MATLAB代码)
  18. C语言小记:结构体及其在内存中的储存形式
  19. 机器学习:决策树的预剪枝和后剪枝
  20. 高校教师开计算机培训中心,计算中心

热门文章

  1. 北理计算机学院高扬,北理工MBA戚高扬备考故事:| 为梦起航 圆梦北理
  2. 老戚的黑科技之ssh无密码登录
  3. QQ全量上云的技术解析
  4. 苹果手机怎么查看WiFi密码?无需下载软件,快速分享密码给其他人
  5. 赛尔网——Wifi 分享
  6. AdobePhotoshopCS3-full1224 (绿色版)
  7. OKLink行业观察:投资数字资产的机构版图(二)微策略
  8. 2017百度之星总结
  9. job运行失败分析方法
  10. Killer KCC(Killer control center/Killer Intelligence Center)安装失败问题解决 Windows 10 应用需要FAT32或ExFAT格式