Unity¤Ë´ØÏ¢¤¹¤ëµ­»ö¤Ç¤¹

¡¡Sprite ²èÁü¤Ï SpriteMask µ¡Ç½¤òÍøÍѤ¹¤ë¤³¤È¤Ë¤è¤ê²èÁü¤ÎÀÚ¤êÈ´¤­(¥Þ¥¹¥¯)½èÍý¤¬²Äǽ¤Ç¤¹¤¬¡¢
¤³¤Îµ¡Ç½¤ò±þÍѤ·¤Æ¡¢²¼µ­¤Î¤è¤¦¤Ë¡¢²èÁü¤Î¥µ¥¤¥º¤Ë¹ç¤ï¤»¤¿¥·¥ë¥¨¥Ã¥È¤òºîÀ®¤¹¤ë¼ÂÁõÎã¤Ç¤¹¡£

¡¡¤Þ¤¿¥·¥ë¥¨¥Ã¥ÈÍѤβèÁü¤ÎÀßÄê¤Ë¤è¤ê¡¢¥·¥ë¥¨¥Ã¥È¤Î¿§¤òÊѲ½¤µ¤»¤ë¤³¤È¤â²Äǽ¤Ç¤¹¡£


Æ°²è¥Õ¥¡¥¤¥ë¤Ø¤Î¥ê¥ó¥¯

¡¡
¡¡º£²ó¤Ï Sprite ¤ËÂФ·¤Æ¤Î¥Þ¥¹¥¯½èÍý¤Î¤¿¤á SpriteMask ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¤¬¡¢
Image ¤Î¾ì¹ç¤Ë¤Ï Mask ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤òÍøÍѤ¹¤ë¤³¤È¤ÇÂбþ¤¬²Äǽ¤Ç¤¹¡£



Àß·×



¡¡¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î¹½Â¤¤Ï²¼µ­¤ÎÄ̤ê¤Ç¤¹¡£




¡¡EnemySet ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ï CreateEmpty ¤ÇºîÀ®¤·¤Æ¤¤¤ë¡¢¥Õ¥©¥ë¥ÀÌò¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¹¡£
¤³¤ÎÃæ¤Ë SpriteRenderer ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò»ý¤Ä²èÁüɽ¼¨ÍѤΠBody ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬¤¢¤ê¡¢
¤µ¤é¤Ëº£²óºîÀ®¤¹¤ë ReverseSprite ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¡¢ SpriteMask ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬¤¢¤ê¤Þ¤¹¡£



Body ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®


¡¡Ä̾ï¤Î²èÁü¤ÎÀßÄêÍѤǤ¹¡£
¥·¥ë¥¨¥Ã¥È¤Ë¤·¤¿¤¤¸µ¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤·¤Þ¤¹¡£

¡¡SpriteRenderer ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥¢¥¿¥Ã¥Á¤·¡¢²èÁü¤ÎÍ¥Àè½ç°Ì¤òÀßÄꤷ¤Þ¤¹¡£

¡¡²èÁü¤Î¥µ¥¤¥º¤Ï¡¢¿Æ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤Ï¤Ê¤¯¡¢»Ò¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë Body ¤ÇÄ´À°¤·¤Þ¤¹¡£

¡¡¤Þ¤¿ Mask Interaction ¤ÎÀßÄê¤ò¹Ô¤¤¤Þ¤¹¡£
Visible Outside Mask ¤ËÀßÄꤷ¤Æ¤¯¤À¤µ¤¤¡£¤³¤ÎÀßÄê¤Ë¤¹¤ë¤³¤È¤Ç²èÁü¤òÀÚ¤êÈ´¤­¡¢¥Þ¥¹¥¯¤¹¤ë¡Ê±£¤¹¡Ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£


¡¡²¼µ­¤Ï¥µ¥ó¥×¥ë²èÁü¤Ç¤¹¡£


Scene ¥Ó¥å¡¼²èÁü



¥¤¥ó¥¹¥Ú¥¯¥¿¡¼²èÁü




ReverseSprite ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®


¡¡Ä̾ï¥Þ¥¹¥¯½èÍý¤ò¤¹¤ë¤È²èÁü¤ò¤¯¤ê¤Ì¤¯·Á¤Ë¤Ê¤ë¤¿¤á¡¢¤½¤Î²èÁü¤Î¤¢¤Ã¤¿Çطʤˤϲ¿¤â±Ç¤ê¤Þ¤»¤ó¡£






¡¡²èÁü¤Ë¥·¥ë¥¨¥Ã¥È¤òºî¤Ã¤ÆµÕ¥Þ¥¹¥¯¤ò¤«¤±¤ë¤Ë¤Ï¡¢ÀìÍѤΥ²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬É¬Íפˤʤê¤Þ¤¹¡£

¡¡¤³¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ï 2D ¢ª Square ¤Ç»Í³Ñ¤¤¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤¹¤ë¤«¡¢
¶õ¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Ë SpriteRenderer ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥¢¥¿¥Ã¥Á¤·¤ÆºîÀ®¤·¤Þ¤¹¡£

¡¡¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î¥µ¥¤¥º¤Ï¡¢¥Þ¥¹¥¯½èÍý¤¹¤ë²èÁü¤òʤ¤¦¤³¤È¤¬²Äǽ¤Ê¥µ¥¤¥º¤Ë¤·¤Þ¤¹¡£

¡¡²èÁü¤Ë¤ÏǤ°Õ¤Î£±¿§¤Î²èÁü¤òÀßÄꤷ¤Þ¤¹¡£
¤³¤Î¤È¤­¤Î²èÁü¤Î¿§¤¬¥·¥ë¥¨¥Ã¥È¤Î¿§¤Ë¤Ê¤ê¤Þ¤¹¤Î¤Ç¡¢ÀÖ¤¤²èÁü¤òÀßÄꤹ¤ì¤Ð¡¢ÀÖ¤¤¥·¥ë¥¨¥Ã¥È¤Ë¤Ê¤ê¤Þ¤¹¡£

¡¡¹õ¤Î¥·¥ë¥¨¥Ã¥È¤Ë¤Ä¤¤¤Æ¤Ï¡¢À֤ʤɤθµ¤Î¿§¤ò¹õ¤¯¤¹¤ë¤³¤È¤ÇÂбþ²Äǽ¤Ç¤¢¤ë¤¿¤á¡¢
¤Ê¤ë¤Ù¤¯¹õ°Ê³°¤Î¿§¤Î²èÁü¤ÇÀßÄꤷ¤Æ¤ª¤¯¤È£²¿§¤ËÊѲ½²Äǽ¤Ç¤¹¡£

¡¡¤Þ¤¿²èÁü¤ò¥Þ¥¹¥¯¤·¤¿ºÝ¤Ëɽ¼¨¤µ¤ì¤ë¤è¤¦¤Ë¤·¤¿¤¤¤Î¤Ç¡¢¸µ¤Î²èÁü¤è¤ê¤âɽ¼¨¤ÎÍ¥Àè½ç°Ì¤òÄ㤯ÀßÄꤷ¤Æ¤ª¤­¤Þ¤¹¡£

¡¡ºÇ¤â½ÅÍ×¤Ê¤Î¤Ï Mask Interaction ¤ÎÀßÄê¤Ç¤¹¡£
Visible Inside Mask ¤ËÀßÄꤷ¤Æ¤¯¤À¤µ¤¤¡£¤³¤ÎÀßÄê¤Ë¤¹¤ë¤³¤È¤Ç¥·¥ë¥¨¥Ã¥È¤ò¤Ä¤±¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£

¡¡²¼µ­¤Ï¥µ¥ó¥×¥ë²èÁü¤Ç¤¹¡£¤³¤³¤Ç¤ÏÀ֤βèÁü¤òÍøÍѤ·¤Æ¤¤¤Þ¤¹¡£







¡¡¿§¤ò¹õ¤¯¤¹¤ë¤È¡¢¹õ¤¤²èÁü¤Ë¤Ê¤ê¤Þ¤¹¡£








¡¡¸µ¤Î²èÁü¤è¤ê¤âÍ¥Àè½ç°Ì¤¬Ä㤯¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¡¢¸µ¤Î²èÁü¤è¤ê¤âÂ礭¤Ê¥µ¥¤¥º¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤ò³Îǧ¤·¤Æ¤ª¤­¤Þ¤·¤ç¤¦¡£


SpriteMask ¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎºîÀ®


¡¡¥Þ¥¹¥¯½èÍý¤ò¤«¤±¤ë¤¿¤á¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤·¤Þ¤¹¡£
Create Empty ¤Ç¶õ¤Î»Ò¥ª¥Ö¥¸¥§¥¯¥È¤òºîÀ®¤·¡¢SpriteMask ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¥¢¥¿¥Ã¥Á¤·¤Þ¤¹¡£

¡¡¤Ê¤ª¡¢¥Þ¥¹¥¯½èÍý¤¹¤ë²èÁüÍѤΥ²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î»Ò¥ª¥Ö¥¸¥§¥¯¥È¤Ë¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£







¡¡¤³¤Î»þÅÀ¤Ç¡¢Àè¤ËºîÀ®¤·¤Æ¤¤¤ë£²¤Ä¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î SpriteRenderer Æâ¤Î Mask Interaction ¤ÎÀßÄ꤬Àµ¤·¤¤¾ì¹ç
¼«Æ°Åª¤Ë¥·¥ë¥¨¥Ã¥È¤¬¤«¤«¤ë·Á¤Ç¥Þ¥¹¥¯½èÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£

¡¡¤¦¤Þ¤¯¤¤¤«¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢Á°¤Ëºî¤Ã¤¿£²¤Ä¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤Î SpriteRenderer ¤ÎÀßÄê¤ò¸«Ä¾¤·¤Æ¤¯¤À¤µ¤¤¡£




¡¡´ðËÜŪ¤Ë¤Ï¥²¡¼¥àÆâ¤ÇưŪ¤Ë¥·¥ë¥¨¥Ã¥È¤ò½Ð¤¹¥±¡¼¥¹¤¬Â¿¤¤¤È»×¤ï¤ì¤Þ¤¹¤Î¤Ç¡¢
ºÇ½é¤Ï SpriteMask ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î Enabled ¤ò false ¤ËÀßÄꤷ¤Æ¥Þ¥¹¥¯½èÍý¤òÄä»ß¤µ¤»¤Æ¤ª¤¯¤È¤è¤¤¤Ç¤·¤ç¤¦¡£

¡¡µÕ¤Ë¥·¥ë¥¨¥Ã¥È¾õÂÖ¤«¤éÍøÍѤ·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢¤½¤Î¤Þ¤Þ Enebled ¤òÆþ¤ì¤Æ¤ª¤­¤Þ¤·¤ç¤¦¡£






Æ°ºî³Îǧ¤ò¹Ô¤¦


¡¡°Ê¾å¤Ç´°À®¤Ç¤¹¡£

¡¡²¼µ­¤Ï¥µ¥ó¥×¥ë¥³¡¼¥É¤Ç¤¹¡£
¥Ü¥¿¥ó¤ò²¡¤¹¤¿¤Ó¤Ë SpriteMask ¤Î Enebled ¤¬ÀÚ¤êÂؤï¤ê¡¢¥·¥ë¥¨¥Ã¥È¤Î¥ª¥ó¥ª¥Õ¤ò³Îǧ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£


SpriteMaskController.cs
using UnityEngine;

public class SpriteMaskController : MonoBehaviour
{
    [SerializeField]
    private SpriteMask maskComponent;

    private void Update()
    {
        // null ¥Á¥§¥Ã¥¯¤ò¹Ô¤¤¡¢maskComponent¤¬¥¢¥µ¥¤¥ó¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ï½èÍý¤ò¹Ô¤ï¤Ê¤¤
        if (maskComponent == null)
        {
            Debug.LogError("SpriteMask¥³¥ó¥Ý¡¼¥Í¥ó¥È¤¬¥¢¥µ¥¤¥ó¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
            return;
        }

        // ¥¹¥Ú¡¼¥¹¥­¡¼¤¬²¡¤µ¤ì¤¿¤é
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // SpriteMask¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Îenabled¥×¥í¥Ñ¥Æ¥£¤ò¥È¥°¥ë
            ToggleSpriteMask();
        }
    }

    /// <summary>
    /// SpriteMask¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Îenabled¥×¥í¥Ñ¥Æ¥£¤ÎÀÚ¤êÂؤ¨
    /// </summary>
    private void ToggleSpriteMask()
    {
        // SpriteMask¤Îenabled¥×¥í¥Ñ¥Æ¥£¤òȿž
        maskComponent.enabled = !maskComponent.enabled;
    }
}


¡ã¥µ¥ó¥×¥ë¥³¡¼¥É­¡¡ä


¡¡Àµ¾ï¤ËÆ°ºî¤¹¤ë¤³¤È¤ò³Îǧ¤Ç¤­¤¿¤é¡¢¼ÂºÝ¤Ë¥²¡¼¥àÆâ¤Î½èÍý¤ò¥¤¥á¡¼¥¸¤·¤Æ¼ÂÁõÊýË¡¤ò¸¡Æ¤¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤¡£

¡¡²¼µ­¤Ï¥µ¥ó¥×¥ë¥³¡¼¥É¤Ç¤¹¡£

¡¡¤³¤Î½èÍý¤Ç¤Ï»ØÄꤷ¤¿¥Ü¥¿¥ó¤ò²¡¤¹¤³¤È¤Ë¤è¤ê¡¢¥Þ¥¹¥¯¤ò¤«¤±¤Æ¥·¥ë¥¨¥Ã¥È¾õÂ֤ˤ·¤Þ¤¹¡£
¤½¤Î¸å¡¢¥·¥ë¥¨¥Ã¥È¾õÂ֤Τޤޡ¢¥·¥ë¥¨¥Ã¥È¤Î¿§¤ò°ìÄê»þ´Ö¤´¤È¤Ë¸µ¤Î¿§¤È¹õ¿§¤È¤Ç¸ò¸ß¤ËÆþ¤ìÂؤ¨¤ë¤³¤È¤ÇÅÀÌǾõÂÖ¤òºî¤ê¤Þ¤¹¡£
ÅÀÌǸ塢¥Þ¥¹¥¯¤ò²ò½ü¤·¤Æ¸µ¤Î²èÁü¤ËÌᤷ¤Þ¤¹¡£

¡¡Î㤨¤Ð¡¢¥À¥á¡¼¥¸¤ò¼õ¤±¤¿ºÝ¤Î½èÍý¤Ê¤É¤¬ÁÛÄꤵ¤ì¤ë¥±¡¼¥¹¤Ç¤¹¡£


SilhouetteEffectController.cs
using System.Collections;
using UnityEngine;

public class SilhouetteEffectController : MonoBehaviour
{
    [SerializeField]
    private SpriteMask spriteMask;

    [SerializeField]
    private SpriteRenderer spriteRenderer;

    [SerializeField]
    private KeyCode activationKey = KeyCode.Space;

    [SerializeField]
    private float blinkInterval = 0.2f;   // 1²ó¤¢¤¿¤ê¤ÎÅÀÌǤλþ´Ö

    [SerializeField]
    private int blinkCount = 2;   // ÅÀÌDzó¿ô

    private bool isProcessing = false;¡¡// ÅÀÌÇÃ椫¤É¤¦¤«¤Î³Îǧ¥Õ¥é¥°¡£true ¤Ê¤éÅÀÌÇÃæ


    private void Update()
    {
        // ÅÀÌÇÃæ¤Ç¤Ê¤¤¾ì¹ç¤Ç¡¢¤«¤Ä»ØÄꤷ¤¿¥­¡¼¤¬²¡¤µ¤ì¤¿¤é
        if (!isProcessing && Input.GetKeyDown(activationKey))
        {
            // ¥·¥ë¥¨¥Ã¥È½èÍý¤ò³«»Ï
            StartCoroutine(ActivateSilhouette());
        }
    }

    /// <summary>
    /// ¥·¥ë¥¨¥Ã¥È½èÍý
    /// </summary>
    /// <returns></returns>
    private IEnumerator ActivateSilhouette()
    {
        // ÅÀÌÇÃæ¤Î¥Õ¥é¥°¤ò¤¿¤Æ¤ë
        isProcessing = true;

        // ¥·¥ë¥¨¥Ã¥ÈÍѤΥޥ¹¥¯¤òÍ­¸ú²½
        spriteMask.enabled = true;

        // ÅÀÌǽèÍý¡£yield return ÉÕ¤­¤Î StartCoroutine ¤È¤¹¤ë¤³¤È¤Ç¡¢ÅÀÌǽèÍý¤¬½ª¤ï¤ë¤Þ¤Ç¼¡¤Î½èÍý¤Ë°Ü¤é¤Ê¤¤¤è¤¦¤Ë¤·¤Æ¤¤¤ë
        yield return StartCoroutine(BlinkEffect());

        // ÅÀÌǽèÍý¤¬½ª¤ï¤Ã¤¿¤Î¤Ç¥·¥ë¥¨¥Ã¥ÈÍѤΥޥ¹¥¯¤ò̵¸ú²½
        spriteMask.enabled = false;

¡¡¡¡¡¡¡¡// ÅÀÌǤ¬½ª¤ï¤Ã¤¿¤Î¤Ç¥Õ¥é¥°¤ò¤ª¤í¤¹
        isProcessing = false;
    }

    /// <summary>
    /// ÅÀÌǽèÍý
    /// </summary>
    /// <returns></returns>
    private IEnumerator BlinkEffect()
    {
        for (int i = 0; i < blinkCount; i++)
        {
            // ¸µ¤Î¿§¤«¤é¹õ¿§¤ËÊѹ¹
            spriteRenderer.color = Color.black;
            yield return new WaitForSeconds(blinkInterval);

            // ¹õ¿§¤«¤é¸µ¤Î¿§¤ËÊѹ¹
            spriteRenderer.color = Color.white;
            yield return new WaitForSeconds(blinkInterval);
        }
    }

¡¡¡¡/// <summary>
¡¡¡¡/// ¥·¥ë¥¨¥Ã¥È¸ú²Ì¤ò³°Éô¤«¤é¼Â¹Ô²Äǽ¤Ê¥é¥Ã¥×Íѥ᥽¥Ã¥É
¡¡¡¡/// </summary>
¡¡¡¡public void StartSilhouetteEffect()
¡¡¡¡{
    ¡¡¡¡if (!isProcessing)
    ¡¡¡¡{
        ¡¡¡¡StartCoroutine(ActivateSilhouette());
    ¡¡¡¡}
¡¡¡¡}
}
¡¡
¡¡³°Éô¥¯¥é¥¹¤«¤é¤ÏľÀÜ¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ò¼Â¹Ô¤·¤Ê¤¤¤è¤¦¤Ë¤·¤Þ¤¹¡£
¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤Ï¡¢¼Â¹Ô¸µ¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬¥²¡¼¥àÆâ¤Ë»Ä¤Ã¤Æ¤¤¤ëɬÍפ¬¤¢¤ë¤¿¤á¡¢
Ëü¤¬°ì¡¢¼Â¹Ô¸å¤Ë¼Â¹Ô¸µ¤Î¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬ÇË´þ¤µ¤ì¤Æ¤·¤Þ¤¦¤È¡¢¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤¬Ää»ß¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£

¡¡¤è¤Ã¤Æ³°Éô¥¯¥é¥¹¤«¤é¤Ï¥é¥Ã¥×ÍѤΥ᥽¥Ã¥É¤ò¼Â¹Ô¤·¡¢¤½¤Î¥¯¥é¥¹Æâ¤Ç¼«Ê¬¤Ç¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ò¼Â¹Ô¤µ¤»¤Þ¤¹¡£

¡¡¤³¤Î¤è¤¦¤ÊÀ߷פˤ·¤Æ¤ª¤¯¤³¤È¤Ç°ÂÁ´¤Ë¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤¬²Äǽ¤Ë¤Ê¤ê¤Þ¤¹¡£


¡ã¥µ¥ó¥×¥ë¥³¡¼¥É­¢¡ä


¡¡¾åµ­¤Î¥µ¥ó¥×¥ë¥³¡¼¥É­¡¤ò¥³¥ë¡¼¥Á¥ó¥á¥½¥Ã¥É¤Ç¤Ï¤Ê¤¯¡¢
UniTask ¤È async / await ¤òÍøÍѤ·¤¿ÈóƱ´ü½èÍý¤ËÃÖ¤­´¹¤¨¤Æ¥ê¥Õ¥¡¥¯¥¿¥ê¥ó¥°¤·¤¿¤â¤Î¤Ç¤¹¡£


SilhouetteEffectController.cs
using Cysharp.Threading.Tasks;
using System.Threading;
using UnityEngine;

public class SilhouetteEffectController : MonoBehaviour
{
    [SerializeField]
    private SpriteMask spriteMask;

    [SerializeField]
    private SpriteRenderer spriteRenderer;

    [SerializeField]
    private KeyCode activationKey = KeyCode.Space;

    [SerializeField]
    private float blinkInterval = 0.2f;   // 1²ó¤¢¤¿¤ê¤ÎÅÀÌǤλþ´Ö

    [SerializeField]
    private int blinkCount = 2;   // ÅÀÌDzó¿ô

    private CancellationTokenSource cts;
    private bool isProcessing = false;¡¡// ÅÀÌÇÃ椫¤É¤¦¤«¤Î³Îǧ¥Õ¥é¥°¡£true ¤Ê¤éÅÀÌÇÃæ


    private void Start()
    {
        cts = CancellationTokenSource.CreateLinkedTokenSource(this.GetCancellationTokenOnDestroy());
    }

    private async void Update()
    {
        // ÅÀÌÇÃæ¤Ç¤Ê¤¤¾ì¹ç¤Ç¡¢¤«¤Ä»ØÄꤷ¤¿¥­¡¼¤¬²¡¤µ¤ì¤¿¤é
        if (!isProcessing && Input.GetKeyDown(activationKey))
        {
            // ¥·¥ë¥¨¥Ã¥È½èÍý¤ò³«»Ï
            await ActivateSilhouetteAsync();
        }
    }

    /// <summary>
    /// ¥·¥ë¥¨¥Ã¥È½èÍý
    /// </summary>
    /// <returns></returns>
    public async UniTask ActivateSilhouetteAsync()
    {
        // ÅÀÌÇÃæ¤Î¥Õ¥é¥°¤ò¤¿¤Æ¤ë
        isProcessing = true;

        // ¥·¥ë¥¨¥Ã¥ÈÍѤΥޥ¹¥¯¤òÍ­¸ú²½
        spriteMask.enabled = true;

        // ÅÀÌǽèÍý
        await BlinkEffectAsync();

        // ÅÀÌǽèÍý¤¬½ª¤ï¤Ã¤¿¤Î¤Ç¥·¥ë¥¨¥Ã¥ÈÍѤΥޥ¹¥¯¤ò̵¸ú²½
        spriteMask.enabled = false;

        // ÅÀÌǤ¬½ª¤ï¤Ã¤¿¤Î¤Ç¥Õ¥é¥°¤ò¤ª¤í¤¹
        isProcessing = false;
    }

    /// <summary>
    /// ÅÀÌǽèÍý
    /// </summary>
    /// <returns></returns>
    private async UniTask BlinkEffectAsync()
    {
        for (int i = 0; i < blinkCount; i++)
        {
            // ¸µ¤Î¿§¤«¤é¹õ¿§¤ËÊѹ¹
            spriteRenderer.color = Color.black;
            await UniTask.Delay((int)(blinkInterval * 1000), cts.Token);

            // ¹õ¿§¤«¤é¸µ¤Î¿§¤ËÊѹ¹
            spriteRenderer.color = Color.white;
            await UniTask.Delay((int)(blinkInterval * 1000), cts.Token);
        }
    }

    private void OnDestroy()
    {
        cts?.Cancel();
        cts?.Dispose();
    }
}

¡¡UniTask ¤òÍøÍѤ·¤¿ÈóƱ´ü½èÍý¤Ï³°Éô¥¯¥é¥¹¤«¤éľÀܼ¹Ԥ·¤Æ¤âÌäÂê¤Ê¤¤¤¿¤á¡¢¥é¥Ã¥×ÍѤΥ᥽¥Ã¥É¤¬ÉÔÍפˤʤäƤ¤¤Þ¤¹¡£
Âå¤ï¤ê¤Ë UniTask ¤Ë¤è¤ëÈóƱ´ü½èÍý¤Ï¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸Â¸´ü´Ö¤Èɳ¤Å¤«¤Ê¤¤¤¿¤á¡¢¥²¡¼¥à¥ª¥Ö¥¸¥§¥¯¥È¤¬ÇË´þ¤µ¤ì¤¿¥¿¥¤¥ß¥ó¥°¤Ç¤â½èÍý¤ÏÄä»ß¤·¤Þ¤»¤ó¡£

¡¡¤³¤Î¤è¤¦¤ÊÆÃÀ­¤Ë¤è¤ê¡¢¼êÆ°¤Ç¥­¥ã¥ó¥»¥ë½èÍý¤ËÂбþ¤¹¤ëɬÍפ¬¤¢¤ë¤¿¤á¡¢CancellationTokenSource ¤òÍøÍѤ·¤Æ¥­¥ã¥ó¥»¥ëÍѤΥȡ¼¥¯¥ó¤òºîÀ®¤·¡¢
OnDestroy ¥á¥½¥Ã¥É¤Ë¤ÆÈóƱ´ü½èÍý¤òÄä»ß¤·¤Æ¤¤¤Þ¤¹¡£


¡ã»²¹Í¥µ¥¤¥È¡ä


¥Æ¥é¥·¥å¡¼¥ë¥Ö¥í¥° ÍÍ
¡ÚUnity¡ÛSpriteMask¤ÇSprite¤Ë¥Þ¥¹¥¯¤ò³Ý¤±¤ë±é½Ð¤¬¿§¡¹¤ÈÌÌÇò¤¤
https://tsubakit1.hateblo.jp/entry/2017/07/21/0127...

¥³¥á¥ó¥È¤ò¤«¤¯


¡Öhttp://¡×¤ò´Þ¤àÅê¹Æ¤Ï¶Ø»ß¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

ÍøÍѵ¬Ìó¤ò¤´³Îǧ¤Î¤¦¤¨¤´µ­Æþ²¼¤µ¤¤

Menu



´ðÁÃ

µ»½Ñ/Ãμ±(¼ÂÁõÎã)

3D¥¢¥¯¥·¥ç¥ó¥²¡¼¥à

2D¤ª¤Ï¤¸¤­¥²¡¼¥à(ȯŸÊÔ)

2D¶¯À©²£¥¹¥¯¥í¡¼¥ë¥¢¥¯¥·¥ç¥ó(ȯŸÊÔ)

2D¥¿¥Ã¥×¥·¥å¡¼¥Æ¥£¥ó¥°(³ÈÄ¥ÊÔ)

¥ì¡¼¥¹¥²¡¼¥à(È´¿è)

2DÊüÃÖ¥²¡¼¥à(ȯŸÊÔ)

3D¥ì¡¼¥ë¥¬¥ó¥·¥å¡¼¥Æ¥£¥ó¥°(±þÍÑÊÔ)

3Dæ½Ð¥²¡¼¥à(È´¿è)

2D¥ê¥¢¥ë¥¿¥¤¥à¥¹¥È¥é¥Æ¥¸¡¼

3D¥¿¥Ã¥×¥¢¥¯¥·¥ç¥ó(NavMeshAgent »ÈÍÑ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥«¥¨¥ë¤Î°Ù¤Ë¡Á¡¢¥Ü¥³¥¹¥«¥¦¥©¡¼¥ºÉ÷)

VideoPlayer ¥¤¥Ù¥ó¥ÈϢư¤Î¼ÂÁõÎã

VideoPlayer ¥ê¥¹¥ÈÆ⤫¤é¥à¡¼¥Ó¡¼ºÆÀ¸¤Î¼ÂÁõÎã(ȯŸ)

AR ²èÁüÉÕ¤­¥ª¥Ö¥¸¥§¥¯¥ÈÀ¸À®¤Î¼ÂÁõÎã

AR ¥ê¥¹¥ÈÆ⤫¤éÀ¸À®¤Î¼ÂÁõÎã(ȯŸ)

2D¥È¥Ã¥×¥Ó¥å¡¼¥¢¥¯¥·¥ç¥ó(¥µ¥Ð¥¤¥Ð¡¼É÷)

private



¤³¤Î¥µ¥¤¥ÈÆâ¤ÎºîÉʤϥæ¥Ë¥Æ¥£¤Á¤ã¤ó¥é¥¤¥»¥ó¥¹¾ò¹à¤Î¸µ¤ËÄ󶡤µ¤ì¤Æ¤¤¤Þ¤¹¡£

´ÉÍý¿Í/Éû´ÉÍý¿Í¤Î¤ßÊÔ½¸¤Ç¤­¤Þ¤¹