读一读

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


我在Unity工程中导入一张纹理并设置为Sprite,并切割它成

blob.png

则查看它的meta文件,可以看到:

blob.png

新建场景,并新建一个Image,Sprite赋值为:Tile-Example_0,保存(序列化)Image为一个Prefab,保存场景

在文件夹中用文本文件打开这个Prefab,可以看到:

blob.png