Como eu poderia fazer para criar um terremoto convincente para um simulador de desastres naturais? Eu estou trabalhando em um projeto, e a única coisa que eu preciso é que o personagem sobreviva a desastres variados, mas não faço ideia de como posso fazer um terremoto ou furacão. Se fosse um jogo 2d seria até mais fácil, mas já que é um projeto tridimensional, gostaria de saber do pessoal se vocês sabem o que fazer
Oi LucasPDA, acho que independente da plataforma, o básico para um terremoto, é tremer a camera e simultaneamente um som de terremoto.
se vc não estiver usando Cinemachine, este código na camera deve fazer essa simulação.
using System.Collections;
using UnityEngine;
public class CameraShake : MonoBehaviour
{
public float shakeDuration = 5f; // Duração do tremor em segundos
public float shakeMagnitude = 0.2f; // Intensidade do tremor
private Vector3 originalPosition;
public void StartShake()
{
originalPosition = transform.position;
StartCoroutine(ShakeCoroutine());
}
private IEnumerator ShakeCoroutine()
{
float elapsedTime = 0f;
while (elapsedTime < shakeDuration)
{
float offsetX = Random.Range(-shakeMagnitude, shakeMagnitude);
float offsetY = Random.Range(-shakeMagnitude, shakeMagnitude);
transform.position = originalPosition + new Vector3(offsetX, offsetY, 0f);
elapsedTime += Time.deltaTime;
yield return null;
}
transform.position = originalPosition; // Retorna à posição original
}
}
caso esteja usando cinemachine, esse funciona pq testei:
using System.Collections;
using UnityEngine;
using Unity.Cinemachine;
public class CinemachineShake : MonoBehaviour
{
public CinemachineVirtualCameraBase cinemachineCamera; // Atualizado para usar CinemachineVirtualCameraBase
public float shakeDuration = 5f;
public float shakeAmplitude = 2f; // Intensidade do tremor
public float shakeFrequency = 2f; // Frequência da oscilação
private CinemachineBasicMultiChannelPerlin noise;
private void Start()
{
if (cinemachineCamera != null)
{
// Corrigido: use GetComponent para obter o Perlin
noise = cinemachineCamera.GetComponent<CinemachineBasicMultiChannelPerlin>();
Terremoto(); // Inicia o terremoto ao iniciar o script
}
}
public void StartShake()
{
if (noise != null)
{
StartCoroutine(ShakeCoroutine());
}
}
private IEnumerator ShakeCoroutine()
{
noise.AmplitudeGain = shakeAmplitude;
noise.FrequencyGain = shakeFrequency;
yield return new WaitForSeconds(shakeDuration);
noise.AmplitudeGain = 0f; // Para o tremor
noise.FrequencyGain = 0f;
}
// Método para simular terremoto
public void Terremoto()
{
if (noise != null)
{
StartCoroutine(TerremotoCoroutine());
}
}
private IEnumerator TerremotoCoroutine()
{
float duracao = 5f;
float intensidade = 3f; // ajuste conforme necessário
float frequencia = 2.5f; // ajuste conforme necessário
noise.AmplitudeGain = intensidade;
noise.FrequencyGain = frequencia;
yield return new WaitForSeconds(duracao);
noise.AmplitudeGain = 0f;
noise.FrequencyGain = 0f;
}
}
Pode anexar este script ao objeto Cinemachine.
no editor, atribua o objeto cinemachine ao campo em aberto do script que ele vai obter o componente Cinemachine Camera do objeto.
No objeto cinemachine, adicione o componente “Cinemachine Basic Multi Channel” em Noise Profile, no simbolo de engrenagem, escolha o primeiro “Presets/6D Shake”, pronto. pode simular.
Obs: estou usando o Unity 6.1
Para dar mais realismo ao terremoto, aconselho usar umas animações de pedra rolando ou coisas caindo.