public class CameraShaker : MonoBehaviour
{
private Quaternion _startRotation;
private Quaternion? _targetRotation;
private float _degVelocity;
private bool _isShaking;
private Coroutine _shakeCoroutine;
public void ShakeRotateCamera(Vector2 direction, float angleDeg, float degVelocity)
{
if (_isShaking)
{
return;
}
ShakeRotateCameraInternal(direction, angleDeg, degVelocity);
}
public void ShakeCamera(float duration, float maxAngle, float degVelocity)
{
if (_shakeCoroutine != null)
{
StopCoroutine(_shakeCoroutine);
}
_isShaking = false;
_shakeCoroutine = StartCoroutine(VibrateCameraCor(duration, maxAngle, degVelocity));
}
private void Start()
{
_startRotation = transform.localRotation;
}
private void Update()
{
Quaternion target = _targetRotation == null ? _startRotation : _targetRotation.Value;
if (target == transform.localRotation)
{
return;
}
float t = (Time.deltaTime * _degVelocity) / Quaternion.Angle(transform.localRotation, target);
transform.localRotation = Quaternion.Lerp(transform.localRotation, target, t);
if (transform.localRotation == _targetRotation)
{
_targetRotation = null;
}
}
private IEnumerator VibrateCameraCor(float duration, float maxAngle, float degVelocity)
{
_isShaking = true;
float elapsed = 0f;
float timePassed = Time.realtimeSinceStartup;
while (elapsed < duration)
{
float currentTime = Time.realtimeSinceStartup;
elapsed += currentTime - timePassed;
timePassed = currentTime;
ShakeRotateCameraInternal(Random.insideUnitCircle, Random.Range(0, maxAngle), degVelocity);
yield return new WaitForSeconds(0.05f);
}
_isShaking = false;
}
private void ShakeRotateCameraInternal(Vector2 direction, float angleDeg, float degVelocity)
{
direction *= -1;
_degVelocity = degVelocity;
direction = direction.normalized;
direction *= Mathf.Tan(angleDeg * Mathf.Deg2Rad);
Vector3 resDirection = ((Vector3)direction + transform.forward).normalized;
_targetRotation = Quaternion.FromToRotation(transform.forward, resDirection);
}
}
Мне вот интересно, кто вам "разаработчикам" сказал, что тряска камеры передает ощущение для игрока? Меня всегда бесила и будет бесить тряска камеры, так же как и размытие. Кроме как морального раздражения эти вещи не могут передать при игре.
Не пойму, к чему тут эти кавычки. А сказали мне об этом тенденции развития индустрии. Любой инструмент, если его использовать чересчур активно, будет раздражать. Я же не говорю о вибрации постоянной, либо с большим разбросом углов, что сделает картинку дёрганной. Как вы будете передавать игроку отдачу оружия или ощущение падения? В видео я привожу в пример геймплей CS 1.6, где данные механизмы используются в меру и к месту. Вы считаете игра была бы лучше без них?
Комментарий недоступен
Комментарий недоступен
Quaternion*Вьетнамские флешбеки
Хорошее видео про тряску камеры с GDC.
Какая причина может быть в вылетах игры? Только не подумай, что я прошу про какую-то конкретную игру. Я пишу рассказ ,в котором инди-разработчик "допиливает" свою игру, исправляя баги. Рассказ не о играх, не о разработке игр, так что мне не нужны подробности. Меня вполне удовлетворил бы ответ по типу: "Игра влетает потому что буфер обмена переполнен спрайтами взрыва". То есть максимально простой ответ в принципе о любой игре.
Если любишь конкретику, то по каким причинам вылетали на рабочий стол твои игры? Опиши простым языком?