Unity射击游戏开发教程:(27)创建带有百分比的状态栏

csdn推荐

博客

让你不再害怕指针

11-28

8万+

让你不再害怕指针前言:复杂类型说明要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其优先级和运算优先级一样,所以我总结了一下其原则:从变量名处起,根据运算符优先级结合,一步一步分析.下面让我们先从简单的类型开始慢慢分析吧:int p; //这是一个普通的整型变量

博客

【go从入门到精通】网络编程

06-14

27

接下来,我们需要掌握网络编程,TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网际协议,是一种面向连接(连接导向)的、可靠的、基于字节流的传输层(Transport layer)通信协议,因为是面向连接的协议,数据像水流一样传输,会存在黏包问题。我的意思是,如果我们可以使用特定应用程序(例如 Nginx)的相同 IP: 端口打开一个套接字,我们就可以劫持内核通过该套接字发送给我们的部分请求。包还提供对 UDP 套接字的支持。

博客

微信小游戏推送(小游戏礼包功能)服务器端接入开发经验总结

06-13

777

小游戏开发者的游戏内道具,可通过接入平台「礼包系统」,在微信平台各场景发放游戏礼包。发放场景包括:游戏圈、活动运营工具、发现-游戏-福利中心、广告、搜索等道具礼包发货基于微信小游戏统一的消息推送能力,因此在使用礼包中心的发货回调时,需要开发者服务器处理好消息推送的协议。注意:MP配置消息回调地址只有1个,所有消息推送场景都会使用该通道,所以需要先根据MsgType与Event来判断消息类型,进行相应的处理。下面是发送和返回的格式:更多详情可以查看文档:小游戏礼包 | 微信开放文档。

博客

【go从入门到精通】精通并发编程-使用atomic管理状态和同步的无锁技术

05-28

555

Go 中的包sync/atomic提供了低级原子内存操作,确保状态更新以原子方式执行,而不受其他 goroutine 的干扰。在必须以原子方式完成多个进程或需要更复杂类型的同步的情况下,可能需要锁和其他同步技术。在 Go 中,原子计数器允许多个 goroutine 安全地更改共享变量,而无需使用锁或任何其他显式同步,这可确保数据完整性并避免竞争条件。大家从结果上就可以看出这差距不是一点点,当然不是所有的场景都无脑式的使用sync/atomic原子包,那我们接下来看下那些场景不适合。

博客

Unity射击游戏开发教程:(28)敌人被摧毁时掉落的能量提升

05-28

114

然后,我们将通过从生成管理器获取电源数组来实例化电源,并传入随机数,该随机数将确定将创建哪个电源,并在敌人被摧毁的位置创建它,并保持旋转相同使用四元数并将其设置为其身份。例如,百分比机会中的元素 0 = 通电数组中的元素 0(元素 1 = 元素 1,元素 2 = 元素 2,等等)。在 OnTriggerEnter 中,这是敌人被射弹或玩家击中的地方,我们希望在敌人被摧毁之前抓住敌人的当前位置,并将其分配给我们的 powerUpSpawnPosition,这样就知道在哪里可以产生能量我们实例化它。

博客

Unity射击游戏开发教程:(26)创建绕圈跑的效果

05-26

47

角度是我们每帧增加的角度,三角形的斜边(圆的半径)是我们的轨道距离,所以蓝线显示了当前 X 位置添加的内容。当敌人的 Y 位置移动超过停止点(即 2)且 _isMovingDown 为 true 时,我们会将当前的 X 和 Y 坐标存储在相应的变量中,并将 _isMovingDown 设置为 false,这样我们就不再向下移动,这些 X 和 Y 坐标为最终确定。我们创建了一个本地浮点值,它将包含更新时的新 X 位置,并将其设置为等于敌人停止时的 X 位置加上当前角度的 COS x 轨道距离。

博客

Unity射击游戏开发教程:(25)创建具有视差效果的滚动背景

05-25

57

我发现了一些很棒的像素背景,它们是为滚动背景和两者的视差而制作的,因此我能够混合和匹配来制作我的背景。在游戏更新中,我们检查背景图像的位置是否低于该偏移量(背景图像耗尽之前的位置),当低于该偏移量时,我们将其重新定位回起始位置,从而创建无限循环。我们需要找到背景的 Y 位置,即背景耗尽的位置,因此我们抓取父背景图像并将其在 Y 轴上移动,直到背景即将耗尽并记下 Y 位置。我们将创建一个脚本,将背景图像向下移动,然后当它到达 Y 位置时,我们将重新定位回原始位置,以创建这个无尽的滚动背景。

博客

Unity射击游戏开发教程:(24)创造不同的敌人

05-24

53

在这篇文章中,我们将讨论添加一个可以承受多次攻击的新敌人和一些动画来使事情变得栩栩如生。敌人没有任何移动或射击行为。这将有助于增强未来敌人的力量。我们将声明一个 int 来存储敌人可以承受的攻击数量,并将其设置为 3。首先,我们将跳转到 Enemy 脚本并使用 OnTriggerEnter2D 来检测物体何时与 Enemy 发生碰撞。如果标签是激光,我们将在 0.2 秒后摧毁激光,以便在摧毁激光之前给激光击中动画足够的时间播放。接下来,我们将命中计数减 1 并播放敌人命中动画。

博客

【go从入门到精通】精通并发编程-使用扇入扇出提升多个通道之间传递数据的效率

05-24

42

在并发编程领域,Golang 作为一种擅长处理并发的编程语言而脱颖而出。Go 并发模型的一个关键组件是通道,它允许 goroutine 进行通信并同步其工作。在这里,我们将探讨在 Go 中的多个通道之间传递数据的技术。当需要协调不同 goroutine 之间的工作并管理数据流时,这非常有用。了解 Go 通道在我们深入研究在多个通道之间传递数据之前,让我们简要回顾一下 Go 通道是什么以及它们如何工作。大家可以反看我之前的这篇文章:Go 通道是用于 goroutine 之间通信和同步的内置原语。

博客

Unity射击游戏开发教程:(23)Unity 中的跟踪导弹

05-23

21

在我们的游戏更新中,我们需要找到敌人的游戏对象,因此我们可以将其存储在目标变量中。现在我们已经知道了导弹到达敌人的方向,我们希望能够旋转它,使其面向目标。这需要的是当前的 Vector3,它将是transform.up(精灵的顶部),目标 Vector3(存储在我们的方向上,以及希望它在每帧之间移动的距离。如果发生碰撞时标签是“导弹”,我们就知道这是我们的导弹,我们可以输入所有摧毁敌人和导弹的代码。此时,我们有一枚正在工作的跟踪导弹,导弹将向目标旋转并同时向目标移动,但当它击中敌人时,什么也没有发生。

博客

【go从入门到精通】精通并发编程-sync.Map和map

05-23

258

另一方面,如果我们有大量写入工作负载,多个 goroutine 频繁更新数据,我们可能需要使用互斥锁或其他同步机制来确保一次只有一个 goroutine 可以访问数据。提供内置同步,对于读取繁重的工作负载很有用,但它有一些限制,并且比非并发使用的映射慢。通过了解这两种数据结构之间的差异和权衡,我们可以为我们的特定用例选择正确的一种,并优化我们的代码以提高性能和可扩展性。映射是无序键值对的集合,其中键是唯一的,值可以是任何类型。类型是 Go 中的内置类型,它为映射提供了安全且并发的替代方案,并在。

博客

Unity射击游戏开发教程:(22)快速火力提升

05-22

21

一旦玩家开火,我们将开火速率设置为 Time.time 的当前时间加上开火速率,这样它现在必须等待足够的时间才能再次开火。例如,如果玩家在 1 秒开火,则新的开火时间将为 1 + 开火速率,即 0.5。但是,当 Power Up 脚本调用 Rapid Fire Active 方法时,它将将该 bool 设置为 TRUE 并启动等待秒数为 5 秒的协程,这是在 bool 之前玩家可以使用连射的持续时间设置回 FALSE,这会禁用该功能,直到再次收集为止。

博客

【go从入门到精通】精通并发编程-sync.Once

05-22

517

提炼出来的,它使用 `atomic.StoreUint32` 将值设置为 1,表示该函数已被调用,然后使用 `atomic.LoadUint32` 来查看如果需要再次调用。无论有多少个 goroutine 调用它,atomic 包都会以安全的方式执行操作,这使得 `sync.Once` 和 `resync.Once` 是安全的。利用sync.Once,我们确保了只有在第一次调用时生成素数,之后的调用都可以快速获取之前生成好的素数。这样可以避免重复计算相同的素数,提高程序的效率。

博客

【go从入门到精通】精通并发编程-WaitGroup

05-21

352

Go 的 goroutine、通道和互斥体使得开发复杂的并发系统变得很容易。大多数问题都可以使用这三种机制来解决。正如我们前面提到的这篇文章,实际上协程是和很多知识点串起来的 , 并不是孤立的,因此在之前的这篇文章里,我将协程和channel,WaitGroup等知识点进行了综合,这篇文章又拆分来分享给大家。

博客

Unity射击游戏开发教程:(21)健康提升

05-21

31

在 Player 脚本中,添加“Increase Health”方法(将其公开,以便我们可以在 Power Up 脚本中调用它),这将处理生命的变化、更新引擎损坏和 UI 管理器。使用 IF ELSE 语句,如果生命值小于最大值 3,我们会将生命值增加 1,其他情况(如果生命值超过 3)我们会将生命值设置回 3,这样就不会超过最大数量。如果我们将 2 条生命移至 3 条生命,我们将关闭左侧引擎的损坏,如果生命从 1 条生命移至 2 条,我们将关闭右侧引擎的损坏。这使伤害动画与生命保持一致。

博客

如何实现比 PyTorch 还要快的置换/转置操作?

05-20

99

与PyTorch相比,在运行时间方面,OneFlow在fp32的情况下至少快3倍,最多可以达到3.2倍。最后一个维度不变,只交换维度1和2,那么我们可以使用更大的访问粒度来读取数据,然后进行Permute操作。以 PyTorch 为例,当数据大小为 128MB 进行 BatchTranspose 时,由于未合并访问内存,实际读取的数据量远大于写入的数据量(7-8 倍)。正如本文和之前关于CUDA优化的文章所示,内核优化有一些常用的方法,例如结合冗余来减少计算次数,调整访问粒度来提高访问效率。

博客

Unity射击游戏开发教程:(20)增加护盾强度

05-20

82

如果它是 2,我们访问 Sprite Render 并将颜色更改为洋红色,如果它是 1,我们将其更改为红色,如果它小于或等于 0,我们关闭 Visualizer 和 Shield Active。因此,如果 ShieldActive 不等于 true,我们会将其设置为 true,设置盾牌强度(决定盾牌可以承受的攻击次数),激活盾牌可视化器并设置盾牌可视化器的颜色。护盾展示器的颜色已经是青色,但由于我们会在受到攻击时更改颜色,因此我们不希望默认为最后一个颜色,因此每次激活时都需要重置。

博客

【go从入门到精通】精通并发编程-Go Mutex 互斥锁

05-17

454

Go 中的互斥锁是什么?编程中的并发性需要保护数据并防止进程之间的冲突。Go 的sync.Mutex 通过控制对共享资源的访问来简化这一过程。在这篇文章中,我们将探索 Go 中的互斥体,了解如何使用它们,并了解它们如何帮助防止冲突。互斥体代表互斥,有助于确保共享内容不被大量 goroutine 同时搞乱。它就像一把钥匙,一次只有一个 goroutine 可以拥有来使用代码的特殊部分。没有它,事情可能会变得混乱并出错。互斥体可以阻止这种情况发生。它们是 Go 标准同步包的一部分。Go 中的互斥锁是什么?

博客

Unity射击游戏开发教程:(19)控制生命进度条

05-17

120

我们不希望当前的健康状况超过最大健康状况,因此我们使用 If Then 来检查此情况,如果发生这种情况,我们会将当前值设置为最大值。在此游戏对象中,我们将添加到 UI 图像中,这些图像将作为生命值栏的填充和轮廓。回到检查器,我们将脚本附加到健康栏,将填充图像分配给填充变量并将最大值设置为我们想要的值。我们需要初始化的变量是两个整数,分别是生命值“条”的最大值和玩家生命值的当前值。对于每个UI图像,我们只需将之前上传的精灵图像拖到填充图像中,因为它是白色的,所以我们可以将颜色更改为我们想要的任何颜色。

博客

Unity射击游戏开发教程:(18)添加弹药计数+补充弹药

05-16

1452

添加简单的弹药计数我将讨论如何向游戏中添加简单的弹药计数。这将包括在 HUD 中添加弹药计数器,当弹药达到 0 时,文本会将颜色更改为红色以提醒玩家。另外,当弹药数为0时,玩家将无法再射击。让我们深入了解吧!在播放器脚本中我们需要添加一些变量。我们将创建两个公共整数,一个是最大弹药,另一个是当前弹药。下一个变量将是一个布尔值,并将跟踪玩家是否有弹药。这将在一开始就设置为 true。在开始时,我们只想确保当前弹药与最大弹药相同。

文章来源:https://blog.csdn.net/pbymw8iwm/article/details/136746649



微信扫描下方的二维码阅读本文

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容