由于Unity的部分机制具有特殊性,在此列出需要注意的要点。



1.1.  内置方法


由Unity提供的固定方法,如Start、Update、OnMouseEnter等,除非有特殊的需要,否则请使用protected访问修饰符以保证良好的封装性。必要时可以使用virtual关键字供子类重写。



1.2.  可选参数


public void MethodWithOptionalParameter(int a = 1) 

{

}


继承自MonoBehaviour的类,不可以声明带可选参数的方法,否则会导致脚本无法附加到游戏对象上。如果为一个已经附加到游戏对象上的脚本增加可选参数方法,同样会导致报无法加载脚本的警告(Can’t add script)。由于报错信息和错误原因不一致,是Unity一个相当莫名的BUG,必须要注意。


1.3.  AOT



有些操作系统不支持动态编译,比如大部分的嵌入式系统以及苹果的IOS。这意味着所有的托管代码都必须使用Full AOT在打包前全部编译成本机代码,因此使用某些泛型机制时会导致抛出如下异常:




ExecutionEngineException: Attempting to JIT compile method….while running with --aot-only.



为考虑到良好的跨平台性,请避免:


  1. 使用带泛型的虚方法;
  2. 在泛型类中使用P/Invoke;
  3. 使用System.Reflection.Emit(其他反射机制可用);


参考文档:


http://docs.xamarin.com/guides/ios/advanced_topics/limitations



http://www.mono-project.com/AOT


Unity中使用C#定时器会报错

CompareBaseObjectsInternal can only be called from the main thread.
 Constructors and field initializers will be executed from the loading thread when loading a scene.
 Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.

untiy异常报错,可查询C:\Documents and Settings\用户名\Local Settings\Application Data\Unity\Editor


Unity中的Path对应各平台中的Path :


IOS:Application.dataPath :                      Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data
 Application.streamingAssetsPath :   Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw
 Application.persistentDataPath :      Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents
 Application.temporaryCachePath :   Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches

//**********
CompanyName: DefaultCompanyjqd 

ProductName:TestUnityPath 

Bundle identifier: com.Company.ProductNamejqd

 Android:
 Application.dataPath :                         /data/app/xxx.xxx.xxx.apk /data/app/com.Company.ProductNamejqd-1.apk
 Application.streamingAssetsPath :      jar:file:///data/app/xxx.xxx.xxx.apk/!/assets jar:file:///data/app/com.Company.ProductNamejqd-1.apk!/assets
 Application.persistentDataPath :         /data/data/xxx.xxx.xxx/files /data/data/com.Company.ProductNamejqd/files
 Application.temporaryCachePath :      /data/data/xxx.xxx.xxx/cache /data/data/com.Company.ProductNamejqd/cache
 
 Windows:
 Application.dataPath :                         /Assets 自己工程/Assets
 Application.streamingAssetsPath :      /Assets/StreamingAssets 自己工程/Assets/StreamingAssets
 Application.persistentDataPath :         C:/Users/xxxx/AppData/LocalLow/CompanyName/ProductName C:/Users/XXXX/AppData/LocalLow/DefaultCompany/TestUnityPath
 Application.temporaryCachePath :      C:/Users/xxxx/AppData/Local/Temp/CompanyName/ProductName C:/Users/xxxx/AppData/Local/Temp/DefaultCompany/TestUnityPath
 //**********
 //****

CompanyName: DefaultCompanyjqd 

ProductName:四个中文字

Bundle identifier: com.xxxxxxx.xxxx.xxxx
windows:
assetSteamFilePath: 自己工程文件夹路径/Assets/StreamingAssets
persistentDataPath: C:/Users/电脑用户名/AppData/LocalLow/DefaultCompanyjqd/____________
dataPath: 自己工程文件夹路径/Assets
temporaryCachePath: C:/Users/xxxx/AppData/Local/Temp/DefaultCompanyjqd/____________
android:
assetSteamFilePath: jar:file:///data/app/com.xxxxxxx.xxxx.xxxx-1.apk!/assets(都加了 -1)
persistentDataPath: /storage/emulated/0/Android/data/com.xxxxxxx.xxxx.xxxx/files
dataPath: /data/app/com.xxxxxxx.xxxx.xxxx-1.apk
temporaryCachePath: /storage/emulated/0/Android/data/com.xxxxxxx.xxxx.xxxx/cache

华为 H30-U10 persistent 存储在了 .../Android/bundle indentifier的名字下的文件夹了
//

 
 Mac:
 Application.dataPath :                         /Assets
 Application.streamingAssetsPath :      /Assets/StreamingAssets
 Application.persistentDataPath :         /Users/xxxx/Library/Caches/CompanyName/Product Name
 Application.temporaryCachePath :     /var/folders/57/6b4_9w8113x2fsmzx_yhrhvh0000gn/T/CompanyName/Product Name 
  Windows Web Player:
 Application.dataPath :             file:///D:/MyGame/WebPlayer (即导包后保存的文件夹,html文件所在文件夹)
 Application.streamingAssetsPath :
 Application.persistentDataPath :
 Application.temporaryCachePath :