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而确定唯一的。
我在Unity工程中导入一张纹理并设置为Sprite,并切割它成
则查看它的meta文件,可以看到:
新建场景,并新建一个Image,Sprite赋值为:Tile-Example_0,保存(序列化)Image为一个Prefab,保存场景
在文件夹中用文本文件打开这个Prefab,可以看到: