Как установить скорость прокрутки текстуры в мировых единицах? - PullRequest
1 голос
/ 16 мая 2019

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

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.

MyЭтаж Quad с MeshRenderer, который 17 раз укладывает плитку в направлении x.

1 Ответ

1 голос
/ 17 мая 2019

mainTextureOffset в ультрафиолетовых единицах, а Translate использует мировые космические единицы. Вам нужен способ конвертировать между ними.

Во-первых, вам нужно знать, сколько ультрафиолетовых единиц вы видите в вашем рендерере. Это будет эквивалентно тому, какую часть текстуры он показывает сразу, или сколько раз он повторяется на устройстве визуализации.

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 в ультрафиолетовые единицы на 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);
}
...