ºÇ½ª¹¹¿·¡§
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¡Û¥«¥á¥é¤ò¾ï¤ËÍɤ餷¤¿¤ê¡¢¤À¤ó¤À¤ó¤ÈÍɤì¤ò¶¯²½¤·¤¿¤ê¤¹¤ë±é½Ð
- ¥«¥Æ¥´¥ê¡§
- ¿Ê³Ø/¥¹¥¯¡¼¥ë
- ¥×¥í¥°¥é¥ß¥ó¥°







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