在 Unity 中仅将纹理应用于立方体的某些面
Apply Textures to Only Certain Faces of a Cube in Unity
我正在尝试制作外观逼真的程序生成建筑。至此我已经为他们制作了纹理生成程序。我想将该纹理应用于 Unity 中的简单 cube
,但是,我不想将纹理应用于所有面孔。目前,当我将纹理应用于 cube
的 material 时,它会将相同的纹理应用于所有面孔,而在某些面孔上,纹理是颠倒的。你建议我制作 plane
个对象并将纹理应用于每个对象(并以这种方式形成一个立方体)。我知道这会奏效,但大规模有效吗?或者有没有办法在 C#
中将不同的纹理应用于立方体的各个面?
AFAIK unity 本身不支持这个。
不过,有一些简单的方法可以解决这个问题。您使用 plane
的示例是一个好主意,但使用 quad
会更有意义。或者更简单,创建一个多面立方体作为模型并将其导出为例如 .fbx
考虑到您正在尝试创建建筑物,您应该按程序生成自己的 'cube'/building 网格数据。
例如:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public Vector3[] newVertices;
public Vector2[] newUV;
public int[] newTriangles;
void Start() {
Mesh mesh = new Mesh();
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.triangles = newTriangles;
GetComponent<MeshFilter>().mesh = mesh;
}
}
然后用数据填充顶点和三角形。
例如,您可以在原点 0 周围创建一个 1 x 1 的小立方体:
int size = 1;
newVertices = new Vector3[]{
Vector3(-size, -size, -size),
Vector3(-size, size, -size),
Vector3( size, size, -size),
Vector3( size, -size, -size),
Vector3( size, -size, size),
Vector3( size, size, size),
Vector3(-size, size, size),
Vector3(-size, -size, size)
};
那么因为您只想在其中一个网格面上渲染纹理;
newUV = new Vector2[]{
Vector2(0,0),
Vector2(0,1),
Vector2(1,0),
Vector2(1,1),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0)
};
请注意,仅为某些顶点分配 UV 坐标这将有效地仅将您想要的纹理放置在其中一个面上,然后根据您分配三边形的方式,其余 UV 可以如您所见进行更改适合看起来好像没有纹理。
请注意,我写这篇文章时没有使用 IDE,因此可能存在一些语法错误。此外,这不是最直接的过程,但我保证它远远超过使用一系列四边形作为建筑物,因为有了它你可以制作各种形状 'easily'.
资源:
http://docs.unity3d.com/ScriptReference/Mesh.html
https://msdn.microsoft.com/en-us/library/windows/desktop/bb205592%28v=vs.85%29.aspx
http://docs.unity3d.com/Manual/GeneratingMeshGeometryProcedurally.html
我正在尝试制作外观逼真的程序生成建筑。至此我已经为他们制作了纹理生成程序。我想将该纹理应用于 Unity 中的简单 cube
,但是,我不想将纹理应用于所有面孔。目前,当我将纹理应用于 cube
的 material 时,它会将相同的纹理应用于所有面孔,而在某些面孔上,纹理是颠倒的。你建议我制作 plane
个对象并将纹理应用于每个对象(并以这种方式形成一个立方体)。我知道这会奏效,但大规模有效吗?或者有没有办法在 C#
中将不同的纹理应用于立方体的各个面?
AFAIK unity 本身不支持这个。
不过,有一些简单的方法可以解决这个问题。您使用 plane
的示例是一个好主意,但使用 quad
会更有意义。或者更简单,创建一个多面立方体作为模型并将其导出为例如 .fbx
考虑到您正在尝试创建建筑物,您应该按程序生成自己的 'cube'/building 网格数据。
例如:
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour {
public Vector3[] newVertices;
public Vector2[] newUV;
public int[] newTriangles;
void Start() {
Mesh mesh = new Mesh();
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.triangles = newTriangles;
GetComponent<MeshFilter>().mesh = mesh;
}
}
然后用数据填充顶点和三角形。 例如,您可以在原点 0 周围创建一个 1 x 1 的小立方体:
int size = 1;
newVertices = new Vector3[]{
Vector3(-size, -size, -size),
Vector3(-size, size, -size),
Vector3( size, size, -size),
Vector3( size, -size, -size),
Vector3( size, -size, size),
Vector3( size, size, size),
Vector3(-size, size, size),
Vector3(-size, -size, size)
};
那么因为您只想在其中一个网格面上渲染纹理;
newUV = new Vector2[]{
Vector2(0,0),
Vector2(0,1),
Vector2(1,0),
Vector2(1,1),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0),
Vector2(0,0)
};
请注意,仅为某些顶点分配 UV 坐标这将有效地仅将您想要的纹理放置在其中一个面上,然后根据您分配三边形的方式,其余 UV 可以如您所见进行更改适合看起来好像没有纹理。
请注意,我写这篇文章时没有使用 IDE,因此可能存在一些语法错误。此外,这不是最直接的过程,但我保证它远远超过使用一系列四边形作为建筑物,因为有了它你可以制作各种形状 'easily'.
资源:
http://docs.unity3d.com/ScriptReference/Mesh.html
https://msdn.microsoft.com/en-us/library/windows/desktop/bb205592%28v=vs.85%29.aspx
http://docs.unity3d.com/Manual/GeneratingMeshGeometryProcedurally.html