うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Image の 透明部分を クリックしても Raycast が反応しないようにする

Image の alphaHitTestMinimumThreshold を 0以上にすればタップした際に有効な Alpha の値を変更できる

alphaHitTestMinimumThreshold を 1にすると半透明な部分のタップが無効化される

しかしテクスチャが半透明かどうか判定するために Read/Write Enable を有効にし
SpriteMeshType を FullRect にする必要がある

そのため、有効 Alpha 値を変更したタイミングで テクスチャの設定を変更する処理も行っている

f:id:hacchi_man:20201006220918g:plain

using UnityEngine;
using UnityEngine.UI;
 
[RequireComponent(typeof(Image))]
public class ImageHitAlpha : MonoBehaviour
{
    [SerializeField, HideInInspector]
    private Image _image;
 
    [SerializeField, Range(0f, 1f)]
    private float _threshold = 0f;
 
#if UNITY_EDITOR
 
    private void Reset()
    {
        _image = GetComponent<Image>();
        _image.alphaHitTestMinimumThreshold = _threshold;
    }

    private void OnValidate()
    {
        _image.alphaHitTestMinimumThreshold = _threshold;
 
        if (_image.sprite == null)
            return;
 
        if (_threshold <= 0f)
            return;
 
        // GetPixel をするためにReadWriteが有効である必要がある
        var path = UnityEditor.AssetDatabase.GetAssetPath(_image.sprite);
        var importer = UnityEditor.AssetImporter.GetAtPath(path) as UnityEditor.TextureImporter;
        if (!importer.isReadable)
        {
            importer.isReadable = true;
            UnityEditor.EditorUtility.SetDirty(_image.sprite);
            UnityEditor.AssetDatabase.SaveAssets();
        }
 
        var settings = new UnityEditor.TextureImporterSettings();
        importer.ReadTextureSettings(settings);
        if (settings.spriteMeshType != SpriteMeshType.FullRect)
        {
            settings.spriteMeshType = SpriteMeshType.FullRect;
            importer.SetTextureSettings(settings);
            importer.SaveAndReimport();
        }
    }
 
#endif
}