[Unity]NGUI技巧总结

May 1, 2017


一、UIWrapContent的使用实现UI复用

NGUI提供的一种实现UI复用的一种实现方式UIWrapContent.cs,其中WrapContent()主要实现UI的复用功能,UpdateItem()会调用onInitializeItem委托。

二、Scrollview复位

可以通过控制UIScrollBar来实现复位,UIDragScrollView.cs滑动区域。

三、自定义Mesh/骨骼与NGUI的渲染层级关系

1、控制NGUI的RenderQueue的value。

2、也可以使用多个相机控制。

3、可以使用Shader通过z值来进行控制。

四、NGUI内置Shader

NGUI内置Shader分为两种,一种可打成AssetBundle,另一种只能Resource目录下,这一种一般以“Hidden/……”开头。

五、实现UI复用的另一种方式

在滑动列表不是单列的时候,我们可以继承UIGrid,模仿UIWrapContent来实现通用滑动列表的UI复用。

六、UIDrawCall

UIDrawCall BetterList

七、Mesh网格

大概有3件事情是你想要使用可修改的网格接口:

1、新建一个网格,应该按照这个顺序来做:

①为顶点数组赋值。

②为三角形数组赋值。

using UnityEngine;  
using System.Collections;  
   
public class ExampleClass : MonoBehaviour {  
    public Vector3[] newVertices;  
    public Vector2[] newUV;  
    public int[] newTriangles;  
    void Start() {  
        Mesh mesh = new Mesh();  
        GetComponent<MeshFilter>().mesh = mesh;  
        mesh.vertices = newVertices;  
        mesh.uv = newUV;  
        mesh.triangles = newTriangles;  
    }  
}  

2、每帧修改顶点属性:

①获取顶点数组。

②修改它们。

③赋回网格

using UnityEngine;  
using System.Collections;  
   
public class ExampleClass : MonoBehaviour {  
    void Update() {  
        Mesh mesh = GetComponent<MeshFilter>().mesh;  
        Vector3[] vertices = mesh.vertices;  
        Vector3[] normals = mesh.normals;  
        int i = 0;  
        while (i < vertices.Length) {  
            vertices[i] += normals[i] * Mathf.Sin(Time.time);  
            i++;  
        }  
        mesh.vertices = vertices;  
    }  
}  

3、连续的改变网格的三角形数组值和顶点值

①使用Clean刷新。

②指定顶点值和其他属性。

③指定索引值

using UnityEngine;  
using System.Collections;  
   
public class ExampleClass : MonoBehaviour {  
    public Vector3[] newVertices;  
    public Vector2[] newUV;  
    public int[] newTriangles;  
    void Update() {  
        Mesh mesh = GetComponent<MeshFilter>().mesh;  
        mesh.Clear();  
        mesh.vertices = newVertices;  
        mesh.uv = newUV;  
        mesh.triangles = newTriangles;  
    }  
}  

调用Clean函数在赋予新的顶点值和三角形索引值之前是非常重要的,Unity总是检查三角形的索引值,判断它们是否超出边界。调用Clear函数后,给顶点赋值,再给三角形数组赋值,以确保没有超出数组的边界。