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

¡¡Cinemachine ¤ËÈ÷¤ï¤Ã¤Æ¤¤¤ë¥Ñ¡¼¥ê¥ó¥Î¥¤¥º¤Îµ¡Ç½¤òÍøÍѤ·¤Æ¡¢¥«¥á¥é¤Î¼ê¥Ö¥ì¤ä¿¶Æ°¤¹¤ë±é½Ð¤òºîÀ®¤Ç¤­¤Þ¤¹¡£

Unity ¸ø¼°¥É¥­¥å¥á¥ó¥È
Noise ¥×¥í¥Ñ¥Æ¥£¡¼
Unity ¸ø¼°¥É¥­¥å¥á¥ó¥È
Apply noise to simulate camera shake

Unity ¸ø¼°¥É¥­¥å¥á¥ó¥È
Noise Settings Asset



Cinemachine ¤ÎÀßÄê






¡¡¥Æ¥ó¥×¥ì¡¼¥È¤ÎÁªÂò








¥µ¥ó¥×¥ë¥³¡¼¥É


¡¡CinemachineBasicMultiChannelPerlin ¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢¥«¥á¥é¤Î¿¶Æ°¥Ñ¥é¥á¡¼¥¿¤ò´Êñ¤ËÀ©¸æ¤Ç¤­¤Þ¤¹¡£
¼þÇÈ¿ô (FrequencyGain) ¤òÊÌÅÓÀ©¸æ¤¹¤ë¤³¤È¤Ç¡¢¿¶Æ°¤Î®¤µ¤âÄ´À°²Äǽ¤Ç¤¹¡£

¡¡¤Þ¤¿¡¢¿¶Æ°»þ´Ö¤ÎÀ©¸æ¤Î¥Ñ¥¿¡¼¥ó¤ò£²¤ÄÍÑ°Õ¤·¤Þ¤·¤¿¡£

¡¡£±¤Ä¤Ï Update ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¿¶Æ°»þ´Ö¤ò·×¬¤·¤ÆÀ©¸æ¤¹¤ëÊýË¡¤Ç¤¹¡£
¤â¤¦£±¤Ä¤Ï UniTask ¤òÍøÍѤ·¤ÆÈóƱ´ü½èÍý¤Ë¤è¤Ã¤Æ¿¶Æ°»þ´Ö¤òÀ©¸æ¤¹¤ëÊýË¡¤Ç¤¹¡£



£±¡¥Update ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¿¶Æ°»þ´Ö¤ò·×¬¤·¤ÆÀ©¸æ¤¹¤ëÊýË¡


using UnityEngine;
using Cinemachine;

public class CameraShake : MonoBehaviour
{
    [SerializeField] private CinemachineVirtualCamera virtualCamera; // Cinemachine¥«¥á¥é»²¾È
    [SerializeField] private float defaultIntensity = 1.0f;          // ¥Ç¥Õ¥©¥ë¥È¶¯ÅÙ
    [SerializeField] private float defaultDuration = 0.5f;           // ¥Ç¥Õ¥©¥ë¥È»þ´Ö

    private CinemachineBasicMultiChannelPerlin noise;                // Noise¥×¥í¥Ñ¥Æ¥£¤Ø¤Î»²¾È
    private float shakeTimer;                                        // ¿¶Æ°¥¿¥¤¥Þ¡¼

    private void Awake()
    {
        // Virtual Camera¤ÎNoise¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¼èÆÀ
        if (virtualCamera != null)
        {
            noise = virtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
        }
    }

    private void Update()
    {
        if (shakeTimer > 0)
        {
            // ¥¿¥¤¥Þ¡¼¤ò¸º¾¯¤µ¤»¤ë
            shakeTimer -= Time.deltaTime;
            if (shakeTimer <= 0)
            {
                StopShake(); // ¿¶Æ°Ää»ß
            }
        }
    }

    /// <summary>
    /// ¥«¥á¥é¤ò¿¶Æ°¤µ¤»¤ë
    /// </summary>
    /// <param name="intensity">¿¶Æ°¤Î¶¯ÅÙ</param>
    /// <param name="duration">¿¶Æ°»þ´Ö</param>
    public void ShakeCamera(float intensity, float duration)
    {
        if (noise == null) return;

        // ¿¶Æ°¤Î¶¯ÅÙ¤òÀßÄê
        noise.m_AmplitudeGain = intensity;
        noise.m_FrequencyGain = 1.0f; // ¿¶Æ°Â®Å٤ϸÇÄê¡ÊɬÍפʤéÊѹ¹²Ä¡Ë

        // ¥¿¥¤¥Þ¡¼¤òÀßÄê
        shakeTimer = duration;
    }

    /// <summary>
    /// ¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ç¥«¥á¥é¤ò¿¶Æ°¤µ¤»¤ë
    /// </summary>
    public void ShakeCamera()
    {
        ShakeCamera(defaultIntensity, defaultDuration);
    }

    /// <summary>
    /// ¿¶Æ°¤òÄä»ß¤µ¤»¤ë
    /// </summary>
    public void StopShake()
    {
        if (noise == null) return;

        // ¿¶Æ°¤ò¥ê¥»¥Ã¥È
        noise.m_AmplitudeGain = 0f;
        noise.m_FrequencyGain = 0f;
    }
}

¡¡¥¹¥¯¥ê¥×¥È¤«¤é¼Â¹Ô¤¹¤ë¾ì¹ç¤Î¥µ¥ó¥×¥ë¤Ç¤¹¡£

// ¶¯ÅÙ2.0¡¢1Éôֿ¶Æ°
cameraShake.ShakeCamera(2.0f, 1.0f);

// ¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ç¿¶Æ°
cameraShake.ShakeCamera();

// ¿¶Æ°Ää»ß
cameraShake.StopShake();


£²¡¥UniTask ¤òÍøÍѤ·¤ÆÈóƱ´ü½èÍý¤Ë¤è¤Ã¤Æ¿¶Æ°»þ´Ö¤òÀ©¸æ¤¹¤ëÊýË¡


¡¡UniTask.Delay ¤Ï¥Õ¥ì¡¼¥à¤´¤È¤Î¥Á¥§¥Ã¥¯¤ò Unity ¤ÎÆâÉô¥¿¥¤¥Þ¡¼¤Ç¸úΨ¤è¤¯½èÍý¤¹¤ë¤¿¤á¡¢Update ¤è¤ê¤â¥·¥ó¥×¥ë¤Ç²ÄÆÉÀ­¤¬¹â¤¯¤Ê¤ê¤Þ¤¹¡£
¿¶Æ°Ãæ¤ËºÆÅÙ¿¶Æ°¤ò¸Æ¤Ó½Ð¤·¤¿¤¤¾ì¹ç¤Ï¡¢isShaking ¤Î´ÉÍý¤ò¼è¤ê½ü¤¯¤«¡¢Ê̤Υե饰´ÉÍý¤òÄɲ䷤Ƥ¯¤À¤µ¤¤¡£

using UnityEngine;
using Cinemachine;
using Cysharp.Threading.Tasks; // UniTask ÍÑ

public class CameraShake : MonoBehaviour
{
    [SerializeField] private CinemachineVirtualCamera virtualCamera; // Cinemachine¥«¥á¥é»²¾È
    [SerializeField] private float defaultIntensity = 1.0f;          // ¥Ç¥Õ¥©¥ë¥È¶¯ÅÙ
    [SerializeField] private float defaultDuration = 0.5f;           // ¥Ç¥Õ¥©¥ë¥È»þ´Ö

    private CinemachineBasicMultiChannelPerlin noise;                // Noise¥×¥í¥Ñ¥Æ¥£¤Ø¤Î»²¾È
    private bool isShaking = false;                                  // ¿¶Æ°¾õÂ֥ե饰


    private void Awake()
    {
        // Virtual Camera¤ÎNoise¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¼èÆÀ
        if (virtualCamera != null)
        {
            noise = virtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
        }
    }

    /// <summary>
    /// ¥«¥á¥é¤ò¿¶Æ°¤µ¤»¤ë
    /// </summary>
    /// <param name="intensity">¿¶Æ°¤Î¶¯ÅÙ</param>
    /// <param name="duration">¿¶Æ°»þ´Ö</param>
    public async UniTask ShakeCamera(float intensity, float duration)
    {
        if (noise == null || isShaking) return;

        // ¿¶Æ°³«»Ï
        isShaking = true;
        noise.m_AmplitudeGain = intensity;
        noise.m_FrequencyGain = 1.0f; // ¿¶Æ°Â®Å٤ϸÇÄê¡ÊɬÍפʤéÊѹ¹²Ä¡Ë

        // »ØÄê»þ´ÖÂÔµ¡
        await UniTask.Delay((int)(duration * 1000), cancellationToken: destroyCancellationToken);

        // ¿¶Æ°Ää»ß
        StopShake();
        isShaking = false;
    }

    /// <summary>
    /// ¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ç¥«¥á¥é¤ò¿¶Æ°¤µ¤»¤ë
    /// </summary>
    public void ShakeCamera()
    {
        ShakeCamera(defaultIntensity, defaultDuration).Forget(); // ÈóƱ´ü½èÍý¤ò¼Â¹Ô
    }

    /// <summary>
    /// ¿¶Æ°¤òÄä»ß¤µ¤»¤ë
    /// </summary>
    public void StopShake()
    {
        if (noise == null) return;

        // ¿¶Æ°¤ò¥ê¥»¥Ã¥È
        noise.m_AmplitudeGain = 0f;
        noise.m_FrequencyGain = 0f;
    }
}

¡¡¥¹¥¯¥ê¥×¥È¤«¤é¼Â¹Ô¤¹¤ë¾ì¹ç¤Î¥µ¥ó¥×¥ë¤Ç¤¹¡£

// ¶¯ÅÙ2.0¡¢1Éôֿ¶Æ°
await cameraShake.ShakeCamera(2.0f, 1.0f);

// ¥Ç¥Õ¥©¥ë¥ÈÀßÄê¤Ç¿¶Æ°¡ÊÈóƱ´ü¥¨¥é¡¼¤Ï̵»ë¡Ë
cameraShake.ShakeCamera();

// ¿¶Æ°Ää»ß
cameraShake.StopShake();


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


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

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

Menu


´ðÁÃ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

private



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

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