Unity2D 街机风太空射击游戏 学习记录 #12环射道具的引入

概述

这是一款基于Unity引擎开发的2D街机风太空射击游戏,笔者并不是游戏开发人,作者是siki学院的凉鞋老师。

笔者只是学习项目,记录学习,同时也想帮助他人更好的学习这个项目

作者会记录学习这一期用到的知识,和一些代码逻辑。

项目地址: 学习地址

由于笔者已经跟着视频做了10期,所以这个记录博客不会很连贯。

这里笔者也把自己跟做的项目开源到了码云上
项目地址

1 引入新的道具图标

为什么要取消勾选Generate Physics Shapes

如果勾选了Generate Physics Shapes,Unity就会自动给当前游戏物体增加碰撞体积,使该物体能和其他碰撞体进行碰撞。

2 PowerUpCircle 脚本

吃到这个道具的代码逻辑跟吃到隐身和散射是一样的。

start方法中使得道具刷新出来之后向屏幕中心移动

update方法中检测道具是否超出屏幕,如果超出屏幕则销毁这个游戏对象

道具向世界坐标系原点 (0,0) 直线移动的逻辑

向量的归一化

当我们只关心向量的方向,而不关心长度的时候,可以考虑对向量进行归一化。所谓归一化,就是将向量的长度转变为1,而其方向不发生变化。

在Unity/C#中,我们可以用nornalized将一个Vector2向量进行归一化。

复制代码
transform.position是获取当前物体在世界坐标系中的位置坐标
transform.position.nornalized是将这个坐标向量转化为方向(方向相同,但是长度为1)
GetComponent<Rigidbody2D>().velocity 获取该游戏对象的Rigidbody2D组件,设置其速度方向为指向世界坐标系原点但是大小为1的向量,由于有负号,所以方向会反转
这样道具生成之后就会向世界坐标系原点进行移动。

吃到道具的逻辑

这里跟吃到前面隐身和散射道具的逻辑是一样的。

Player脚本的OnTriggerEnter2D方法中 ,通过
other.gameObject.name.StartsWith("powerUp")

当主角碰撞到到的游戏对象的名字以powerUp开头的时候,就可以通过下面的方法去获得该游戏对象上面的道具组件,如果不是空,则代表吃到了对应的道具。
var ghost = other.gameObject.GetComponent<PowerUpGhost>()
var spread = other.gameObject.GetComponent<PowerUpSpread>()
var circle = other.gameObject.GetComponent<PowerUpCircle>()

环射的实现

c 复制代码
            // 吃到了子弹环射道具
            if (powerUpCircle != null){
                // 更新射击子弹状态
                isPowerUpCircle = true;
                
                // 播放音效
                transform.Find("SfxPowerUp").GetComponent<AudioSource>().Play();
                // 播放特效
                ParticleSystem fx = Instantiate(Game.Default.powerUpFx, null);
                fx.transform.position = other.transform.position;
                fx.gameObject.SetActive(true);
                fx.Play();
                
                // 右上角道具显示
                Sprite icon = Game.Default.powerUpCircle.GetComponent<SpriteRenderer>().sprite;
                // 回调函数,倒计时结束之后隐藏隐身文本
                Game.Default.uiPowerUps.AddPowerUp(icon,  3, () => {
                    isPowerUpCircle = false;
                    // 倒计时结束之后隐藏隐身文本
                });
                
                Destroy(other.gameObject);
            }

道具掉落的随机逻辑

通过全局管理类Game克隆一个环射道具预制体

将其位置设置到子弹碰撞的位置

然后将其绑定的游戏对象进行显形

这里为什么要用克隆

如果直接修改原预制体会影响后续所有生成的对象,所以我们克隆一个。

相关推荐
yangyanping2010814 小时前
Go语言学习之对象关系映射GORM
jvm·学习·golang
网络工程小王14 小时前
【Transformer架构详解】(学习笔记)
笔记·学习
倒酒小生16 小时前
今日算法学习小结
学习
醇氧16 小时前
【学习】【说人话版】子网划分
学习
不灭锦鲤17 小时前
网络安全学习(面试)
学习·安全·web安全
世人万千丶18 小时前
Flutter 框架跨平台鸿蒙开发 - 鸿蒙版本五子棋游戏应用
学习·flutter·游戏·华为·harmonyos·鸿蒙
Aktx20FNz18 小时前
一文学习 Spring AOP 源码全过程
java·学习·spring
Jay Kay18 小时前
生成式推荐模型学习记录part1
学习
正经教主20 小时前
【docker基础】0、系统学习docker之总计划
学习·docker·容器
Mr_CrazyPeter21 小时前
iONSPlayer 1.1.1版本发布
游戏·ios·模拟器