Unity - 忽略警告訊息
在 Unity 中如果有用到其他 Plugins 經常會發現許多來自這些 Plugins 的 Warning。如果不處理的話,這些訊息可能會淹沒了專案中真正需要注意的警告訊息。
底下是來自我們目前專案的警告訊息:
Unity 看到的警告訊息大約 300個
從 Visual Studio for Mac 看到的警告訊息超過 2000個
NOTE: Unity 跟 Visual Studio for Mac 的警告訊息數量不同,最好兩個都檢查
雖然理論上警告訊息都必須要修正,但是專案進行中總是有很多無法掌握的情形, 以下介紹我在目前處理的專案中,遇到難以修改的警告訊息的解決方式:
Plugins’ warning
對於第三方的 Plugins 我們可以先用 #pragma warning
命令來暫時關閉警告訊息。
關閉的方式使用 #pragma warning disable
暫時關閉,並在使用後用 #pragma warning restore
開啟警告。
通常會在發生警告前一行加上 #pragma warning disable *warning-list*
,並且在發生警告後一行加上 #pragma warning restore *warning-list*
重新開啟警告。
一般來說,建議將關閉警告與開啟警告的範圍越小越好,避免意外隱藏其他有意義的警告訊息。
如果檔案裡的警告太多,也可以在檔案開頭與結尾分別加上關閉與還原檔案內所有警告訊息。
NOTE: 這樣的關閉方式,一但更新 Plugins 的時候可能要重新處理一次。
底下的例子來自 MSDN
// CS0649.cs
// compile with: /W:4
using System.Collections;
class MyClass
{
#pragma warning disable 0649
Hashtable table; // CS0649
#pragma warning restore 0649
// You may have intended to initialize the variable to null
// Hashtable table = null;
// Or you may have meant to create an object here
// Hashtable table = new Hashtable();
public void Func(object o, string p)
{
// Or here
// table = new Hashtable();
table[p] = o;
}
public static void Main()
{
}
}
Project’s warning
相較於 Plugins 的警告訊息,自己專案的警告訊息是比較需要處理的。
不過 Unity 本身的機制會造成許多警告訊息不斷出現,會影響到重要的警告被淹沒在大量警告訊息中
底下的範例示範在 Unity 中引發最常見的警告 CS0649 的方式:
using UnityEngine
public class ExampleScript : MonoBehaviour
{
private int noWarning;
// Warning CS0649: Field is never assigned to, and will always have its default value null
[SerializeField] private int warning0649;
private void Awake()
{
noWarning = warning0649;
}
}
以上的情況很常發生,通常發生在我們要在 inspector 上設定值或是參考到場景上的 GameObject 的變數上且沒有給初始值的情況。
簡單的解決方法可以在宣告的時候加上初始值,雖然大部分情況這個初始值不會發生作用。
[SerializeField] private int warning0649 = 0;
對於開發中的專案,要修復所有警告可能需要花上很多時間,我們可以採用另一種比較暴力的處理方式。
使用 mcs.rsp
檔案來設定專案中要忽略的警告。
詳細的使用方式可以用 mcs -help
指令查詢。
我們會用到其中的 nowarn
參數來將特定的警告關閉。
因為 mcs.rsp
是全專案的隱藏,可能會誤關到真正會發生問題的警告,所以使用上必須小心選擇要關閉的警告。
我們的 mcs.rsp
的內容只有簡單地忽略幾個 Unity 常見的警告訊息,檔案需要放在 Assets/mcs.rsp
路徑下。
-nowarn:0649
-nowarn:1635
在這裡我們關閉了 CS0649 這個常見的警告訊息,另外也關閉了 CS1635 這個警告訊息。
CS1635 是當我們在全域關閉了某個警告訊息,如果有人用 #pragma warning restore
重新開啟這個警告的時後就會有這個警告。因此我們也需要忽略這個警告。
Conclusion
不論是用 #pragma warning
或是 mcs.rsp
來忽略警告訊息都不是很推薦的作法。
最好還是可以將所有警告都處理掉, 不過對於外部的 Plugins 可以稍微放寬一點,容忍警告的發生,但是要注意避免警告訊息影響到專案本身。 可以將 Plugins 的警告都隱藏起來,只要關注在專案本身的警告訊息即可。
對於現有專案,考量到修改的成本,使用全域的 mcs.rsp
是折衷的手段,
最終還是需要花費時間回頭處理累積的技術債。