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