读一读

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框架版本

blob.png

然后使用如下:

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而确定唯一的。