ºÇ½ª¹¹¿·¡§
orika_ex_miyako 2024ǯ12·î27Æü(¶â) 15:31:06ÍúÎò
Unity ¸ø¼°¥É¥¥å¥á¥ó¥È
Noise ¥×¥í¥Ñ¥Æ¥£¡¼
Unity ¸ø¼°¥É¥¥å¥á¥ó¥È
Apply noise to simulate camera shake
Unity ¸ø¼°¥É¥¥å¥á¥ó¥È
Noise Settings Asset
¡¡CinemachineBasicMultiChannelPerlin ¤ò»ÈÍѤ¹¤ë¤³¤È¤Ç¡¢¥«¥á¥é¤Î¿¶Æ°¥Ñ¥é¥á¡¼¥¿¤ò´Êñ¤ËÀ©¸æ¤Ç¤¤Þ¤¹¡£
¼þÇÈ¿ô (FrequencyGain) ¤òÊÌÅÓÀ©¸æ¤¹¤ë¤³¤È¤Ç¡¢¿¶Æ°¤Î®¤µ¤âÄ´À°²Äǽ¤Ç¤¹¡£
¡¡¤Þ¤¿¡¢¿¶Æ°»þ´Ö¤ÎÀ©¸æ¤Î¥Ñ¥¿¡¼¥ó¤ò£²¤ÄÍÑ°Õ¤·¤Þ¤·¤¿¡£
¡¡£±¤Ä¤Ï Update ¥á¥½¥Ã¥É¤òÍøÍѤ·¤Æ¿¶Æ°»þ´Ö¤ò·×¬¤·¤ÆÀ©¸æ¤¹¤ëÊýË¡¤Ç¤¹¡£
¤â¤¦£±¤Ä¤Ï UniTask ¤òÍøÍѤ·¤ÆÈóƱ´ü½èÍý¤Ë¤è¤Ã¤Æ¿¶Æ°»þ´Ö¤òÀ©¸æ¤¹¤ëÊýË¡¤Ç¤¹¡£
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.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();
¡¡»²¹Í¤Ë¤µ¤»¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡£¤¢¤ê¤¬¤È¤¦¤´¤¶¤¤¤Þ¤¹¡£
LIGHT11 ÍÍ
¡ÚUnity¡Û¡ÚCinemachine¡ÛVirtual Camera¤ÎNoise¤Ç¡Ö¼ê¥Ö¥ì¡×¤òɽ¸½¤¹¤ë
¥Æ¥é¥·¥å¡¼¥ë¥Ö¥í¥° ÍÍ
¡ÚUnity¡Û¥«¥á¥é¤ò¾ï¤ËÍɤ餷¤¿¤ê¡¢¤À¤ó¤À¤ó¤ÈÍɤì¤ò¶¯²½¤·¤¿¤ê¤¹¤ë±é½Ð
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°
¥³¥á¥ó¥È¤ò¤«¤¯