制作Da○Saba○酒吧(No.2)
我希望这次我不用等那么久。
我是系统开发部的松山先生。
为您带来从上期开始突然开始的《制作大○萨巴○酒吧》第二期。
第一期请点击这里↓
在第一期中,我们甚至显示了玩家的敌人区域并实现了移动玩家的功能。
我认为《Da○Saba○Bar》的魅力在于用各种各样的武器消灭大量僵尸的爽快感,所以我计划在第二期中加入武器。
武器类型
然而,要实现所有大量的武器类型需要太多的工时,所以我想我现在将其范围缩小到大约三种。
① 霰弹枪(默认武器)
② 砖块
③ 守护者
在这附近。
像往常一样,我会从Undead Survivor中寻找可以用作资源的图像并使用它们。
① 霰弹枪本身是准确的。
② 没有砖块。农具我都有了,所以我要扔犁了。 ③
圆盘上也没有守护者。让我们旋转“卡玛”
霰弹枪
确定需求。
① 向玩家方向(行进方向)射击
② 发射的子弹数量根据等级而增加
③ 射击间隔
根据等级而变短 ④ 射击范围根据等级而增加
⑤ 附近有僵尸
⑥ 子弹会飞朝①方向持续一定时间并消失。
击中僵尸,则不会穿透。
事情出乎意料地发生了。
①~⑤为射击前的过程(Weapon_1)
⑥~⑦为子弹过程(Bullet)
因此,我们将它们分成不同的类。
使用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[]并发 = { 1, 3, 5 }; // 发射角度(5 个方向:取决于同时发射的数量) private readonly float[] angle = { 0, 10, -10, 20, -20 };
关于⑤,
让EnemyController类搜索附近的僵尸。
如果是这样,则玩家坐标和僵尸坐标之间的向量就成为射线。
子弹的散射与上面相同。
发射子弹后,Bullet 类会自主移动。
如果您移动并击中僵尸,您将获得碰撞检查,因此您可以通过删除自己的对象来创建僵尸不会穿透的状态。
即使不起作用,在一段时间后仍然会被删除。
这样,霰弹枪就完成了。
成品如下↓
・1级
・2级
・3级
砖(类似)
① 向上投掷
② 在一定高度以弧线落下
③ 落下结束后将其删除(屏幕外)
④ 即使击中僵尸也能穿透(最多 3 个僵尸)
⑤ 投掷次数根据等级而增加。 (不同时间投掷)
职业构成将类似于霰弹枪。
使用 Weapon_2 生成犁。之后,犁本身将沿抛物线飞行。
敌人的位置并不特别重要。
最大的问题是画抛物线的公式。
经过一段时间的搜索,我发现了这个很棒的网站。
如果您想以抛物线形状飞行箭头(忽略二维重力),
那么它是完美的。感谢哈特纳博客。
这是计算由起点 (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 t = 0f; while (t <= 1 && isAlive) { float Vx; = 2 * (1f - t) * t * p1.x + Mathf.Pow (t, 2) * p2.x + p0.x; 浮点 Vy = 2 * (1f - t) * t * p1.y + Mathf .Pow(t,2)*p2.y+p0.y;transform.position = new Vector3(Vx,Vy,0);//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); 变换。 Euler(0, 0, 角度); } 产量返回 null; } 销毁 (this.gameObject);
* 修复因为p1和p2需要是相对坐标值(2024.3.22)
然后在生成Plow时指定p0到p2。
您可以通过将随机数添加到顶点的高度以及从起点到终点的宽度来创建一些变化,使其看起来像这样。
成品如下↓
・1级
・2级
・3级
守护者(镰刀)
围绕玩家旋转的那个。
① 围绕玩家旋转
② 数量随等级增加而增加
③ 即使被僵尸击中也不会消失(穿透)
是的。它的要求最少。
用同样的方法制作。使用 Weapon_3 生成 Sickle 类。
只需根据要放置的件数以相等的间隔放置它们,并以相同的速度旋转它们即可。
可以使用三角函数计算圆周运动的坐标(偏移值)。
由于它会跟随玩家,因此您所要做的就是添加玩家的坐标。
有了这些定义,
// 半径 public const float Radius = 4.0f; // 旋转速度(秒) private const float RotateSpeed = 270f; // 旋转速度(秒) private const float SpinSpeed = 1080f; // 角度(角度来确定)位置 ) private floatrotateAngle = 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 = new Vector3( pos. x + Radius * Mathf.Cos(rad), pos.y + Radius * Mathf.Sin(rad), 0.0f ); // 更新旋转变换.rotation = Quaternion.Euler(0.0f, 0.0f, spinAngle);
随着圆周运动,镰刀本身也旋转。
成品如下↓
・1级
・2级
・3级
调试用户界面
创建调试UI来检查操作。
- 所有武器均可设置1至3级
- 武器1默认为1级
- 武器2和3不是一开始就获得的
添加旧版按钮等以加快速度。
这就是本月的全部内容
现在就这些了。
我认为我能够快速实现它,部分归功于我引用的网站。
使用 Unity 创建事物很有趣,即使是在迷你游戏级别也是如此。
顺便说一下,完整的攻击状态是这样的。
下次
・收集僵尸生态
/经验值并提升武器等级
我希望我能实现这一点。
与往常一样,整个项目都可以在 GitHub 上找到。
我希望这会对您有所帮助。
贝贝幸存者
好了,现在就这些了。