统一 - 游戏对象的纹理滚动速度
unity - texture scroll speed with gameobject
我在 unity3D 中有一块板,板上有一个立方体。棋盘的纹理和纹理偏移量随 Y 坐标变化,因此看起来像是向后移动。立方体也应该以与板的偏移相同的速度移动,但我无法在它们之间设置相同的速度。
我的看板滚动代码:
public class moveBoard : MonoBehaviour
{
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
this.GetComponent<MeshRenderer>().material.SetTextureOffset("_MainTex", new Vector2(0, -1 * Time.time));
}
}
我的立方体移动代码:
public class moveTus : MonoBehaviour
{
public GameObject board;
float offsetY = 0f;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
this.transform.Translate(Vector3.back * -10 * Time.deltaTime) ;
}
}
所以我需要以与板的偏移速度相同的速度移动立方体。
在两个脚本中包含一个 public 速度变量。
public class 移动板:MonoBehaviour
{
public浮动速度=1;
无效更新()
{
this.GetComponent().material.SetTextureOffset("_MainTex", new Vector2(0, -1 * Time.deltaTime * <b>speed</b> * UserOptions.speed) );
}
}</p>
<p>public class moveTus:MonoBehaviour
{
public浮动速度=1;
无效更新()
{
this.transform.Translate(Vector3.back * -10 * Time.deltaTime * <b>速度</b> * UserOptions.speed) ;
}
}
在运行时尝试通过在编辑器检查器中手动更改任何这些速度变量值来进行同步。在找到它们之间的微调后,在设计时应用这些值。
我今天需要同样的功能。所以这是我的代码
List<Vector2> uvs = new List<Vector2>();
groundMesh.GetComponent<MeshFilter>().mesh.GetUVs( 0 , uvs ); // get uv coordinates
float min = float.MaxValue;
float max = float.MinValue;
foreach ( var item in uvs ) // find min and max
{
if ( item.x > max )
{
max = item.x;
}
if ( item.x < min )
{
min = item.x;
}
}
groundUV_X = Mathf.Abs( min - max ); // find absolute value
我的固定更新代码:
var v = groundMaterial.GetTextureOffset( "_MainTex" ); // get current offset
groundMaterial.SetTextureOffset( "_MainTex" , new Vector2( v.x + ( speed * Time.fixedDeltaTime * groundUV_X) * (1.0f / groundMesh.bounds.size.z) , v.y ) );
// multiply speed by groundUV_X which is total distance between x coordinates
// multiply by world size (normalized total distance)
获取最小和最大 uv 坐标(在我的例子中是 x 坐标)并将其乘以速度。
因为我们需要 woorld 坐标中的纹理大小(在我的例子中是 bounds.size.z)
将其归一化为 1. 然后我们得到了同步坐标。
如果有人不能让它工作,请告诉我。我可以添加更多详细信息。
我在 unity3D 中有一块板,板上有一个立方体。棋盘的纹理和纹理偏移量随 Y 坐标变化,因此看起来像是向后移动。立方体也应该以与板的偏移相同的速度移动,但我无法在它们之间设置相同的速度。
我的看板滚动代码:
public class moveBoard : MonoBehaviour
{
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
this.GetComponent<MeshRenderer>().material.SetTextureOffset("_MainTex", new Vector2(0, -1 * Time.time));
}
}
我的立方体移动代码:
public class moveTus : MonoBehaviour
{
public GameObject board;
float offsetY = 0f;
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
this.transform.Translate(Vector3.back * -10 * Time.deltaTime) ;
}
}
所以我需要以与板的偏移速度相同的速度移动立方体。
在两个脚本中包含一个 public 速度变量。
public class 移动板:MonoBehaviour
{
public浮动速度=1;
无效更新()
{
this.GetComponent().material.SetTextureOffset("_MainTex", new Vector2(0, -1 * Time.deltaTime * <b>speed</b> * UserOptions.speed) );
}
}</p>
<p>public class moveTus:MonoBehaviour
{
public浮动速度=1;
无效更新()
{
this.transform.Translate(Vector3.back * -10 * Time.deltaTime * <b>速度</b> * UserOptions.speed) ;
}
}
在运行时尝试通过在编辑器检查器中手动更改任何这些速度变量值来进行同步。在找到它们之间的微调后,在设计时应用这些值。
我今天需要同样的功能。所以这是我的代码
List<Vector2> uvs = new List<Vector2>();
groundMesh.GetComponent<MeshFilter>().mesh.GetUVs( 0 , uvs ); // get uv coordinates
float min = float.MaxValue;
float max = float.MinValue;
foreach ( var item in uvs ) // find min and max
{
if ( item.x > max )
{
max = item.x;
}
if ( item.x < min )
{
min = item.x;
}
}
groundUV_X = Mathf.Abs( min - max ); // find absolute value
我的固定更新代码:
var v = groundMaterial.GetTextureOffset( "_MainTex" ); // get current offset
groundMaterial.SetTextureOffset( "_MainTex" , new Vector2( v.x + ( speed * Time.fixedDeltaTime * groundUV_X) * (1.0f / groundMesh.bounds.size.z) , v.y ) );
// multiply speed by groundUV_X which is total distance between x coordinates
// multiply by world size (normalized total distance)
获取最小和最大 uv 坐标(在我的例子中是 x 坐标)并将其乘以速度。 因为我们需要 woorld 坐标中的纹理大小(在我的例子中是 bounds.size.z) 将其归一化为 1. 然后我们得到了同步坐标。
如果有人不能让它工作,请告诉我。我可以添加更多详细信息。