做為Unity早期的經典demo,一直從3.5以后沿用到4.7.x版本。但其內部一些做法十分不合理。比如使用過多的根目錄,
創建怪物和玩家不用SpawnPoint。AI、CheckPoint的代碼實現過於隨意,代碼命名風格詭異等等。。
網上有很多相關的學習文章,所以我精簡了一下,將一些有用的部分學習並記錄下來
1.主角武器部分
WeaponSlot為武器主要GameObject節點,里面有各種相關腳本。
其中瞄准線(LaserScope)通過LineRenderer實現:

其Shader額外加了一個Noise效果,然后通過腳本改變uv位置和縮放。腳本為LaserScope,shader路徑AngryBots/FX/LaserScope
而映射在目標上的點使用面片實現,並根據每幀發射的射線取得法線朝向修改位置和方向。實現也在LaserScope里

另外,為了防止每一幀多次取得射線導致的開銷,專門有一個腳本PerFrameRaycast緩存射線內容,並且每幀更新。
function Awake () {
tr = transform;
}
function Update () {
// Cast a ray to find out the end point of the laser
hitInfo = RaycastHit ();
Physics.Raycast (tr.position, tr.forward, hitInfo);
}
function GetHitInfo () : RaycastHit {
return hitInfo;
}
2.反射實現
沒想到居然做了實時的反射:

其做法比較經典,通過一個反射相機獲得反射內容,並用層Mask過濾地面等內容,取到水平線的點,乘以反射矩陣得到反射位置。
腳本在ReflectionFx中,參數如下:

幾項重要參數:
Reflective Object反射的對象,這里只是用這個集合里的元素取一個最近位置,並作為水平面參考得到反射點。
Reflective Materials 反射材質,用於把得到的RenderTexture丟到里面,Reflecction Sampler是賦值的Tex通道名稱。
Replacement Shader 處理反射的Shader,如果要拿來用可以直接拷貝該項目里的
目前已經到了Unity5,鏡面反射的處理方法已經非常多了,這里枚舉兩個:

The Blacksmith里的帶模糊效果的高質量鏡面反射:http://www.cnblogs.com/hont/p/5658491.html

使用反射探頭實現的的鏡面反射: http://www.cnblogs.com/hont/p/6091055.html
另外,關於傳統實時鏡面反射實現,這里還有一個文章推薦:http://gad.qq.com/article/detail/7157554
3.其他內容補充
1.游戲圖像品質管理位於QualityManager中,其中ShaderDatabase腳本儲存shader信息,並在修改品質時對shader maximum LOD進行批量修改。
2.MaterialImpactManager里存放的是物理材質和音效的映射表
3.ReflectiveBackgroundArbitrary的Shader里直接讀到LightMap,對於有要取到Lightmap需求的Shader,可以參考這個。
4.當前環境的色調等內容管理放在MoodBox里,包括MoodBoxManager,這套東西統稱為MoodBox System。我不太確定Mood這種命名是否官方,先記下。
5.Editor下有一個導出obj工具.導出后在ExportedObj文件夾下,可以直接導出.obj格式模型,但是許多細小的零件模型,而並非整合的。
6.Editor下還有一個天空盒生成器和Cubemap生成器,只需要提供一個點,即可輔助生成
7.Patrol Route 巡邏路線腳本,也可以繪制曲線

