从Unity Android版本的入口函数读起。AndroidManifest.xml。在这个文件中,最重要的信息就是知道了Android Application的入口,当前应用程序启动器中优先级最高的Activity为com.unity3d.player.UnityPlayerActivity
下面开始阅读UnityPlayerActivity.java,入口函数为onCreate。
requestWindowFeature(Window.FEATURE_NO_TITLE);
隐藏当前Activity的标题栏
getIntent().getStringExtra(Key) && getIntent().putExtra(String str, String Key)
Intent 功能太强大了,比较常用的就是Activity (Service)之间的数据传递。在当前Activity1使用startActvity(intent)或者startActivityForResult(intent, code)方法跳转到另一个Activity2之前,如果要传递某些String类型数据给Activity2,则会执行intent.putExtra(String str, String Key),将String数据打包到Intent中,并给它一个Key标识。在Activity2当中,getIntent()方法获得这个intent,然后再getStringExtra(Key),就可以获得你之前打包的那个数据了。这种机制非常简单,也比较好用。
核心代码都在runtime里面
Unity的时间线代码为playerloop,PlayerLoop.bindings.cs可以看到时间线的顺序
Unity场景中所有物件都是通过RendererScene管理,通过AddRenderer函数加入,由SceneNode管理。会分为不同的类型,比如标记为OC的为kStaticRenderers,其余为kDynamicRenderer。由cmd.DrawMesh/DrawMeshInstance的为kSceneIntermediate/kCameraIntermediate,terrain上的树为kTreeRenderer,terrain本身为kCustomCullRenderers。
在cull的时候,OC的用umbra先进行culling,会用遮挡物剔除被遮挡物(静态和动态的)。1K的地图OC大小大概为200M。cull的代码在runtime/camera里面。
shadow的culling,是根据当前场景物件的boundingbox计算出来的MVP矩阵,这个矩阵和渲染用的矩阵是一样的。
原创技术文章,撰写不易,转载请注明出处:电子设备中的画家|王烁 于 2020 年 4 月 17 日发表,原文链接(http://geekfaner.com/unity/blog18_UnitySourceCode.html)