0%

记Brackeys Game Jam 2020

忙碌的生活中抽出两个半天的时间,完成了这次在itch上举办的线上Game Jam。这一次的topic是Hole,很容易就想到了黑洞的题材,吃了上次GGJ好高骛远的教训,这次从简单的方向去考虑。

想法非常简单,我们知道黑洞是很难被看到的,但是它拥有巨大的引力,于是我们扮演一架宇宙中的飞船,通过发射探测器,观察探测器受到引力影响产生的轨迹变化,来判断黑洞的位置。
其实基本没有什么特别的东西,唯一需要考虑一下的就是黑洞引力的实现。
黑洞其实就是一个empty object,然后通过在上面挂脚本来对圆形范围内的物体产生力的作用。检测范围内的物体,我们可以使用collider,一开始是想当物体与黑洞的collider发生碰撞,就施加一个朝向黑洞中心的力,但是这样有一个问题就是只会在碰撞的那一瞬间产生力,而当物体完全进入圆圈范围之后,就没有效果了。于是采用另一种方法,依然是collider,只不过代码中我们使用Physics2D.OverlapCircleAll()这个函数,它的三个参数分别是圆心,半径,和layer,前两个确定了检测的范围,layer用于过滤不受影响的物体。返回值是一个包含范围内所有符合条件的collider的数组,这种Overlap方法在各类游戏中还是蛮常见的,比如moba游戏里面的攻击范围那个圈圈,比如一些aoe伤害,比如炸弹爆炸对周围物体的冲击。我们要实现的黑洞效果就比较类似于炸弹爆炸,只不过力的方向是向内的。
另外一点值得一提的是力的计算,常规的AddForce出来的效果很怪,不是我预想的效果,比较符合条件的是AddExplosionForce这个方法,但是2D里面竟然没有这个方法,但是没有关西,我们知道引力由两个物体的质量和二者之间的距离决定(简单的初中物理),由于我们只有黑洞和探测器这两种物体,所以他们的质量比值我们就可以用一个常数来代替了,然后与距离成反比就可以了。
于是代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void FixedUpdate ()
{
Collider2D[] colliders;
Rigidbody2D rigidbody;
colliders = Physics2D.OverlapCircleAll (transform.position, m_Radius, m_MagneticLayers);
foreach (Collider2D collider in colliders)
{
GameObject obj = collider.gameObject;
rigidbody = (Rigidbody2D) obj.GetComponent<Rigidbody2D>();
if (rigidbody == null)
{
continue;
}
Vector3 m_Position = obj.transform.position;
distance.x = transform.position.x - m_Position.x;
distance.y = transform.position.y - m_Position.y;
float GForce = (float)(Math.Pow(distance.x,2)+Math.Pow(distance.y,2))*10;
rigidbody.AddForce (m_Force * (transform.position - m_Position)/GForce);

}
}

根据玩家找到的黑洞位置与真实位置的误差,算上用了多少探测器,计算最后的得分。距离越远,使用的探测器越多,分数越低。分数太低或者距离太远游戏就失败,否则可以进入下一关,每更新一关,就随机产生黑洞位置,然后黑洞引力范围根据关卡数依次递减来增加难度。
其他的也没啥好说了,比较懒也比较忙,于是甚至没有音效和UI,加了一点粒子系统和一点特效就草草提交了。前前后后算来也就6个小时差不多。
游戏传送门
代码传送门