unity-在滚动背景上向左移动对象

时间:2018-08-06 00:43:58

标签: unity3d game-physics

我试图在Unity上创建一个简单的Infinite Runner游戏并遇到问题。任务是在地板上产生一个球,并立即开始向玩家左方滚动。我尝试了多种方法来实现它,但是它似乎没有用。这是我最近的尝试:

public class ObstaclePool : MonoBehaviour {

public GameObject columnPrefab;
public GameObject ballPrefab;
public int obstaclePoolSize = 5;
public float spawnRate = 3f;

private GameObject[] obstacles;
private int currentObstacle = 0;

private Vector2 objectPoolPosition = new Vector2(-15, -25);
private float timeSinceLastSpawned;

private float spawnXPosition;
private bool hasCalled = false;

private int dice;
bool beforeBall = false;
// Use this for initialization
void Start () {
    timeSinceLastSpawned = 0f;
    SetupObstacles();
}

private void SetupObstacles()
{
    obstacles = new GameObject[obstaclePoolSize];

    for (int i = 0; i < obstaclePoolSize; i++)
    {
        dice = Random.Range(1, 3);
        if (dice == 1)
        {
            obstacles[i] = (GameObject)Instantiate(columnPrefab, objectPoolPosition, Quaternion.identity);
        }
        else if (dice == 2)
        {
            obstacles[i] = (GameObject)Instantiate(ballPrefab, objectPoolPosition, Quaternion.identity);
        }
    }
}
// Update is called once per frame
void Update () {
    timeSinceLastSpawned += Time.deltaTime;

    if (GameControl.instance.gameOver == false && timeSinceLastSpawned >= spawnRate)
    {
        timeSinceLastSpawned = 0f;
        if (hasCalled == false)
        {
            spawnXPosition = 10f;
            hasCalled = true;
        }
        else
        {
            spawnXPosition = Random.Range(6f, 10f);
        }

        if (obstacles[currentObstacle].transform.tag == "Ball")
        {
            spawnXPosition = Random.Range(9f, 10f);
            obstacles[currentObstacle].transform.position = new Vector2(spawnXPosition, -1.84f);
            ballPrefab.GetComponent<Rigidbody2D>().AddForce(new Vector2(-100f, 0) * 5);
            beforeBall = true;
        }


        else {
            if (beforeBall == true)
            {
                spawnXPosition = Random.Range(9f, 10f);
                beforeBall = false;
            }

            obstacles[currentObstacle].transform.position = new Vector2(spawnXPosition, -7.08f);
            Debug.Log(spawnXPosition);
        }


        currentObstacle++;

        if (currentObstacle >= obstaclePoolSize)
        {
            currentObstacle = 0;
            SetupObstacles();
            hasCalled = false;
        }
    }
}

}

为了快速解释我的代码:我有一个大小为5的数组。它包含我创建的障碍。在决定放入数组中的内容时,我生成了一个随机数(1或2)。如果它是1,则放在一列中。如果是2,我放一个球。这些障碍物在屏幕外产生。然后,在使用随机数确定X位置后,将它们移动到实际场景中。

这部分是我尝试实现的地方:

        if (obstacles[currentObstacle].transform.tag == "Ball")
        {
            spawnXPosition = Random.Range(9f, 10f);
            obstacles[currentObstacle].transform.position = new Vector2(spawnXPosition, -1.84f);
            ballPrefab.GetComponent<Rigidbody2D>().AddForce(new Vector2(-100f, 0) * 5);
            beforeBall = true;
        }

我可能已经测试了一些残留的东西,因此某些代码可能显得多余且混乱。

我也尝试使用Translate和Velocity失败。我也有一个ScrollingObject代码和RepeatingBackground代码。我也将ScrollingObject代码放在Ball预制中。 (此外,尝试将其取出->右侧的滚球)。这些代码来自Unity教程。

RepeatingBackground:

public class RepeatingBackground : MonoBehaviour {

private BoxCollider2D groundCollider;
private float groundHorizontalLength;
// Use this for initialization
private void Awake () {
    groundCollider = GetComponent<BoxCollider2D>();
    groundHorizontalLength = groundCollider.size.x;
}

// Update is called once per frame
private void Update () {
    if (transform.position.x < -groundHorizontalLength)
    {
        RepositionBackground();
    }
}

private void RepositionBackground()
{
    Vector2 groundOffSet = new Vector2(groundHorizontalLength * 2f, 0);
    transform.position = (Vector2)transform.position + groundOffSet;
}

}

ScrollingObjects:

public class ScrollingObject : MonoBehaviour {

private Rigidbody2D rb2d;

// Use this for initialization
void Start () {
    rb2d = GetComponent<Rigidbody2D>();
    rb2d.velocity = new Vector2(GameControl.instance.scrollSpeed, 0);
}

// Update is called once per frame
void Update () {
    if (GameControl.instance.gameOver == true)
    {
        rb2d.velocity = Vector2.zero;
    }
}

}

2 个答案:

答案 0 :(得分:1)

您似乎在第一个示例中只是简单地命名了错误的对象。

        if (obstacles[currentObstacle].transform.tag == "Ball")
    {
        spawnXPosition = Random.Range(9f, 10f);
        obstacles[currentObstacle].transform.position = new Vector2(spawnXPosition, -1.84f);
        ballPrefab.GetComponent<Rigidbody2D>().AddForce(new Vector2(-100f, 0) * 5);
        beforeBall = true;
    }

请注意,此处是如何将力添加到预制件上,而不是预制件的实例化版本。

答案 1 :(得分:0)

我玩了一些,然后开始工作了。我刚刚写了另一个脚本,给对象增加了力量。我仍然不明白为什么我的原始方式仍然无法使用。