発生している問題
親クラスに表示/非表示の処理を記述し、子クラスで表示/非表示が切り替わった際の処理を実装したい時、何も考えずに以下のように実装していました
親クラス
public bool IsActive
{
get
{
return gameObject.activeSelf;
}
set
{
OnSetActive(value);
gameObject.SetActive(value);
}
}
protected virtual void OnSetActive(bool isActive)
{
if(isActive)
{
Debug.Log("表示");
}
else
{
Debug.Log("非表示");
}
}
子クラス
// 表示/非表示が切り替わった
protected override void OnSetActive(bool isActive)
{
if(isActive)
{
Debug.Log("表示された");
}
else
{
Debug.Log("非表示になった");
}
}
子クラスの関数が読みづらい!
OnSetActive()がoverrideされ、見ただけでは何の処理をしているのか分かりづらく、個人的に納得いきませんでした、、、
解決
問題となってるのは子クラスでの読みにくさなので、overrideする関数名を変更する
子クラス(修正後)
// 表示時の初期化
protected override void OnShowInit()
{
Debug.Log("表示された");
}
// 非表示時のリセット
protected override void OnHideReset()
{
Debug.Log("非表示になった");
}
個人的にはOnShow()ではなく、処理内容も簡潔に説明したOnShowInit()としたい
上記の子クラスに伴い、親クラスも修正する
親クラス(修正後)
public bool IsActive
{
get
{
return gameObject.activeSelf;
}
set
{
if(value)
{
OnShowInit();
}
else
{
OnHideReset();
}
gameObject.SetActive(value);
}
}
protected virtual void OnShowInit()
{
Debug.Log("表示");
}
protected virtual void OnHideReset()
{
Debug.Log("非表示");
}
まとめ
親クラスにif分を追加し、関数を細分化することで読みやすくなった
正直どっちでも動くし気にしない!という方もいると思いますが、参考になればと思います。