- Unity のバージョン
- Unity 2017.3.1f1
導入
みなさん、uGUI で透明なボタンを作りますよね?
さて、どのようにつくりますか?
一般的な作り方は、ボタンを用意して、それに紐付いている Image の Color を α値 = 0 にする方法でしょう。
しかし、この方法だと実は描画に負荷を与えてしまっています。。見た目では描画していないように見えていますが、実は Image の α 値 = 0 にしても描画されてしまっています。(α値 = 0 の Mesh が残っているため、描画対象になってしまっている)
Button に Image を使ったときの挙動
![ImageButton.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F151719%2F0948056c-1cf8-39ea-aa6e-7a301067c466.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=91ddaf67b63e8a3898fc8b2ce738acfd)
![ImageButtonAlpha.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F151719%2F086e1a3e-0d24-bf76-ac35-52d9e1a94bf4.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=4e6a114000e897099685b3e671f87e3e)
FrameDebugger の UGUI.Rendering.RenderOverlays -> Canvas.RenderOverlays.DrawMesh がボタンの描画部分
普通に表示しても透明にしても、Draw Mesh が発生する。
描画をなくし、当たり判定だけを取るためにはどのようにしたらよいでしょうか。
解決方法
Image の継承元である Graphic を継承したクラスを作成します。
public class ClickDetector : Graphic
{
protected override void OnPopulateMesh(VertexHelper vh)
{
// Base クラスで Mesh を生成しているので、override で Mesh を生成させないようにする。
// Graphic はデフォルトで DoLegacyMeshGeneration() を呼ぶようになっており、
// その中で OnPopulateMesh(Graphic.workerMesh) を実行している。
// Graphic.workerMesh (= vh) にアクセスしてしまうと、Mesh が自動生成されるようになっている
// Mesh が生成されると、Sprite が貼られていない Image のように、白い画像が出力されるのでどうにかしないといけない。
// vh で mesh が必ず作られてしまうので、Clear を叩いて Mesh を削除する。
vh.Clear();
}
}
コメントに書いてある細かい話のコードはこのあたり。
https://bitbucket.org/Unity-Technologies/ui/src/a3f89d5f7d145e4b6fa11cf9f2de768fea2c500f/UnityEngine.UI/UI/Core/Graphic.cs?at=2017.3&fileviewer=file-view-default#Graphic.cs-423
ここで作成した ClickDetector を Image の代わりに GameObject にくっつけましょう。
Button に自作の 「ClickDetector」 をくっつけたときの挙動
![clickdetector.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F151719%2F3dcf8e57-a29e-4ec9-bee7-1045c6282661.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=208dc90f6998aaa05749c014f7cc1416)
FrameDebugger の UGUI.Rendering.RenderOverlays -> Canvas.RenderOverlays.DrawMesh が無くなっている
できた。