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()是获取到网格三角形中的所有顶点,因为三角形会有相交的,所以这里获取的顶点是有重复的。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class CameraScale : MonoBehaviour
{
void Start()
{
int ManualWidth = 960;
int ManualHeight = 640;
int manualHeight;
if (System.Convert.ToSingle(Screen.height) / Screen.width > System.Convert.ToSingle(ManualHeight) / ManualWidth)
manualHeight = Mathf.RoundToInt(System.Convert.ToSingle(ManualWidth) / Screen.width * Screen.height);
else
manualHeight = ManualHeight;
Camera camera = GetComponent<Camera>();
float scale = System.Convert.ToSingle(manualHeight / 640f);
camera.fieldOfView *= scale;
}
}这个是C#的新特性,在unity2017中,需要更改PlayerSeting的.Net框架版本

然后使用如下:
async void Start () {
Debug.Log("Start");
await Task.Delay(5000);
Debug.Log("Continue");
}
原来Debug自身就有控制全区是否输出的开关了。
Debug.logger.logEnabled = false;//弃用了 Debug.unityLogger.logEnabled = false;
unityLogger为获取到默认的输出日志工具
using UnityEngine;
public class A : MonoBehaviour {
}using UnityEngine;
public class FindA : MonoBehaviour {
void Start () {
A a = (A)GameObject.FindObjectOfType(typeof(A));
Debug.Log(a.gameObject.name);
int num = GameObject.FindObjectsOfType<A>().Length;
Debug.Log(num);
}
}GameObject可以省略掉,这个FindObjectsOfType()可以通过组件的脚本类型,来查找到当前运行的所有此类型的实例,可以用这个方法来监控单例管理类在游戏中只有一个实例。
可以在项目目录下的ProjectSettings下面的ProjectVersion.txt,使用文本文件打开,里面记录的就是项目使用的Unity版本号
MonoBehaviour脚本组件都含有一个对MonoScript的引用,MonoBehaviour组件里面不包含任何实际可执行代码。MonoScript里面保存着程序集名称、类名称、命名空间,用来定位每个具体的编程类所需要的信息,它也没有程序类的可执行代码。
构建工程时,Unity会收集Assets文件夹中独立的脚本文件并将他们编译,组成一个Mono程序集。Plugins外的脚本编译在Assembly-CSharp.dll,Plugins里的编译在Assembly-CSharp-firstpass.dll中。这些dll和预编译好的dll程序库将会包含在最终构建的Unity应用程序中。
因为文件GUID的比较效率低下,所以Unity维护这一个缓存,映射着实例ID与文件GUID和本地ID定义的对象源数据位置以及对象在内存中的地址。通过这个实例ID就能够快速的找到引用的对象,如果这个对象不存在,好可以通过实例ID找到GUID和本地ID的源数据去载入对象。
注意AssetBundle的加载,会产生新的GUID和本地ID的Object,加载这些Object时会在缓存中新加映射,当AssetBundle卸载时,这个实例ID就会失效被移除,引用这个实例ID的就会为空了。
在Unity每次启动的时候都会进行一次导入操作,例如将纹理文件压缩、切割成Sprite等的操作,资源导入的结果是一个或多个UnityEngine.Objects。资源导入的过程是一个十分耗时的操作,所以,Unity会将导入的结果缓存在Library的metadata文件夹中,以资源的GUID的头两个字母分类的文件夹和完整GUID命名的缓存文件。这也是为什么第一次打开不包含Library的项目时需要很大耗时,再次打开就很快的原因。
照我的理解,资源文件Asset就是Unity3d退出后,在计算机文件系统中的项目Assets文件夹可以看到的东西,例如:纹理图片(png,jpg等)、内置材质文件、内置的prefab文件等。使用GUID标志。
Object应该就是Unity启动的时候,将资源导入(Unity一顿操作)而在Unity内存中生成的对象再序列化成可以使用的资源文件,Asset可以对应多个这样的Object,例如纹理的sprite切割,所以每个Object都是由Asset的GUID和它自身的本地ID而确定唯一的。