制作Da○Saba○酒吧(第3名)
我还有一个内部学习课程,所以我有一些空闲时间。
感谢您的辛勤工作。
我是系统开发部的松山先生。
为您带来从上期开始突然开始的《制作D○Saba○酒吧》的第三期。
第一期请点击这里↓
点击这里查看第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/