Melhorar script de som de impacto
2 participantes
Página 1 de 1
Melhorar script de som de impacto
Saudações.
Eu tenho um script de som de impacto, porém ele é muito básico, o script só calcula a colisão e reproduz o áudio, esse script não calcula o raspar de um objeto em uma superfície e também apenas reproduz o som ao colidir, vou explicar: se um objeto retangular bater no piso com uma de suas pontas, o som será executado, mas quando esse objeto tombar de lado e bater no piso o som não é executado.
Se alguém souber como melhorar esse script me digam aqui, por favor, obrigado pela atenção.
Eu tenho um script de som de impacto, porém ele é muito básico, o script só calcula a colisão e reproduz o áudio, esse script não calcula o raspar de um objeto em uma superfície e também apenas reproduz o som ao colidir, vou explicar: se um objeto retangular bater no piso com uma de suas pontas, o som será executado, mas quando esse objeto tombar de lado e bater no piso o som não é executado.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ImpactSound : MonoBehaviour {
public AudioSource impactSound;
void OnCollisionEnter(Collision collision)
{
if (collision.relativeVelocity.magnitude > 0.5f)
{
impactSound.Play();
}
}
}
Se alguém souber como melhorar esse script me digam aqui, por favor, obrigado pela atenção.
Re: Melhorar script de som de impacto
Vamos usar como um exemplo um carro de corrida batendo e raspando na mureta após fazer uma curva;
A primeira colisão é detectada no OnCollisionEnter() que você tá usando. Ela normalmente é mais forte, pra esse caso você pode usar um ou mais sons de colisão, só que antes de tocar, altere o volume e o pitch com um valor aleatório, pra que tenha alguma variação e não fique na cara que voê tá tocando os mesmo
Pra "raspar" na parede, você teria que usar o OnCollisionStay(), que continua sendo executada enquanto os dois colliders estiverem em contato, mais uma vez, pra deixar mais dinâmico, use uma valor aleatório no pitch, pro volume você pode escalar de acordo com a velocidade relativa.
Na OnCollisionStay você recebe o objeto que está raspando no seu carro pelo parâmetro "collision", pegue a velocidade dele caso tenha um rigidbody e subtraia isso da sua velocidade, essa diferença poderia ser dividida por um valor máximo e usada como volume.
caso não tenha um rigidbody no outro objeto, use a sua velocidade dividida pelo max;
vel1 = velocidadeCollision;
vel2 = velocidadeRigidbody;
volume =0.5 + clamp01(abs(vel1 - vel2)/maxvel) * 0.5
Com isso o volume do loop de "raspando" sempre teria o valor de 0.5f, e dependendo da velocidade iria aumentar até 1. Não seria perfeito, mas já ficaria bem mais dinâmico.
Sobre o seu exemplo do objeto tombar, creio que ou você teria que ter colisores extras em certas partes pra detectar essa colisão acontecendo na OnCollisionEnter, ou manteria um registro do Angular velocity do Rigidbody, se houvesse uma mudança brusca nesse valor, e algo estivesse sendo detectado na colisão, quer dizer que você tombou.
A primeira colisão é detectada no OnCollisionEnter() que você tá usando. Ela normalmente é mais forte, pra esse caso você pode usar um ou mais sons de colisão, só que antes de tocar, altere o volume e o pitch com um valor aleatório, pra que tenha alguma variação e não fique na cara que voê tá tocando os mesmo
Pra "raspar" na parede, você teria que usar o OnCollisionStay(), que continua sendo executada enquanto os dois colliders estiverem em contato, mais uma vez, pra deixar mais dinâmico, use uma valor aleatório no pitch, pro volume você pode escalar de acordo com a velocidade relativa.
Na OnCollisionStay você recebe o objeto que está raspando no seu carro pelo parâmetro "collision", pegue a velocidade dele caso tenha um rigidbody e subtraia isso da sua velocidade, essa diferença poderia ser dividida por um valor máximo e usada como volume.
caso não tenha um rigidbody no outro objeto, use a sua velocidade dividida pelo max;
vel1 = velocidadeCollision;
vel2 = velocidadeRigidbody;
volume =0.5 + clamp01(abs(vel1 - vel2)/maxvel) * 0.5
Com isso o volume do loop de "raspando" sempre teria o valor de 0.5f, e dependendo da velocidade iria aumentar até 1. Não seria perfeito, mas já ficaria bem mais dinâmico.
Sobre o seu exemplo do objeto tombar, creio que ou você teria que ter colisores extras em certas partes pra detectar essa colisão acontecendo na OnCollisionEnter, ou manteria um registro do Angular velocity do Rigidbody, se houvesse uma mudança brusca nesse valor, e algo estivesse sendo detectado na colisão, quer dizer que você tombou.
SteveRogers- Instrutor
- PONTOS : 2675
REPUTAÇÃO : 156
Respeito as regras :
Re: Melhorar script de som de impacto
Obrigado, eu vou tentar implementar as instruções que você forneceu.
Re: Melhorar script de som de impacto
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ImpactSound3 : MonoBehaviour
{
public AudioSource scrapeSound;
void Start()
{
scrapeSound = GetComponent<AudioSource>();
}
void OnCollisionStay(Collision collision)
{
if (collision.relativeVelocity.magnitude > 0.5f)
scrapeSound.volume = 1;
{
scrapeSound.Play();
}
if (collision.relativeVelocity.magnitude > 0)
{
scrapeSound.volume = 0;
}
}
}
Estou tentando fazer isso funcionar, mas não está dando certo. Alguém sabe como fazer o som ser reproduzido e depois parar de acordo com a velocidade?
Re: Melhorar script de som de impacto
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ImpactSound3 : MonoBehaviour
{
public AudioSource audioSource;
public GameObject Ativador;
void Start()
{
audioSource = GetComponent<AudioSource>();
}
void OnCollisionStay(Collision collision)
{
if (collision.relativeVelocity.magnitude > 1)
{
audioSource.mute = false;
Ativador.SetActive(false);
}
if (collision.relativeVelocity.magnitude > 0)
{
Ativador.SetActive(true);
}
}
}
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Desmutar : MonoBehaviour
{
public AudioSource audioSource;
void FixedUpdate()
{
audioSource.mute = true;
}
}
Com esses dois scripts eu cheguei a um resultado um pouco melhor, mas ainda há um problema, quando eu seguro o objeto colidindo e não o movo o som ainda é reproduzido. Eu preciso de uma maneira de evitar que isso ocorra. Sugestões?
Re: Melhorar script de som de impacto
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ImpactSound3 : MonoBehaviour
{
public AudioSource audioSource;
public GameObject Ativador;
public Rigidbody rigidbody;
void Start()
{
audioSource = GetComponent<AudioSource>();
}
void OnCollisionStay(Collision collision)
{
if (collision.relativeVelocity.magnitude > 1)
{
audioSource.mute = false;
Ativador.SetActive(false);
}
if (collision.relativeVelocity.magnitude > 0)
{
Ativador.SetActive(true);
}
if (rigidbody.velocity.magnitude > 0)
{
audioSource.mute = true;
}
if (rigidbody.velocity.magnitude > 1)
{
audioSource.mute = false;
}
}
}
Cheguei a um resultado satisfatório.
Tópicos semelhantes
» Prefabs de impacto no metal, madeira, agua, onde encontrar?
» Esse script precisa melhorar?
» Melhorar Graficos
» força de impacto em npc proximo a objeto que explode
» Calcular força do impacto recebido pelo objeto
» Esse script precisa melhorar?
» Melhorar Graficos
» força de impacto em npc proximo a objeto que explode
» Calcular força do impacto recebido pelo objeto
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos