[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

[大阪/横滨/德岛] 寻找基础设施/服务器端工程师!

【超过500家企业部署】AWS搭建、运维、监控服务

【超过500家企业部署】AWS搭建、运维、监控服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

【CentOS的后继者】AlmaLinux OS服务器搭建/迁移服务

[仅适用于 WordPress] 云服务器“Web Speed”

[仅适用于 WordPress] 云服务器“Web Speed”

[便宜]网站安全自动诊断“快速扫描仪”

[便宜]网站安全自动诊断“快速扫描仪”

[预约系统开发] EDISONE定制开发服务

[预约系统开发] EDISONE定制开发服务

[注册100个URL 0日元] 网站监控服务“Appmill”

[注册100个URL 0日元] 网站监控服务“Appmill”

【兼容200多个国家】全球eSIM“超越SIM”

【兼容200多个国家】全球eSIM“超越SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

[如果您在中国旅行、出差或驻扎]中国SIM服务“Choco SIM”

【全球专属服务】Beyond北美及中国MSP

【全球专属服务】Beyond北美及中国MSP

[YouTube]超越官方频道“美由丸频道”

[YouTube]超越官方频道“美由丸频道”

制作Da○Saba○酒吧(第3名)

我还有一个内部学习课程,所以我有一些空闲时间。
感谢您的辛勤工作。
我是系统开发部的松山先生。

为您带来从上期开始突然开始的《制作D○Saba○酒吧》的第三期。

第一期请点击这里↓

制作Da○Saba○bar(第一期)

点击这里查看第2期↓

制作Da○Saba○酒吧(No.2)

在第 2 期中,我们甚至实现了玩家可以使用的三种武器(最高等级 3)。
在第三期中,我们将实现僵尸的生态(生成和移动)并使用收集的经验值进行升级。

僵尸一代

我认为游戏系统是为了生存一定的时间,所以我认为要求是随着时间的推移增加僵尸出现的数量。
因此,我准备了两种类型的生成处理。

① 每隔一定时间(短)出现一具尸体
② 每隔一定时间(长)出现大量生物(波)

①是初始武器等级低,到处都容易获得经验值的图像。
②是出现大量武器,必须逃跑但要提高武器等级的图像。当武器等级上升并进入种族灭绝模式时的兴奋感真是令人感动。

两者都会在距玩家位置一定距离处生成。
另外,使用协程来处理一定时间的等待。

每隔一段时间生成一个身体的过程就是这样。

private IEnumerator spawnBase() { const int MAX_BASE_ENEMYS = 50; const float spawnRadiusMin = 8.0f; const float spawnRadiusMax = 1f; var waitTime = new WaitForSeconds(spawnInterval) { // 始终为 MAX生成身体敌人,使其存在 if(enemies.Count < MAX_BASE_ENEMYS) { // 玩家位置 Vector2 playerPos = playerController.GetPlayer().Position; // 确定放置半径 float r = UnityEngine.Random.Range(spawnRadiusMin , spawnRadiusMax) ; // 确定放置角度 float angle = UnityEngine.Random.Range(0, 360); // 生成 spawn(playerPos, r, angle); } yield return waitTime;

・每秒
・最多 50 个物体
・距离玩家 8.0 到 10.0 的距离
・以玩家为中心以 0.0 到 360.0 的角度随机生成
使用像这样的 spawn 函数
执行生成

Wave(②)的基本实现与①相同。
坐标、角度和生成将根据生成的僵尸数量而重复。
出现的次数会逐渐增加,第二次出现的频率比第一次出现的频率更高。
只摘录了那部分。

// 确定wave的生成数量(最大100) float spawnNum = Mathf.Min(wave * 10, MaxSpawnNum); // 等间隔排列 float angleRange = 360 / spawnNum; // 玩家位置 Vector2 playerPos = playerController.GetPlayer ().Position; // 生成 for(int i = 0; i < spawnNum; i++) { // 确定放置半径 float r = spawnRadiusMax + UnityEngine.Random.Range(-1.0f, 1.0f);确定角度 float angle = angleRange * i; // Spawn spawn(playerPos, r, angle);

是这样的。

僵尸移动

这是我看到主屋时得到的结果。
・比玩家慢
・向玩家移动
・跟随性似乎较低
,因此处理是
1)找到朝向玩家的向量
2)朝该方向移动一定时间
3)返回到 1)
这似乎是就足够了。

private void walk() { // 步行 this.transform.localPosition += new Vector3(walkInfo.course.x * WalkSpeed ​​* Time.deltaTime, walkInfo.course.y * WalkSpeed ​​* Time.deltaTime, 0); // 更新计时器 walkInfo.timer -= Time.deltaTime; // 如果计时器小于 0,则重置它 if(walkInfo.timer < 0) { walkInfo.timer = walkInfo.interval; // 计时器 walkInfo.course = ( walkInfo.player.Position - this.transform.localPosition).normalized; // 行走方向 } }

无需停止,只需执行 Update() 中的每一帧即可。

是这样的。

经验值

我不知道它是否被正确地称为经验值,但它是你为了获得武器和升级而收集的东西。
当僵尸被击败时它们会被放置,当玩家接近时它们会被收集。
在Enemy类中死亡动画结束时,通过ExpController类生成一个Exp对象。

生成过程

public void OnAnimationEnd() { // 死亡动画结束后销毁 if (status == Status.Dead) { expController.Spawn(this.transform.localPosition); Destroy(this.gameObject);

要收集,请使用 Vector2.Distance 函数找到距玩家的距离,并将阈值内的对象移向玩家坐标。这也是由协程处理的。

恢复过程

private IEnumerator move() { var elapsedTime = 0f; var startPosition = transform.localPosition; while (elapsedTime < 1f) { var targetPosition = playerController.GetPosition(); elapsedTime += Time.deltaTime * MoveSpeed; (startPosition, targetPosition, elapsedTime); 产量返回 null; }

是这样的。

武器级别的 UI

如果你收集到一定数量的经验值,你就可以获得武器或升级。
每个武器的等级控制已在第2期中实现,因此我们将准备它以便可以通过UI进行操作。

・灰色底衬:面板
・武器图标:按钮
・文本和★☆:文本
通过组合这些,您可以创建看起来像这样的东西。

这是成品

将此实现与第一个问题和第二个问题结合起来,它看起来像这样。

现在不是更这样了吗?

我想通过添加玩家
HP 管理
、时间限制
和磁铁

与往常一样,整个项目都可以在 GitHub 上找到。
这个博客有很多来源,所以如果你想查看全部内容,请查看这里。
我希望这会对您有所帮助。
贝贝幸存者

好了,现在就这些了。

第一期请点击此处↓
https://beyondjapan.com/blog/2024/02/survivor/

点击此处查看第 2 期↓
https://beyondjapan.com/blog/2024/03/survivor2/

如果您觉得这篇文章有帮助,请点赞!
7
加载中...
7 票,平均:1.00 / 17
287
X Facebook 哈特纳书签 口袋
[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

[2025.6.30 Amazon Linux 2 支持结束] Amazon Linux 服务器迁移解决方案

写这篇文章的人

关于作者

松山贤章

他长期在一家游戏开发公司工作,从事程序和项目管理工作。
2019年加入超越株式会社。
在横滨办事处工作。 主要负责服务器端开发工作的项目管理。
(有时编程)我的爱好是骑自行车(公路赛车)和观看赛马。