我试图用来自屏幕侧面的物体做一个无限的奔跑者。但是,对象的速度与地板纹理的速度不匹配。
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次。
答案 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);
}