Препятствия и фон не прокручиваются одновременно

У меня и моего друга из колледжа есть идея игры, в которой препятствия объединяются в пул объектов, а затем прокручиваются по экрану (справа налево) с той же скоростью, а фон прокручивается (справа налево), чтобы создать иллюзию персонажа игрока. бежит. Это работает до сих пор.

Однако мы хотим сделать так, чтобы фон и препятствия постепенно увеличивались со временем, оставаясь с той же скоростью, что и друг с другом, чтобы сделать игру более сложной для пользователя.

У нас было множество проблем при реализации этого. Первоначально мы пытались добавить модификатор скорости к обеим базовым скоростям, но это привело к совершенно разным скоростям. Я считаю, что это как-то связано с тем, что мы используем смещение текстуры для перемещения фона, но для препятствий мы используем скорость. Если это помогает, все (кроме фона, камеры, EventSystem и GameController) находится в пределах холста, потому что это был единственный способ, которым мы знали, как масштабировать в то время.

Итак, что мы здесь делаем не так?

Код фоновой прокрутки:

using UnityEngine;

public class Background : MonoBehaviour
{

/*
 * 
 * A script that's sole purpose is to create a scrolling, infinite background.
 * Attached to: Brick
 * Scene: Level0
 *
 */

public float scrollSpeed;
private Vector2 savedOffset;
private Renderer rndrer;
private float conversionFactor = 0.1f;
public static Background instance;

private void Start()
{
    rndrer = GetComponent<Renderer>();
    savedOffset = rndrer.material.GetTextureOffset("_MainTex");
}

private void FixedUpdate()
{
    this.rndrer.material.SetTextureOffset("_MainTex", new Vector2((GameControl.speed * conversionFactor), 0));
}

private void OnDisable()
{
    rndrer.sharedMaterial.SetTextureOffset("_MainTex", savedOffset);
}
}

Код прокрутки препятствий:

using UnityEngine;

public class ObstacleScrolling : MonoBehaviour
{

/*
 * 
 * A script which controls the movement of the Obstacles to make it look like the player is running towards them.
 * Attached to: [All Obstacles in the Prefabs folder]
 * Scene: Level0
 * 
 */

private Rigidbody2D rb2d;
public float scrollSpeed;
public float test;
GameObject canvasObj;
Canvas canvas;

// Use this for initialization
void Start()
{
    rb2d = GetComponent<Rigidbody2D>();

    canvasObj = GameObject.Find("Canvas");
    canvas = canvasObj.GetComponent<Canvas>();

    test = -1280 * canvas.scaleFactor;

    scrollSpeed = scrollSpeed * canvas.scaleFactor; //+ -(Time.timeSinceLevelLoad / 100);
}

// Update is called once per frame
void FixedUpdate()
{
    this.transform.Translate(Vector3.right * GameControl.speed);

    if (GameControl.instance.gameOver == true)
    {
        rb2d.velocity = Vector2.zero;
    }
}
}

1 ответ

Решение

Использовать этот:

public class GameControl : MonoBehaviour
{
private static float speedFactor = 1.0f; // you can set this to canvas scale
private static float speed = 1.0f;

public static float ScaledSpeed
{
    get
    {
        return speed * speedFactor;
    }
}

void FixedUpdate()
{
    speed += 0.01f * Time.deltaTime;
}
}

и это:

public class Background : MonoBehaviour
{
private Vector2 savedOffset;
private Vector2 offset;
private Renderer rndrer;
private float conversionFactor = 0.1f;

private void Start()
{
    rndrer = GetComponent<Renderer>();
    savedOffset = rndrer.material.GetTextureOffset("_MainTex");
    offset = savedOffset;
}

private void FixedUpdate()
{
    offset += new Vector2(GameControl.ScaledSpeed * conversionFactor, 0);
    this.rndrer.material.SetTextureOffset("_MainTex", offset);
}
}

и это:

public class ObstacleScrolling : MonoBehaviour
{
void FixedUpdate()
{
    this.transform.Translate(Vector3.right * GameControl.ScaledSpeed);
}
}
Другие вопросы по тегам