创建 Da○saba○ber(第 2 号)

我想这次应该没让您久等。
这位是系统开发部的松山先生。

现在我们为您带来“打造 Da○saba○bar”系列的第二部分,该系列从上一期突然开始。

第一期内容在此↓

创建 Da○saba○bar(第一期)

在第一期中,我们展示了玩家、敌人和场地,并实现了移动玩家的功能。

我认为《Da○saba○ber》的魅力在于用各种各样的武器击败大量僵尸所带来的快感,所以我计划在第二期中加入武器系统。

武器类型

然而,要实现所有众多的武器类型需要花费太多的时间和精力,所以目前我将缩小范围到大约三种类型。

① 霰弹枪(默认武器)
② 砖块
③ 守护者

就在这附近。

和往常一样,我搜索了《不死幸存者》中可以用作素材的图片,并使用了它们。

① 确实有一把霰弹枪,和描述的一模一样
。② 没有砖块。我有农具,所以我想我可以扔个犁。③
也没有圆盘状的守卫者。我挥舞镰刀吧。

霰弹枪

明确需求。

① 向玩家面向的方向(移动方向)开火。②
子弹数量随等级提升而增加。③
射击间隔随等级提升而缩短
。④ 射程随等级提升而增加
。⑤ 若附近有僵尸,则自动向僵尸射击(自动瞄准)。⑥
子弹会沿①方向飞行一段时间后消失。⑦
子弹击中僵尸后不会穿透。

这种情况出乎意料地普遍。

步骤①至⑤描述了发射前的准备过程(武器_1)。
步骤⑥至⑦描述了子弹的发射过程(子弹)。

因此,我们将它们分成不同的类别。Weapon_1
会生成一颗子弹,其理念是发射的子弹会自行移动并消失。

基本上,你可以从 Player 类中获取玩家的朝向,并确定参考射击线。
然后,根据子弹数量,将射击线相对于起始点(玩家坐标)旋转 ±n°,即可使子弹呈扇形散布。

这些参数是为控制目的而提供的。

// 子弹发射间隔(3 个级别) private readonly float[] interval = { 1.5f, 1.25f, 1.0f }; // 子弹射程(3 个级别) private readonly float[] range = { 4.0f, 6.0f, 8.0f }; // 同时发射的子弹数量(3 个级别) private readonly int[] simultaneous = { 1, 3, 5 }; // 射击角度(5 个方向:取决于同时发射的子弹数量) private readonly float[] angle = { 0, 10, -10, 20, -20 };

对于第⑤点,
使用EnemyController类来搜索附近的僵尸。
如果找到僵尸,玩家坐标和僵尸坐标之间的向量就成为射击线。
子弹散射情况与上述相同。

子弹发射后,子弹类会自主移动。如果
它移动并击中僵尸,则会触发碰撞检测,并通过删除自身对象来创建无法穿透的状态。
即使没有击中目标,子弹也会在一段时间后自动删除自身。

至此,霰弹枪制作完成。
以下是成品:
一级

、二级

、三级

砖(犁)

① 向上投掷。②
从一定高度沿弧线下落。③
下落完毕后(出屏幕外)消失。④
即使击中僵尸,也能穿透它们(但最多只能穿透3个)。⑤
投掷次数随关卡增加。(投掷有时间延迟。)

我们将使用类似于霰弹枪的类结构。Weapon_2
将生成一个犁状物。犁状物将沿抛物线弧线飞行。
敌人的位置无关紧要。

最大的问题在于绘制抛物线的公式。
一番搜索之后,我找到了一个很棒的网站。
让箭矢沿抛物线轨迹飞行(二维,忽略重力)
。感谢 Hatena Blog。
该公式可以找到由起点 (p0)、顶点 (p1) 和终点 (p2) 指定的贝塞尔曲线上的坐标。我
将创建一个协程,在顶点附近将箭矢的方向旋转 180°。

///<summary>画一条抛物线</summary>///<param name="p0">起点</param>///<param name="p1">顶点(相对坐标)</param> ///<param name="p2">终点(相对坐标)</param> ///<returns>协程</returns>IEnumerator Throw (Vector3 p0, Vector3 p1, Vector3 p2) { float distance = Vector3.Distance(Vector3.zero, p2); float speed = 0.3f; float t = 0f; while (t <= 1 && isAlive) { float Vx = 2 * (1f - t) * t * p1.x + Mathf.Pow (t, 2) * p2.x + p0.x; float Vy = 2 * (1f - t) * t * p1.y + Mathf.Pow (t, 2) * p2.y + p0.y; transform.position = new Vector3 (Vx, Vy, 0); t += 1 / distance / speed * Time.deltaTime; // 当 t 在 0.4 到 0.6 之间时,逐渐旋转 180 度 if (t > 0.4f && t < 0.6f) { float angle = Mathf.Lerp(0, courseGoal[course], (t - 0.4f) / 0.2f); transform.rotation = Quaternion.Euler(0, 0, angle); } yield return null; } Destroy (this.gameObject); }

* p1 和 p2 需要是相对坐标值,因此已更正(2024 年 3 月 22 日)

然后,在生成犁时指定 p0 到 p2。
给顶点高度和起点到终点的宽度添加随机数,可以使其看起来更逼真。
最终效果如下所示:
第 1 层

、第 2 层

、第 3 层

守护者(镰刀)

围绕玩家旋转的那个。

①围绕玩家旋转
②随着等级提升,数字增加
③击中僵尸后不会消失(穿透)

是的,它的要求最少。

构造方法相同。创建一个带有武器3属性的镰刀类。
根据你想要部署的数量,将它们等距放置,并让它们以相同的速度旋转。
对于圆周运动,你可以使用三角函数计算坐标(偏移值)。
然后,由于它们会跟随玩家移动,只需加上玩家的坐标即可。

有了这些定义,

// 半径 public const float Radius = 4.0f; // 旋转速度(每秒) private const float RotateSpeed = 270f; // 旋转速度(每秒) private const float SpinSpeed = 1080f; // 角度(用于确定位置的角度) private float rotateAngle = 0.0f; // 角度(旋转角度) private float spinAngle = 0.0f;

其余部分由框架处理。

void Update() { // 增加旋转角度 rotateAngle -= RotateSpeed * Time.deltaTime; // 增加旋转角度 spinAngle -= SpinSpeed * Time.deltaTime; // 将旋转角度转换为弧度 float rad = rotateAngle * Mathf.Deg2Rad; // 将旋转角度转换为弧度 float spinRad = spinAngle * Mathf.Deg2Rad; // 更新位置 Vector2 pos = player.Position; transform.position = new Vector3( pos.x + Radius * Mathf.Cos(rad), pos.y + Radius * Mathf.Sin(rad), 0.0f ); // 更新旋转角度 transform.rotation = Quaternion.Euler(0.0f, 0.0f, spinAngle);

镰刀本身会随着圆周运动而旋转。
以下是成品:↓
第一级

、第二级

、第三级

调试用户界面

创建调试界面以检查操作。

- 所有武器均可设置为 1-3 级。-
武器 1 默认等级为 1 级。-
武器 2 和 3 初始状态下无法获得。

您可以通过添加旧式按钮等快速创建它。

本月内容就到这里。

今天就到这里。
多亏了我参考的网站,我觉得我才能相对快速地完成它。
即使是小游戏,用 Unity 创作也很有趣。

顺便说一下,这是它全力攻击时的样子。

下次

僵尸行为
获取

我希望能够实现类似这样的功能。

整个项目像往常一样已发布在 GitHub 上。
希望对您有所帮助。BeBe
Survivor

好了,今天就到这里。

如果您觉得这篇文章对您有帮助,请点个“赞”!
7
加载中...
7票,平均分:1.00/17
614
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

松山健翔

我曾在一家游戏开发公司工作多年,负责编程和项目管理等工作。
2019年,我加入Beyond Inc.,在横滨办公室工作。
我主要负责服务器端开发的项目管理(偶尔也参与编程)。
我的爱好是公路自行车赛和观看赛马。