diff --git a/Packages/src/README.md b/Packages/src/README.md index e0ef3e0..96792f3 100644 --- a/Packages/src/README.md +++ b/Packages/src/README.md @@ -14,40 +14,49 @@ ## 📝 Description - + -This package provides a soft masking for Unity UI (uGUI). +- **Soft Masking for Unity UI**: SoftMaskForUGUI provides a soft masking feature for Unity UI, allowing you to create more visually appealing UI effects. +- **Compatible with Mask**: SoftMask is fully compatible with the existing Mask component, making it easy to integrate into your current projects. +- **Support for Multiple Sprites and SpriteAtlas**: You can use multiple sprites and SpriteAtlas with SoftMask, giving you more flexibility in designing your UI. +- **Performance Optimization**: SoftMaskForUGUI is designed with performance in mind. It only renders the soft mask buffer when needed, helping to keep your game running smoothly. +- **Easy to Use**: Just add a `SoftMask` component instead of `Mask` component, or convert an existing `Mask` to `SoftMask` from the context menu. It's that simple! #### Features -* SoftMask is compatible with Mask. -* You can adjust the visible part. -![](https://user-images.githubusercontent.com/12690315/48661087-01ca9f00-eab0-11e8-8878-772a1ed1fb7b.gif) -* Text, Image, RawImage can be used as a masking. -* Support multiple-sprites and SpriteAtlas. -* Support up to 4 nested soft masks. -![](https://user-images.githubusercontent.com/12690315/48708326-a0d4cf80-ec45-11e8-83b8-f55d29138db7.png) -* Support scroll view. -![](https://user-images.githubusercontent.com/12690315/48708527-2b1d3380-ec46-11e8-9adf-9d33498f0353.png) -* Support inversed soft mask. -![](https://user-images.githubusercontent.com/12690315/48708328-a0d4cf80-ec45-11e8-9945-e877faabc968.png) -* Support overlay, camera space and world space. -![](https://user-images.githubusercontent.com/12690315/48708329-a0d4cf80-ec45-11e8-8328-16b697f981ec.png) -* (Option) Raycast is filtered only for the visible part. -![](https://user-images.githubusercontent.com/12690315/48708330-a16d6600-ec45-11e8-94bf-afecd1bd9a39.png) -* Contain soft maskable UI shader. -* Support soft masks in your custom shaders by adding just 3 lines. For details, please see [Development Note](#support-soft-masks-with-your-custom-shaders). -* Adjust soft mask buffer size to improve performance. -* Convert existing Mask to SoftMask from context menu. -![](https://user-images.githubusercontent.com/12690315/48659018-902e2900-ea8e-11e8-9b6e-224365cdde7f.png) -* Render the soft mask buffer only when needed to improve performance. -* Add a SoftMaskable component to the child UI elements of SoftMask from the inspector. -![](https://user-images.githubusercontent.com/12690315/50284153-76bc3a80-049b-11e9-8c55-719af897960a.png) -* Preview soft mask buffer in inspector. -![](https://user-images.githubusercontent.com/12690315/50284151-7459e080-049b-11e9-9cd3-24fb476766dc.png) -* Make multiple holes on one background by 'Parts of parent' option. -![](https://user-images.githubusercontent.com/12690315/54102470-f5c26e80-440b-11e9-89d1-899aa4dca00d.png) -* [Support TextMeshPro](#support-textmeshpro) +- **Compatibility with Mask**: SoftMask is fully compatible with the existing Mask component. + You can convert an existing Mask to SoftMask from the context menu. + ![](https://gist.github.com/assets/12690315/e194b7a8-b82d-4714-944d-89b4c9a88ee0) +- **Adjustable Visible Part**: You can freely adjust the visible part of the mask. + +- **Versatile Masking Options**: Text, Image, RawImage can be used as a masking graphic. +- **Support for Multiple Sprites and SpriteAtlas**: SoftMask supports multiple sprites and SpriteAtlas. +- **Nested Soft Masks**: SoftMask supports up to 4 nested soft masks. + +- **Scroll View Support**: SoftMask supports scroll views. +- **All Render Mode Support**: SoftMask supports overlay, camera space, and world space. +- **Soft-Maskable UI Shader Included**: The package includes a soft-maskable UI shader for `UI/Dafault`. +- **Custom Shader Support**: You can make your custom shaders soft-maskable with little modification. For details, please see [Development Note](#usage-with-your-custom-shaders). +- **Performance/Quality Adjustment**: You can adjust the soft mask buffer size to improve performance or quality. + +- **Efficient Rendering**: The soft mask buffer will be updated only when needed to improve performance. +- **SoftMaskable Component**: `SoftMaskable` component will be added automatically at runtime as needed. +- **Soft Mask Buffer Preview**: You can preview the soft mask buffer in the inspector. + +- **Anti-Alias Masking Mode**: If you don't need semi-transparent masks, you can use the more performant "Anti-Aliasing Masking Mode". + +- **Masking Shape**: You can add or remove mask region using `MaskingShape` component. + +- **Inverse Masking**: Use `MaskingShape` component to inverse masking. You can implement effects such as iris out. + +- **Ray-cast Filtering**: Ray-casts are filtered only for the visible part. + This feature is useful for preventing clicks on masked parts during tutorials. + +- **Stereo Support**: A shader macro `UI_SOFT_MASKABLE_STEREO` has been added for VR. + +- **TextMeshProUGUI Support**: Support TextMeshProUGUI by importing additional samples. + For details, please see [Support TextMeshPro](#usage-with-textmeshpro). +

@@ -63,63 +72,213 @@ _This package requires **Unity 2019.4 or later**._ #### Install via OpenUPM -This package is available on [OpenUPM](https://openupm.com) package registry. -This is the preferred method of installation, as you can easily receive updates as they're released. +- This package is available on [OpenUPM](https://openupm.com) package registry. +- This is the preferred method of installation, as you can easily receive updates as they're released. +- If you have [openupm-cli](https://github.com/openupm/openupm-cli) installed, then run the following command in your project's directory: + ``` + openupm add com.coffee.softmask-for-ugui + ``` +- To update the package, use Package Manager UI (`Window > Package Manager`) or run the following command: + ``` + openupm add com.coffee.softmask-for-ugui@2.0.0 + ``` + +#### Install via UPM (with Package Manager UI) + +- Click `Window > Package Manager` to open Package Manager UI. +- Click `+ > Add package from git URL...` and input the repository URL: `https://github.com/mob-sakai/SoftMaskForUGUI.git` + ![](https://gist.github.com/assets/12690315/24af63ed-8a2e-483d-9023-7aa53d913330) +- To update the package, change suffix `#{version}` to the target version. + - e.g. `https://github.com/mob-sakai/SoftMaskForUGUI.git#2.0.0` + +#### Install via UPM (Manually) + +- Open the `Packages/manifest.json` file in your project. Then add this package somewhere in the `dependencies` block: + ```json + { + "dependencies": { + "com.coffee.softmask-for-ugui": "https://github.com/mob-sakai/SoftMaskForUGUI.git", + ... + } + } + ``` + +- To update the package, change suffix `#{version}` to the target version. + - e.g. `"com.coffee.softmask-for-ugui": "https://github.com/mob-sakai/SoftMaskForUGUI.git#2.0.0",` + +#### Install as Embedded Package + +1. Download a source code zip file from [Releases](https://github.com/mob-sakai/SoftMaskForUGUI/releases) and extract it. +2. Place it in your project's `Packages` directory. + ![](https://gist.github.com/assets/12690315/c7b2b17f-3069-4563-ab89-b3c0e4cf821f) +- If you want to fix bugs or add features, install it as an embedded package. +- To update the package, you need to re-download it and replace the contents. -If you have [openupm-cli](https://github.com/openupm/openupm-cli) installed, then run the following command in your project's directory: +

-``` -openupm add com.coffee.softmask-for-ugui -``` +## 🔄 Upgrading from v1 to v2 -#### Install via UPM (using Git URL) +When updating from v1 to v2, the following breaking changes are included: -Navigate to your project's Packages folder and open the `manifest.json` file. Then add this package somewhere in the `dependencies` block: +1. **Shader macros changes**: The existing shader macros are changed. + - `SOFTMASK_EDITOR` -> `UI_SOFT_MASKABLE`, `UI_SOFT_MASKABLE_EDITOR` and `UI_SOFT_MASKABLE_STEREO` -```json -{ - "dependencies": { - "com.coffee.softmask-for-ugui": "https://github.com/mob-sakai/SoftMaskForUGUI.git", - ... - }, -} -``` +2. **API changes**: Some APIs are obsolete. + - SoftMask.softness: Use SoftMask.softMaskingRange instead. + - SoftMask.partOfParent: Use `MaskingShape` component instead. + +3. **`SoftMaskable` behaviour**: `SoftMaskable` component is no longer required to be added explicitly. + It will be added automatically at runtime as needed. -To update the package, change suffix `#{version}` to the target version. +To apply these changes, please follow the steps below: -* e.g. `"com.coffee.softmask-for-ugui": "https://github.com/mob-sakai/SoftMaskForUGUI.git#2.0.0",` +1. Click `Edit > Project Settings` to open the Project Settings window. + +2. Select `UI > SoftMask` category. + +3. Click on "Upgrade All Assets V1 to V2" to modify the assets. + ![](https://gist.github.com/assets/12690315/a8721071-9a12-481f-a97e-44ebbe696358) + +- NOTE: If you select "Dry Run", you can check the changes before upgrading. + ![](https://gist.github.com/assets/12690315/770287d3-fdb4-4d12-bf89-26babe908f8b) + ![](https://gist.github.com/assets/12690315/14105067-6708-4713-882e-89a7091d4245)

## 🚀 Usage -1. Add a `SoftMask` component instead of `Mask` component. +1. Add a `SoftMask` component instead of `Mask` component. Or, convert an existing `Mask` component to `SoftMask` component from the context menu (`Convert To SoftMask`). - ![](https://user-images.githubusercontent.com/12690315/48659018-902e2900-ea8e-11e8-9b6e-224365cdde7f.png) -2. (Optional) By placing the `MaskingShape` component under `SoftMask`, you can add or remove the mask range. - ![](https://user-images.githubusercontent.com/12690315/48661087-01ca9f00-eab0-11e8-8878-772a1ed1fb7b.gif) -3. Enjoy! + ![](https://gist.github.com/assets/12690315/e194b7a8-b82d-4714-944d-89b4c9a88ee0) + +2. Adjust the soft mask parameters in the inspector. + ![](https://gist.github.com/assets/12690315/6a61c458-4a1d-4e4f-9471-19d819a990fd) + +3. (Optional) By placing the `MaskingShape` component under `SoftMask`, you can add or remove the masking region. + ![](https://gist.github.com/assets/12690315/5a633b7b-4411-4ab9-aa4a-aa586e5d756b) + +4. Enjoy!

-#### Usage with TextMeshPro +#### Comparison of Masking Mode -Open the `Package Manager` window and select the `UI Soft Mask` package in the package list and click the `TextMeshPro Support > Import in project` button. + -The assets will be imported into `Assets/Samples/UI Soft Mask/{version}/TextMeshPro Support`. +- **Soft Masking**: Smooth mask with semi-transparency. + Requires memory for `RenderTexture` and [soft-maskable shader](#usage-with-your-custom-shaders). +- **Anti-Aliasing**: Less jagged stencil mask. + It does not require `RenderTexture` or soft-maskable shader, and works faster. +- **Normal**: Same as `Mask` component's stencil mask. -**NOTE:** You must import [TMP Essential Resources](https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.0/manual/index.html#installation) before using. If the shader error is not resolved, reimport the shader. +

-#### Usage with your custom shaders +#### Masking Shape + + + +- `MaskingShape` component allows you to add or remove the masking region. +- Placing `MaskingShape` component (with any `Graphic`) under `SoftMask` component. + ![](https://gist.github.com/assets/12690315/56979800-9acd-4fa8-9a88-9984e5733e92) +- You can use it not only with `SoftMask` component but also with `Mask` component. +- If the `MaskingMode` is `AntiAliasing` or `Normal`, or if you are using the `Mask` component, the `MaskingShape` component must be placed above the masked `Graphic` in the hierarchy. This is a limitation based on the stencil mask. +- The available features depend on the `Masking Mode`. + ![](https://gist.github.com/assets/12690315/cd05567c-1710-4d53-a617-94c6cc9f1c70) + ![](https://gist.github.com/assets/12690315/fe73d465-c230-4104-a840-b6ae06f8e2ed) + ![](https://gist.github.com/assets/12690315/f961af3f-2692-4c0e-b9c5-ebd2e11ec8c5) + +

+ +#### Rect Transform Fitter + +![](https://gist.github.com/assets/12690315/ffb08715-605e-47ec-91bd-8613dd2a646e) -There are two ways to support soft masks with custom shaders. +- `RectTransformFitter` component follows the target RectTransform. +- You can specify the properties to follow (position, rotation, scale, delta size) with `RectTransformFitter.targetProperties`. +- By combining it with the `MaskingShape` component, you can implement an effect that displays only the buttons during the tutorial. -NOTE: To support soft masks, you need to add the `(SoftMaskable)` suffix to the shader name. +

+ +#### Project Settings + +![](https://gist.github.com/assets/12690315/a5ae481a-9cc4-4e42-bf4e-9f4738c32e58) + +- Click `Edit > Project Settings` to open the Project Settings window and then select `UI > SoftMask` category. + +

+ +#### Usage with Scripts + +```csharp +var softMask = gameObject.GetComponent(); +softMask.maskingMode = SoftMask.MaskingMode.SoftMasking; +softMask.downSamplingRate = SoftMask.DownSamplingRate.x2; +softMask.softMaskingRange = new MinMax01(0.5f, 0.75f); +``` + +

+ +#### Usage with TextMeshPro + +1. First, you must import [TMP Essential Resources](https://docs.unity3d.com/Packages/com.unity.textmeshpro@3.0/manual/index.html#installation) before using. + ![](https://gist.github.com/assets/12690315/8a3b7357-1fed-44f8-bfc2-af14c3e56cb1) + +2. Open the `Package Manager` window and select the `UI Soft Mask` package in the package list and click the `TextMeshPro Support > Import` button. + NOTE: If you are using TextMeshPro v3.2+ or v4.0+, click the `TextMeshPro Support v3.2 or v4.0 > Import` button instead. + ![](https://gist.github.com/assets/12690315/59994633-d6dd-429d-8a26-c10c142f8cd2) + +3. The assets will be imported under `Assets/Samples/UI Soft Mask/{version}`. + ![](https://gist.github.com/assets/12690315/c69912a9-2e84-4cb2-8409-ba6e35103715) + +
+ +#### Usage with your custom shaders -1. **Hybrid (recommended)**: Add a `SoftMaskable` variant to the existing shader. - This way requires minimal changes (add few lines). -2. **Separate**: Create a new shader with a `SoftMaskable` variant. - Use this way for built-in shaders that cannot be edited, like `UI/Default`. +Here, let's make [UI/Additive](https://raw.githubusercontent.com/mob-sakai/SoftMaskForUGUI/develop/Assets/Demos/SoftMaskable%20Shader/UI-Additive.shader) custom shader soft-maskable. There are two ways to support SoftMask with custom shaders. + +- **Hybrid (recommended)**: Add soft-maskable variants to the existing shader. + Modify the shader as follows: + ```shaderlab + // Add the ` (SoftMaskable)` suffix to the shader name. + Shader "UI/Additive (SoftMaskable)" + + // Import "UISoftMask.cginc" and add shader variants. + #include "Packages/com.coffee.softmask-for-ugui/Shaders/UISoftMask.cginc" + #pragma multi_compile_local __ UI_SOFT_MASKABLE UI_SOFT_MASKABLE_EDITOR // default, soft-maskable, soft-maskable (for editor) + #pragma multi_compile_local __ UI_SOFT_MASKABLE_STEREO // (Optional) for stereo rendering (VR) + + // "SoftMask" function returns [0-1]. Multiply this by the final output. + color.a *= SoftMask(IN.vertex, mul(unity_ObjectToWorld, IN.worldPosition)); + + // Use "SoftMaskClip" function instead of "clip" + #ifdef UNITY_UI_ALPHACLIP + SoftMaskClip (color.a - 0.001); + #endif + ``` + - Result: [UI/Additive (SoftMaskable)](https://raw.githubusercontent.com/mob-sakai/SoftMaskForUGUI/develop/Assets/Demos/SoftMaskable%20Shader/UI-Additive-SoftMaskable.shader) +- **Separate**: Create a new shader with soft-maskable variants. + Use this way for built-in shaders that cannot be edited, like `UI/Default`. + Modify the shader as follows: + ```shaderlab + // Add the `Hidden/` prefix and ` (SoftMaskable)` suffix to the shader name. + Shader "Hidden/UI/Additive (SoftMaskable)" + + // Import "UISoftMask.cginc" and add shader variants. + #include "Packages/com.coffee.softmask-for-ugui/Shaders/UISoftMask.cginc" + #pragma multi_compile_local UI_SOFT_MASKABLE UI_SOFT_MASKABLE_EDITOR // soft-maskable, soft-maskable (for editor) + #pragma multi_compile_local __ UI_SOFT_MASKABLE_STEREO // (Optional) for stereo rendering (VR) + + // "SoftMask" function returns [0-1]. Multiply this by the final output. + color.a *= SoftMask(IN.vertex, mul(unity_ObjectToWorld, IN.worldPosition)); + + // Use "SoftMaskClip" function instead of "clip" + #ifdef UNITY_UI_ALPHACLIP + SoftMaskClip (color.a - 0.001); + #endif + ``` + - Result: [Hidden/UI/Additive (SoftMaskable)](https://raw.githubusercontent.com/mob-sakai/SoftMaskForUGUI/develop/Assets/Demos/SoftMaskable%20Shader/Hidden-UI-Additive-SoftMaskable.shader) + +![](https://gist.github.com/assets/12690315/db779413-6896-4320-b26f-c355a85b383e)