我想做一场无尽的亚军比赛。我有2个物体,一个在顶部,一个在底部。玩家必须跳跃或蹲在物体上。我创建了一个创建这些对象的脚本,但有时在同一个位置创建了两个对象,因此玩家无法做任何事情。怎么解决?我可以检查X轴上的其他物体,但不能检查对撞机吗?
答案 0 :(得分:1)
基本上你要我们给你我们的关卡生成器和游戏控制器源代码!你必须为你的游戏写一个。不是因为我们不想给你代码,而是因为每个游戏都必须有自己的代码。
对于初学者,你可以:
将您的游戏区域划分为矩阵,然后使用某种数组,其中每个单元格可以有一个游戏对象或为空。然后游戏对象可以在该单元格中拥有自己的本地位置。显然,一个单元格不能包含两个游戏对象。
有一个关卡生成器,告诉游戏控制器应该在哪里生成新对象。但是,您应该在级别生成器中实现某些内容以防止重叠。
看看这个psudo代码:
void FixedUpdate()
{
if (player.transform.position.x + Half_of_screen_width_plus_margin > nextX)
{
Spawn(tmp[i].prefab, nextX);
nextX += tmp[i].distanceToNext;
i++;
}
}
Half_of_screen_width_plus_margin
可以让游戏预见即将发生的事情
tmp[]
是要实例化的(未实例化的)对象的集合。每个对象都是任意定义的。
如您所见,脚本每隔fixedDeltaTime秒检查下一个位置,并将屏幕末尾的位置x与下一个位置x进行比较。如果通过则创建下一个对象并将下一个位置x更改为另一个位置。
如果你想使用随机生成,那么tmp []应该改为tmp。每个实例化的位置都会生成下一个:
void FixedUpdate()
{
if (player.transform.position.x + Half_of_screen_width_plus_margin > nextX)
{
Spawn(tmp.prefab, nextX);
nextX += tmp.distanceToNext;
tmp = generate_new_random_object();
}
}
答案 1 :(得分:0)
当您调用该函数来实例化您的游戏对象时,请检查最后一个游戏对象的x位置是否与您将要使用的位置不同。
private Vector3 LastObjectPosition, NewObjectPosition;
private float minDistanceBetweenTwoObstacles = 5;
public void InstantiateNewObstacle()
{
// Check if the x position of the new object isn't the same
// as the the x position of the last object
if (NewObjectPosition.x != LastObjectPosition.x)
{
// Instantiate your gameobject
MyInstantiate();
}
// Else increase the x value for the x position of the new object
// and then instantiate your gameobject
else
{
NewObjectPosition.x += minDistanceBetweenTwoObstacles;
MyInstantiate();
}
}
public void MyInstantiate()
{
// Instantiate your prefab at the NewObjectPosition position
Instantiate(new GameObject(), NewObjectPosition, new Quaternion());
// Save the position of the new object as the position
// of the last object instantiated
LastObjectPosition = NewObjectPosition;
}
希望这可以帮到你!