protected override void OnPopulateMesh(VertexHelper vh) { base.OnPopulateMesh(vh); Debug.LogError(vh.currentIndexCount);//6个 三角形的索引 Debug.LogError(vh.currentVertCount);//4个 顶点个数,图片的四个角 List<UIVertex> list = new List<UIVertex>(); vh.GetUIVertexStream(list); Debug.LogError(list.Count);//6个 for (int i = 0; i < list.Count; i++) { //会有两个是重复的 Debug.LogError(list[i].position); } vh.AddVert(list[2]);//添加顶点 vh.AddTriangle(0, 4, 3);//添加三角形 Debug.LogError(vh.currentIndexCount);//9个 Debug.LogError(vh.currentVertCount);//5个 vh.GetUIVertexStream(list); Debug.LogError(list.Count);//9个 }
一个工具类VertexHelper,帮助UI生成网格
ADF就是 assembly definition file,是一个自定义程序集的文件,在指定脚本文件夹中创建这个文件,指定Name,文件夹下的脚本都会编译到这个程序集中。
多个ADF之间使用属性Reference添加引用,就是所谓程序集之间using关系。
作用就是在大型应用中,所有脚本都是编译到一个程序集中的,修改一个脚本编译过程都会非常缓慢,将脚本分开程序集管理,修改脚本后,只会重新编译它所在的和引用它的程序集。
使用后,最好全部脚本都用ADF,不然不是ADF的脚本每次都会重新编译。
使用方法:在Project的目标脚本文件夹中 右键->Create->Assenbly Definition,然后指定名字就行了。主要工作是,脚本的分类和之间关系的管理。
TextAsset asset = Resources.Load<TextAsset>("Name");//加载资源 TextAsset[] textAsset = Resources.LoadAll<TextAsset>("Config");//加载文件夹下的所有资源 Resources.UnloadAsset(asset);//卸载资源
Resources系统是一个资源的加载方案,方便使用Resources.Load()、Resources.LoadAll()等方法加载和释放资源
但是庞大的Resouces和太多的Resources文件夹内容会有启动加载时间长,对于不同平台的定制能力差,应该以AssetBundle为主体的资源管理。
可以用来存放一些管理器Prefab,第三方配置文件等轻量的物体。
Resources文件夹可以允许多个存在,Unity在Build的时候会将他们合并成一个文件夹
Resources下的物体会被压缩并打包,是一个只读的文件夹。
原因是因为插件或则是自定义的AndroidManifast.xml文件覆盖修改了了Unity原来配置主题选项。
在Unity5.5以上的版本中,只需要将AndroidManifast.xml的application标签加上Unity默认主题:
android:theme="@style/UnityThemeSelector"
今天想用四元数实现转很多圈,就是这样的:
transform.rotation = Quaternion.Lerp(transform.rotation,Quaternion.Euler (0, 0, 360*3+45),Time.deltaTime);
好吧,可能是四元数只能表示0-360度吧,并没有转很多圈,就连一圈也没转到,那应该就是:
Debug.Log (Quaternion.Euler (380, 560, 360).eulerAngles); //(20,200,0)
就是你新建一个脚本后,然后打开,VS完全不认识它,你以前写的类在这里都是不能用的。而它也不能被其他类所使用。
猜测:新建脚本后,Unity没有来得及做处理,没有编译到程序集中,所以它是一个独立的个体。
解决办法:打开项目文件,找到脚本文件,复制到外面,再在Unity中将该脚本文件删除,将复制的脚本拉(导入)进来。
在Unity中设置vs2017作为打开脚本的编辑器,打开脚本。
看到vs运行播放那里有没有附加到Unity,如果没有:
点击 "工具/获取工具和功能"
把 "使用Unity的游戏开发" 勾选 并修改
在vs运行处上出现附加到Unity,点击后在需要的地方设置断点,在Unity运行游戏,运行到这断点出就会跳转到vs这边来。
using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; [AddComponentMenu("UI/Effects/Gradient")] public class Gradient : BaseMeshEffect { public Color32 topColor = Color.white; public Color32 bottomColor = Color.black; public override void ModifyMesh(VertexHelper vh) { if (!IsActive()) return; List<UIVertex> list = new List<UIVertex>(); vh.GetUIVertexStream(list); int listCount = list.Count; float bY = list[0].position.y; float tY = list[0].position.y; for (int i = 0; i < listCount; i++) { if (list[i].position.y > tY) { tY = list[i].position.y; } else if (list[i].position.y < bY) { bY = list[i].position.y; } } float h = tY - bY; UIVertex v = new UIVertex(); for (int j = 0;j < vh.currentVertCount; j++) { vh.PopulateUIVertex(ref v, j); v.color = Color32.Lerp(bottomColor, topColor, (v.position.y - bY) / h); vh.SetUIVertex(v,j); } } }
GetUIVertexStream()是获取到网格三角形中的所有顶点,因为三角形会有相交的,所以这里获取的顶点是有重复的。