如何以世界单位设置纹理的滚动速度?

时间:2019-05-16 20:09:20

标签: c# unity3d game-development

我试图用来自屏幕侧面的物体做一个无限的奔跑者。但是,对象的速度与地板纹理的速度不匹配。

public GameObject floorPrefab;
public GameObject g;
float floorSpeed = 3.0;


void FixedUpdate () {
    //Floor
    floorSpeed += 0.001f;

    floorPrefab.GetComponent<Renderer>().material.mainTextureOffset += new Vector2(floorSpeed * Time.fixedDeltaTime, 0.0f);

    //GameObject
    g.transform.Translate(-Vector2.right * floorSpeed * Time.fixedDeltaTime);
}

物体和材料应在x方向上以相同的速度传播。

我的地板是一个Quad,其中一个MeshRenderer沿x方向平铺了17次。

1 个答案:

答案 0 :(得分:1)

mainTextureOffset使用uv单位,Translate使用世界空间单位。您需要一种在它们之间进行转换的方法。

首先,您需要知道渲染器可以渲染多少个uv单位。这等于它一次显示纹理的一部分,或在渲染器上重复多少次。

uVcount = 17f; // repeats 17 times in the scrolling direction

然后,您需要知道渲染器以世界单位为单位(沿滚动方向)的长度。由于渲染器是轴向对齐的,因此变得很容易,因为我们可以使用renderer.bounds.size来查找网格的体积,然后使用renderer.bounds.size.x来查找长度。

Renderer rend = floorPrefab.GetComponent<Renderer>();
float rendererLength = rend.bounds.size.x;

现在剩下的就是将floorSpeed的世界单位fixedUpdate转换为UV单位fixedUpdate,然后将其用作偏移量的变化量:

float floorSpeedUV = floorSpeed  * uVcount / rendererLength;
rend.material.mainTextureOffset += new Vector2(floorSpeedUV * Time.fixedDeltaTime, 0.0f);

总的来说,看起来像这样:

public GameObject floorPrefab;
public GameObject g;
public float uVcount = 7f; // repeats 7 times in the scrolling direction
float floorSpeed = 3.0;
private Renderer rend;
private float rendererLength;

void Start () {
    rend = floorPrefab.GetComponent<Renderer>();
    rendererLength = rend.bounds.size.x;
}

void FixedUpdate () {
    //Floor
    floorSpeed += 0.001f;

    float floorSpeedUV = floorSpeed  * uVcount / rendererLength;
    rend.material.mainTextureOffset += new Vector2(floorSpeedUV * Time.fixedDeltaTime, 0.0f);

    //GameObject
    g.transform.Translate(-Vector2.right * floorSpeed * Time.fixedDeltaTime);
}