创建 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类会搜索附近的僵尸。
如果找到僵尸,玩家坐标和僵尸坐标之间的向量就会成为火焰射线。
子弹的散射方式与上述相同。

子弹发射后,子弹类会自主移动。如果
它移动并击中僵尸,系统会检测到碰撞,并通过删除自身来阻止子弹穿透。
即使没有击中,子弹也会在一段时间后自动删除自身。

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

、二级

、三级

砖(犁)

① 向上投掷。②
以弧线轨迹落到一定高度。③
到达底部(屏幕外)时删除。④
即使击中僵尸也能穿透(最多三个)
。⑤ 根据关卡增加投掷次数。(投掷有延迟。)

该武器的配置方式与霰弹枪相同。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 级

守护者(镰刀)

围绕玩家旋转的那个。

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

是的,它的要求最少。

构造方法相同。创建一个带有 Weapon_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
568
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

松山健翔

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