Препятствия и фон не прокручиваются одновременно
У меня и моего друга из колледжа есть идея игры, в которой препятствия объединяются в пул объектов, а затем прокручиваются по экрану (справа налево) с той же скоростью, а фон прокручивается (справа налево), чтобы создать иллюзию персонажа игрока. бежит. Это работает до сих пор.
Однако мы хотим сделать так, чтобы фон и препятствия постепенно увеличивались со временем, оставаясь с той же скоростью, что и друг с другом, чтобы сделать игру более сложной для пользователя.
У нас было множество проблем при реализации этого. Первоначально мы пытались добавить модификатор скорости к обеим базовым скоростям, но это привело к совершенно разным скоростям. Я считаю, что это как-то связано с тем, что мы используем смещение текстуры для перемещения фона, но для препятствий мы используем скорость. Если это помогает, все (кроме фона, камеры, 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);
}
}