はじめに
Rider で Unity 連携を有効化すると、Unity において問題のあるコードに
警告の波線が表示されたり、ハイライト表示されるようになります
この記事では、どのようなコードに警告の波線やハイライトが表示されるか紹介していきます
目次
- はじめに
- 目次
- Code Inspections
- MonoBehaviour を継承したクラスを new している
- ScriptableObject を継承したクラスを new している
- メモリ割り当てが発生する関数を使用している
- Unity エディタの表示崩れが発生するコードを記述している
- イベント関数の引数が正しくない
- 処理に時間がかかる関数を使用している
- UnityEngine.Object の null チェックを何回も呼び出している
- Camera.main を何回も呼び出している
- FormerlySerializedAs 属性が正しく使用されていない
- UnityEngine.Object の null チェックに null 合体演算子を使用している
- UnityEngine.Object の null チェックに null 条件演算子を使用している
- 属性の指定が正しくない
- FormerlySerializedAs 属性の指定が正しくない
- HideInInspector 属性の指定が正しくない
- InitializeOnLoad 属性の指定が正しくない
- SerializeField 属性の指定が正しくない
- イベント関数の中身が実装されていない
- 参照に時間がかかるプロパティを複数回参照している
- Instantiate した後に親オブジェクトを設定している
- Animator や Material のパラメータ指定に文字列を使っている
- GetComponent などの関数で型名を文字列で指定している
- タグの比較に CompareTag を使用していない
- 存在しないシーンファイルを指定している
- Build Settings で無効になっているシーンを指定している
- Build Settings に複数設定されている同名のシーンを指定している
- Build Settings に存在しないビルドインデックスを指定している
- InputManager に存在しない名前を指定している
- 存在しないレイヤーを指定している
- 存在しないタグを指定している
- Build Settings に存在しないシーンを指定している
- 設定変更
Code Inspections
MonoBehaviour を継承したクラスを new している
'MonoBehaviour' instances must be instantiated with 'GameObject.AddComponent<T>()' instead of 'new'
MonoBehaviour を継承したクラスは
new ではなく AddComponent で作成する必要があるため
new で作成している場合は警告の波線が表示されます
ScriptableObject を継承したクラスを new している
'ScriptableObject' instances must be instantiated with 'ScriptableObject.CreateInstance<T>()' instead of 'new'
ScriptableObject を継承したクラスは
new ではなく ScriptableObject.CreateInstance で作成する必要があるため
new で作成している場合は警告の波線が表示されます
メモリ割り当てが発生する関数を使用している
Alternative non-allocating method available
Physics.RaycastAll などの関数は、Physics.RaycastAllNonAlloc のように
メモリ割り当てが発生しない、名前に NonAlloc と付いたバージョンの関数が存在するため、
NonAlloc と付いたバージョンを使用していない場合は警告の波線が表示されます
メモリ割り当てが発生しない、名前に NonAlloc と付いたバージョンの関数を使用すると
警告の波線が消えます
下記の関数は、メモリ割り当てが発生しない NonAlloc 版が存在します
関数 | NonAlloc 版 |
---|---|
Physics.BoxCastAll | Physics.BoxCastNonAlloc |
Physics.CapsuleCastAll | Physics.CapsuleCastNonAlloc |
Physics.RaycastAll | Physics.RaycastNonAlloc |
Physics.SphereCastAll | Physics.SphereCastNonAlloc |
Physics.OverlapBox | Physics.OverlapBoxNonAlloc |
Physics.OverlapCapsule | Physics.OverlapCapsureNonAlloc |
Physics.OverlapSphere | Physics.OverlapSphereNonAlloc |
Physics2D.BoxCastAll | Physics2D.BoxCastNonAlloc |
Physics2D.CapsuleCastAll | Physics2D.CapsuleCastNonAlloc |
Physics2D.CircleCastAll | Physics2D.CircleCastNonAlloc |
Physics2D.LinecastAll | Physics2D.CapsuleCastNonAlloc |
Physics2D.RaycastAll | Physics2D.RaycastNonAlloc |
Physics2D.GetRayIntersectionAll | Physics2D.GetRayIntersectionNonAlloc |
Physics2D.OverlapAreaAll | Physics2D.OverlapAreaNonAlloc |
Physics2D.OverlapBoxAll | Physics2D.OverlapBoxNonAlloc |
Physics2D.OverlapCapsuleAll | Physics2D.OverlapCapsuleNonAlloc |
Physics2D.OverlapCircleAll | Physics2D.OverlapCircleNonAlloc |
Physics2D.OverlapPointAll | Physics2D.OverlapPointNonAlloc |
Unity エディタの表示崩れが発生するコードを記述している
Avoid 'base.OnGUI()' in classes derived from 'PropertyDrawer'
PropertyDrawer の OnGUI の中で base.OnGUI を呼び出すと、表示崩れが発生するため
base.OnGUI を呼び出している場合は警告の波線が表示されます
イベント関数の引数が正しくない
Incorrect method signature
Awake、Start、Update などの Unity が自動で呼び出す関数の引数が間違っている場合、
警告の波線が表示されます
処理に時間がかかる関数を使用している
Expensive method invocation
Update や LateUpdate、FixedUpdate 、コルーチンなどは、
少し処理が遅いため、目立つようにハイライト表示されます
また、これらの関数の中で下記のような処理を記述した場合も
少し処理が遅くなる可能性があるため、ハイライト表示されます
- AddComponent
- GetComponent 系の関数
- Find 系の関数
- Debug.Log 系の関数
- 文字列による関数呼び出し
https://github.com/JetBrains/resharper-unity/wiki/Performance-critical-context-and-costly-methods
UnityEngine.Object の null チェックを何回も呼び出している
Expensive null compatison
UnityEngine.Object の null チェックは少し処理が遅いため、
Update や LateUpdate、FixedUpdate 、コルーチンなどの中で使用している場合、
ハイライト表示されます
Camera.main を何回も呼び出している
'Camera.main' is expensive
Camera.main は少し処理が遅いため、Update や LateUpdate、FixedUpdate 、
コルーチンなどの中で使用している場合、ハイライト表示されます
FormerlySerializedAs 属性が正しく使用されていない
Possible incorrect application of attribute to multiple fields
FormerlySerializedAs 属性を複数の変数定義に適用している場合、
警告の波線が表示されます
このようなコードに書き直すことで警告の波線が消えます
UnityEngine.Object の null チェックに null 合体演算子を使用している
'??' on a type deriving from 'UnityEngine.Object' bypasses the lifetime check on the underlying Unity engine object
UnityEngine.Object を継承しているインスタンスに対して null 合体演算子を使用すると、
null かどうかが正しくチェックできないことがあります
このようなコードに書き直すことで警告の波線が消えます
UnityEngine.Object の null チェックに null 条件演算子を使用している
'?.' on a type deriving from 'UnityEngine.Object' bypasses the lifetime check on the underlying Unity engine object
UnityEngine.Object を継承しているインスタンスに対して null 条件演算子を使用すると、
null かどうかが正しくチェックできないことがあります
このようなコードに書き直すことで警告の波線が消えます
属性の指定が正しくない
Attribute is redundant when applied to this declaration type
例えば、変数に適用するべき属性をプロパティに適用してしまっているなど、
属性の適用方法が間違っている場合、属性が暗めに表示されます
FormerlySerializedAs 属性の指定が正しくない
Redundant 'FormerlySerializedAs' attribute
FormerlySerializedAs 属性は、シリアライズされる変数に適用するものなので、
シリアライズされない変数に FormerlySerializedAs 属性を適用してしまっていると、
FormerlySerializedAs 属性が暗めに表示されます
HideInInspector 属性の指定が正しくない
Redundant 'HideInInspector' attribute
HideInInspector 属性は、シリアライズされる変数に適用するものなので、
シリアライズされない変数に HideInInspector 属性を適用してしまっていると、
HideInInspector 属性が暗めに表示されます
InitializeOnLoad 属性の指定が正しくない
Redundant 'InitializeOnLoad' attribute
InitializeOnLoad 属性は、static クラスに適用するものなので、
static ではないクラスに InitializeOnLoad 属性を適用してしまっていると、
InitializeOnLoad 属性が暗めに表示されます
SerializeField 属性の指定が正しくない
Redundant 'SerializeField' attribute
NonSerialized 属性が適用されている変数に SerializeField 属性を適用しても
その変数はシリアライズされないため、SerializeField 属性が暗めに表示されます
イベント関数の中身が実装されていない
Redundant Unity event function
Awake や Start、Update などの関数は中身が実装されていなくても
Unity から呼び出されてしまい、処理負荷が少しかかってしまうため、
Unity から呼び出されるが、中身が実装されていない関数は、暗めに表示されます
https://github.com/JetBrains/resharper-unity/wiki/Redundant-Unity-event-function
参照に時間がかかるプロパティを複数回参照している
Repeated access of property on built in component is inefficient
transform.localPosition などは複数回参照するよりも、
一時変数に代入してから参照した方が良いパフォーマンスになるため、
transform.localPosition などを複数回参照している場合、警告の波線が表示されます
このようなコードに書き直すことで警告の波線が消えます
https://github.com/JetBrains/resharper-unity/wiki/Avoid-multiple-unnecessary-property-accesses
Instantiate した後に親オブジェクトを設定している
Setting 'parent' property on built in component is inefficient
オブジェクトを Instantiate してから親オブジェクトを設定するよりも
Instantiate の引数に親オブジェクトを指定した方が良いパフォーマンスになるため、
オブジェクトを Instantiate してから親オブジェクトを設定している場合、
警告の波線が表示されます
このようなコードに書き直すことで警告の波線が消えます
Animator や Material のパラメータ指定に文字列を使っている
String based graphics property lookup is inefficient
Animator や Material などのパラメータを設定する時は、パラメータ名を
文字列ではなくハッシュ値で指定した方が良いパフォーマンスになるため、
文字列でパラメータ名を指定している場合、警告の波線が表示されます
このようなコードに書き直すことで警告の波線が消えます
GetComponent などの関数で型名を文字列で指定している
String based lookup of component type is inefficient
GetComponent などの関数を使用する時は、型名を文字列ではなく
ジェネリックで指定した方が良いパフォーマンスになるため、
文字列で型名を指定している場合、警告の波線が表示されます
このようなコードに書き直すことで警告の波線が消えます
タグの比較に CompareTag を使用していない
Use 'CompareTag' instead of explicit string comparison
タグを比較する時は、tag プロパティではなく CompareTag を使用した方が
良いパフォーマンスになるため、tag プロパティを使用している場合、
警告の波線が表示されます
このようなコードに書き直すことで警告の波線が消えます
存在しないシーンファイルを指定している
Scene does not exist
Unity プロジェクトに存在しないシーンの名前を
EditorSceneManager.OpenScene などで指定した場合、
警告の波線が表示されます
Build Settings で無効になっているシーンを指定している
Scene is disabled in the build settings
Unity の Build Settings で無効になっているシーンの名前を
SceneManager.LoadScene などで指定した場合、
警告の波線が表示されます
Build Settings に複数設定されている同名のシーンを指定している
Short scene name is not unique
Unity の Build Settings に同名のシーンファイルが複数設定されており、
そのシーン名を SceneManager.LoadScene などで指定した場合、
警告の波線が表示されます
同名のシーンファイルが Build Settings に複数設定されている場合は、
シーン名ではなくビルドインデックスを使用する必要があります
Build Settings に存在しないビルドインデックスを指定している
The index is missing in the build settings
Unity の Build Settings に存在しないビルドインデックスを
SceneManager.LoadScene などで指定した場合、
警告の波線が表示されます
InputManager に存在しない名前を指定している
The input name is not defined in the Input manager
Unity の InputManager に存在しない名前を Input.GetButtonDown などで指定した場合、
警告の波線が表示されます
存在しないレイヤーを指定している
The layers not defined in the 'Tags & Layers'
存在しないレイヤーの名前を使用した場合、警告の波線が表示されます
存在しないタグを指定している
The tag is not defined in the 'Tags & Layers'
存在しないタグの名前を使用した場合、警告の波線が表示されます
Build Settings に存在しないシーンを指定している
There is no scene with the same name in the build settings
Unity の Build Settings に設定していないシーンの名前を
SceneManager.LoadScene などで指定した場合、
警告の波線が表示されます
設定変更
Rider メニューの「File > Settings」から
「Editor > Inspection Settings > Inspection Severity > C#」を選択して
「Unity」を選択すると、警告を表示するかどうかを変更できます