障碍物和背景不同时滚动

时间:2018-08-26 21:42:13

标签: c# unity3d unity3d-2dtools

我和一个来自大学的朋友有一个游戏主意,将障碍物聚集在对象池中,然后以与背景滚动(从右到左)相同的速度在屏幕上(从右到左)滚动以产生幻觉玩家的角色正在运行。到目前为止有效。

但是,我们希望使背景和障碍物随着时间的流逝而逐渐增加速度,同时保持彼此相同的速度,从而使游戏对用户来说更加困难。

我们在执行此操作时遇到了很多麻烦。最初,我们试图在两个基本速度上都添加一个速度修改器,但这导致了截然不同的速度。我认为这与以下事实有关:我们使用纹理偏移来移动背景,但是对于障碍物,我们使用了速度。如果有帮助,那么所有东西(除了背景,相机,EventSystem和GameController)都在画布中,因为那是我们当时知道如何缩放的唯一方法。

那么,我们在做什么错了?

背景滚动代码:

created_by

障碍物滚动代码:

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);
}
}

1 个答案:

答案 0 :(得分:2)

使用此:

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);
}
}