Unity中的随机对象

时间:2017-02-02 15:48:57

标签: object unity3d collider

我想做一场无尽的亚军比赛。我有2个物体,一个在顶部,一个在底部。玩家必须跳跃或蹲在物体上。我创建了一个创建这些对象的脚本,但有时在同一个位置创建了两个对象,因此玩家无法做任何事情。怎么解决?我可以检查X轴上的其他物体,但不能检查对撞机吗?

2 个答案:

答案 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;
    }

希望这可以帮到你!