Unity公式コミュニティで、ステンシル処理をノーコードで出来る方法を発見。
(外部アセットもなし)
- Image&TextMeshProに対応。
- Maskコンポーネント不要。
- 親子関係不要。
マテリアルの設定を変えるだけで、シェーダーのコードを変更しなくてもOk。
弄くり回してたらTextMeshProでも出来た。
元となったソースはココ↓
- Unity: 2019.4.1f1で動作確認済み。
- ゴブリン画像の制作元: ふわふわにゃんこ
設定手順
Imageの場合
- 新規マテリアルを作成、MaskMaterialと命名。
- インスペクターから設定。
- Shader -> UI -> Default
- Tint Color: (255, 255, 255, 1)
- Stencil Comparison: 8
- Stencil ID: 1
- Stencil Operation: 2
- Stencil Write Mask: 255
- Stencil Read Mask: 255
- Color Mask: 0
- Use Alpha Clip: true
- 新規マテリアルを作成、MaskedMaterialと命名。
- インスペクターから設定。
- Shader -> UI -> Default
- Tint Color: (255, 255, 255, 255)
- Stencil Comparison: 3
- Stencil ID: 2
- Stencil Operation: 0
- Stencil Write Mask: 0
- Stencil Read Mask: 1
- Color Mask: 15
- Use Alpha Clip: false
- マスク側のImageのマテリアルに、MaskMaterialを設定。
- マスクされる側のImageのマテリアルに、MaskedMaterialを設定。
TextMeshProの場合
マスク側
- Text – TextMeshProを作成。
- インスペクター -> 一番下のSDFのアイコンを右クリック -> Create Material Preset
(TextMeshProの設定は、同じMaterial Preset間で共有される為、別の物に分けている)
(“Font名 Mask”等と命名すると使い回し易い) - インスペクターから設定(前半Imageの場合と同じ)。
- Shader -> UI -> Default
- Tint Color: (255, 255, 255, 1)
- Stencil Comparison: 8
- Stencil ID: 1
- Stencil Operation: 2
- Stencil Write Mask: 255
- Stencil Read Mask: 255
- Color Mask: 0
- Use Alpha Clip: true
- Shader -> TextMeshPro -> Mobile -> Distance Field – Masking
(UI/Defaultシェーダーで変更した内部の値が残ったままになり完成)
- Shader -> UI -> Default
マスクされる側
- Text – TextMeshProを作成。
- インスペクター -> 一番下のSDFのアイコンを右クリック -> Create Material Preset
(TextMeshProの設定は、同じMaterial Preset間で共有される為、別の物に分けている)
(“Font名 Masked”等と命名すると使い回し易い) - インスペクターから設定(前半Imageの場合と同じ)。
- Shader -> UI -> Default
- Tint Color: (255, 255, 255, 255)
- Stencil Comparison: 3
- Stencil ID: 2
- Stencil Operation: 0
- Stencil Write Mask: 0
- Stencil Read Mask: 1
- Color Mask: 15
- Use Alpha Clip: false
- Shader -> TextMeshPro -> Mobile -> Distance Field – Masking
(UI/Defaultシェーダーで変更した内部の値が残ったままになり完成)
- Shader -> UI -> Default
使い方 (設置順)
- ヒエラルキー -> 「マスクされる側」を「マスク側」の下に配置。
(子でなく、同階層の下でOk)
注意点
以下のフォントでは、逆マスクが上手くいかなかった。
(マスクに使う場合は大丈夫)
- アウトライン付きのフォント
(アウトラインも単色(Vertex Color)になる)