[EXP] Simple Camera Shaker. Эффект тряски камеры в Unity 3d

Механика

Реализация тряски камеры через корутину

В проекте Emerald Rush, над которым я сейчас работаю возникла задача сделать стрельбу эффектнее, а ощущения более яркими и глубокими. Далеко в лес ходить не стал и остановился на классической/проверенной тряске камеры (разной интенсивности в зависимости от типа оружия).

Реализовал данную механику через корутину с параметрами (продолжительность и интенсивность):

public class SimpleCameraShaker : MonoBehaviour, ISimpleCameraShaker { public float _shakeRange = 0.5f; //change range value to configure amplitude public float _forceMultiplier = 10f; //change force value to configure force multipliering Coroutine _shakeCoroutine; Vector3 _originalPosition; private bool _camIsShaking = false; public bool _includeX = true; public bool _includeY = true; public bool _includeZ = true; //Test variables public float _duration = 1f; public float _force = 1f; private void Start() => _originalPosition = transform.position; public void InvokeCameraShaking(float duration, float force) => _shakeCoroutine = StartCoroutine(ShakeDatScreen(duration, force)); public void StopCameraShaking() { if (_camIsShaking) StopShaking(); } private IEnumerator ShakeDatScreen(float duration, float force) { _camIsShaking = true; float _timer = duration; float _xPos = _originalPosition.x; float _yPos = _originalPosition.y; float _zPos = _originalPosition.z; while(_timer > 0) { if (_includeX) _xPos = Random.Range(-_shakeRange, _shakeRange) * force; if (_includeY) _yPos = Random.Range(-_shakeRange, _shakeRange) * force; if (_includeZ) _zPos = Random.Range(-_shakeRange, _shakeRange) * force; transform.position = Vector3.Lerp(transform.position, new Vector3(_xPos, _yPos, _zPos), force * _forceMultiplier * Time.deltaTime); _timer -= Time.deltaTime; yield return null; } transform.position = _originalPosition; _camIsShaking = false; } private void StopShaking() { StopCoroutine(_shakeCoroutine); transform.position = _originalPosition; _camIsShaking = false; } }

И интерфейс:

public interface ISimpleCameraShaker { public void InvokeCameraShaking(float duration, float force); public void StopCameraShaking(); }

Заключение

Вот такой простой скрипт для тряски камеры.

Рад, если кому-то окажется полезно. Исходники есть в тг группе рюкзачок разработчика. Счастливо!

55
7 комментариев

Наконец-то стала ясна причина тряски.

2
Ответить

Не туда, тебе в раздел инди.

Ответить

Почему в инди? Он не говорит о своей игре почти ничего, но описывает механику. Качество этой механики мы опустим, но этому как раз место в геймдеве

1
Ответить

Комментарий недоступен

Ответить