如果现在是Unity4.3,则此教程需要更新。
简介
此教程中药创建一个简单的星星组件,并为其编写自定义编辑器。需学习如下:
- 动态生成一个网
- 创建一个自定义编辑器
- 使用序列化对象
- 支持WYSIWYG编辑
- 支持场景视图编辑
此教程是自定义列表教程的延续。
创建星星
以之前完成的自定义列表教程项目或者自己创建一个新的空项目并导入custom-list.unitypackage。
我们使用之前创建的颜色点和列表,但我们需要放弃所有测试代码和对象。
首先添加一个叫Star的C#脚本。我们使用此脚本创建一个由三角形组成的圆,来产生类似星星的效果,而这又需要一个网。
1
2
3
4
5
6
|
using UnityEngine;
public class Star : MonoBehaviour {
private Mesh mesh;
}
|
为了以后使用这个网,必须将它赋值为一个MeshFilter组件,这样就可以用MeshRenderrer组件来调用。只有这样Unity才能绘制网。因此需要这些组件附加到游戏对象,我们的星星组件也需要附加。
当然我们可以手动添加这些组件,但我们可以在我们我们的组件中添加一个RequireComponent属性来自动添加。
1
2
3
4
5
6
7
8
|
using UnityEngine;
[RequireComponent( typeof (MeshFilter), typeof (MeshRenderer))]
public class Star : MonoBehaviour {
private Mesh mesh;
}
|
现在我们创建了一个空的游戏对象,命名为MyFirstStar,并在里面添加我们的组件。可以看到对象同时也获得了其他两个组件。
添加一个就得到三个。
下一步就是创建一个网。我们现在用Start Unity 事件方法来创建,我们进入播放模式的时候就开始了。同时将网赋值到MeshFilter之中,给它一个描述性的名字。
1
2
3
4
|
void Start () {
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "Star Mesh" ;
}
|
在播放模式中就可以看到一个网了。
当然我们现在在进入播放模式的时候不会看到任何东西,因为这个网还是空的。我们需要添加一个顶点数组,用来控制我们星星的点数,以及相对于星星中心需要放置的点。
三角形风扇的收个顶点就在星星的中心,其他的顶点沿着顺时针放置。我们使用一个四元信号来旋转这些点。旋转角度是负的,因为我们假设我们是沿着Z轴向下看的,这样正向旋转就是绕Z轴逆时针旋转了。我们不需要设置收个顶点,因为所有向量都是自动默认设置为0的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public Vector3 point = Vector3.up;
public int numberOfPoints = 10;
private Mesh mesh;
private Vector3[] vertices;
void Start () {
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "Star Mesh" ;
vertices = new Vector3[numberOfPoints + 1];
float angle = -360f / numberOfPoints;
for (int v = 1; v < vertices.Length; v++){
vertices[v] = Quaternion.Euler(0f, 0f, angle * (v - 1)) * point;
}
mesh.vertices = vertices;
}
|
一些点
我们用数组顶点下标来存储三角形,一个三角形三个数组。
因为我们使用三角形风扇方法,每个三角形在第一个顶点开始,连接之前和之后的三角形。最后一个三角形又绕回到第一个。例如我们有四个三角形,顶点下标就是{0, 1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1}.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
private int[] triangles;
void Start () {
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "Star Mesh" ;
vertices = new Vector3[numberOfPoints + 1];
triangles = new int[numberOfPoints * 3];
float angle = -360f / numberOfPoints;
for (int v = 1, t = 1; v < vertices.Length; v++, t += 3){
vertices[v] = Quaternion.Euler(0f, 0f, angle * (v - 1)) * point;
triangles[t] = v;
triangles[t + 1] = v + 1;
}
triangles[triangles.Length - 1] = 1;
mesh.vertices = vertices;
mesh.triangles = triangles;
}
|
一个丑陋的星星
现在我们的星星看起来像一个丑陋的多边形。Unity也抱怨丢失纹理协调,因为默认着色器都需要这些。由于我们不会去使用一个纹理,我们将通过使用顶点颜色来创建自己的着色器来接触这些警告。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
Shader "Star" {
SubShader {
Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Off
Lighting Off
ZWrite Off
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
struct data {
float4 vertex : POSITION;
fixed4 color: COLOR;
};
data vert (data v) {
v.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
return v;
}
fixed4 frag(data f) : COLOR {
return f.color;
}
ENDCG
}
}
}
|
现在我们创建了一个新的素材名字-星星,并为其设置我们刚才创建的着色器,将其拖拽到MyFirstStar中。
有一个白色星星
顶点颜色默认是白色,因此我们的多边形现在是白色。然而我们希望的是一个彩色星星,点距离中心的距离都是不同的。与其配置一个单独的点,我们倒不如配置一个点数组。
为了方便配置星星每个点,我们可以添加一个经常使用的选项来自动重复点操作。
我们也需要包含一个检测,以便确认频率至少设置1,因为缺少东西可是很要命的。最后就可以在有至少三个点的时候创建一个网。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public Vector3[] points;
public int frequency = 1;
void Start () {
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "Star Mesh" ;
if (frequency < 1) {
frequency = 1;
}
if (points == null ) {
points = new Vector3[0];
}
int numberOfPoints = frequency * points.Length;
vertices = new Vector3[numberOfPoints + 1];
triangles = new int[numberOfPoints * 3];
if (numberOfPoints >= 3) {
float angle = -360f / numberOfPoints;
for (int repetitions = 0, v = 1, t = 1; repetitions < frequency; repetitions++){
for (int p = 0; p < points.Length; p += 1, v += 1, t += 3){
vertices[v] = Quaternion.Euler(0f, 0f, angle * (v - 1)) * points[p];
triangles[t] = v;
triangles[t + 1] = v + 1;
}
}
triangles[triangles.Length - 1] = 1;
}
mesh.vertices = vertices;
mesh.triangles = triangles;
}
|
现在只是点
现在是时候添加一些颜色了。我们可以通过使用ColorPoint数据结构而不是仅仅矢量化我们的点数组来实现。我们用一个彩色的来定义星星的中心,这样我们就可以围绕它运动了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public ColorPoint center;
public ColorPoint[] points;
private Color[] colors;
void Start () {
GetComponent<MeshFilter>().mesh = mesh = new Mesh();
mesh.name = "Star Mesh" ;
if (frequency < 1) {
frequency = 1;
}
if (points == null ) {
points = new ColorPoint[0];
}
int numberOfPoints = frequency * points.Length;
vertices = new Vector3[numberOfPoints + 1];
colors = new Color[numberOfPoints + 1];
triangles = new int[numberOfPoints * 3];
if (numberOfPoints >= 3) {
vertices[0] = center.position;
colors[0] = center.color;
float angle = -360f / numberOfPoints;
for (int repetitions = 0, v = 1, t = 1; repetitions < frequency; repetitions++){
for (int p = 0; p < points.Length; p += 1, v += 1, t += 3){
vertices[v] = Quaternion.Euler(0f, 0f, angle * (v - 1)) * points[p].position;
colors[v] = points[p].color;
triangles[t] = v;
triangles[t + 1] = v + 1;
}
}
triangles[triangles.Length - 1] = 1;
}
mesh.vertices = vertices;
mesh.colors = colors;
mesh.triangles = triangles;
}
|
现在是彩色点
如果这步之后你还是没看到东西,尝试调整颜色组件的透明度。我设置中心颜色为完全模糊,并设置其他剩余点完全透明,这样从中心到边缘就是渐变的了。
原文链接:http://catlikecoding.com/unity/tutorials/editor/star/
建议使用电驴(eMule)下载分享的资源。
说明:本教程来源互联网或网友分享或出版商宣传分享,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
|