首页 > 解决方案 > 如何以世界单位设置纹理的滚动速度?

问题描述

我正在尝试用来自屏幕一侧的物体制作一个无限跑步者。但是,对象的速度与地板纹理的速度不匹配。

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方向行进。

我的地板是在一个方向上铺QuadMeshRenderer17 次瓷砖x

标签: c#unity3dgame-development

解决方案


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世界单位 per转换fixedUpdate为 UV 单位 per 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);
}

推荐阅读