[RESOLVIDO] Trocar o áudio dependendo da tag do terreno
3 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Olá developers, tudo bem ?
Sou novo aqui no fórum e iniciante em desenvolvimento de jogos
Vim pedir ajuda a vocês veteranos pois estou com um problema com o áudio
É o seguinte, eu tenho um CharacterController e quero que ele detecte a superficie que o mesmo está sobre, pesquisei muito ao ponto de criar meu próprio script.
Ocorreu tudo certinho, saiu som ao apertar as teclas WASD e detectou qual terreno ele está sobre, porém ele não altera o som de imediato enquanto o Player está com o W pressionado (GetKeyDown),
Só executa se eu parar de apertar e apertar novamente a tecla, dai ele altera para o audioclip que está associado ao audiosource do Player
Estou utilizando o RayCast, ele detecta o terreno e associa ao AudioSource o clip dependendo do objeto tag que o Player está sobre
E quando ele passa para outro tipo de Objeto que o mesmo está em cima, ele para segundos depois e não executa mais nada, nem troca de áudio quando está em cima
Obrigado pela atenção modders e developers!
Sou novo aqui no fórum e iniciante em desenvolvimento de jogos
Vim pedir ajuda a vocês veteranos pois estou com um problema com o áudio
É o seguinte, eu tenho um CharacterController e quero que ele detecte a superficie que o mesmo está sobre, pesquisei muito ao ponto de criar meu próprio script.
Ocorreu tudo certinho, saiu som ao apertar as teclas WASD e detectou qual terreno ele está sobre, porém ele não altera o som de imediato enquanto o Player está com o W pressionado (GetKeyDown),
Só executa se eu parar de apertar e apertar novamente a tecla, dai ele altera para o audioclip que está associado ao audiosource do Player
Estou utilizando o RayCast, ele detecta o terreno e associa ao AudioSource o clip dependendo do objeto tag que o Player está sobre
E quando ele passa para outro tipo de Objeto que o mesmo está em cima, ele para segundos depois e não executa mais nada, nem troca de áudio quando está em cima
Obrigado pela atenção modders e developers!
- Código:
// Vitin Ruas
// 29-07-2021
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAudio : MonoBehaviour
{
[System.Serializable]
#region AUDIO
public struct AUDIO {
// Clips
[Header("Audio Clips")]
[Tooltip("Clips to be Played")]
public AudioClip grassClip;
public AudioClip sandClip, woodClip;
[Header("Audio Source")]
// Controladores
[Tooltip("Audio Controller")]
public AudioSource _audioSourcePlayer;
[Header("Character Controller and Tags")]
public CharacterController _controller;
public string floorTag;
}
#endregion
public AUDIO audioWalking;
private void Awake() {
audioWalking._controller = GetComponent<CharacterController>();
audioWalking._audioSourcePlayer = GetComponent<AudioSource>();
}
private void Update() {
// Se o player estiver no chão
RaycastHit hit;
if (audioWalking._controller.isGrounded == true)
{
// Se o raio retornar true ou false de um determinado ponto que o mesmo colidiu
if (Physics.Raycast(transform.position, Vector3.down, out hit))
{
// Atribuindo tag de um objeto que o raio colidiu
audioWalking.floorTag = hit.collider.gameObject.tag;
// Se colidir com a grama ou com a madeira, faça a troca de clips
if (audioWalking.floorTag == "Grass")
{
audioWalking._audioSourcePlayer.clip = audioWalking.grassClip;
} else if (audioWalking.floorTag == "Wood") {
audioWalking._audioSourcePlayer.clip = audioWalking.woodClip;
}
}
// Se o player interagir com as entradas, execute o audio
if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D))
{
audioWalking._audioSourcePlayer.Play(); // irá reproduzir o atual clip detectado e associado pelo raycast
} else if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D)) {
// Se não, pare o audio
audioWalking._audioSourcePlayer.Stop();
}
}
}
}
VitinRuas- Iniciante
- PONTOS : 1231
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
tenta ativar o loop ao pressionar as teclas e desativar quando soltar.
- Código:
if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D))
{
audioWalking._audioSourcePlayer.loop = true;
audioWalking._audioSourcePlayer.Play(); // irá reproduzir o atual clip detectado e associado pelo raycast
}
else if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D))
{
// Se não, pare o audio
audioWalking._audioSourcePlayer.loop = false;
audioWalking._audioSourcePlayer.Stop();
}
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Pokedlg escreveu:tenta ativar o loop ao pressionar as teclas e desativar quando soltar.
- Código:
if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D))
{
audioWalking._audioSourcePlayer.loop = true;
audioWalking._audioSourcePlayer.Play(); // irá reproduzir o atual clip detectado e associado pelo raycast
}
else if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D))
{
// Se não, pare o audio
audioWalking._audioSourcePlayer.loop = false;
audioWalking._audioSourcePlayer.Stop();
}
Eu fiz a tentativa e não resultou em nada ;-;
- Começa o jogo no terreno e aperto alguma das teclas, WASD
- O som ocorre normalmente, clip de terreno
- Eu piso em cima de um objeto, que no caso é o chão de uma casa
- Aparece no AudioSource do Inspector que o clip foi alterado e agora é o clip do chão da casa
- O som para e não sai mais nada mesmo se eu voltar para o terreno
- Ao menos que eu pare de apertar na tecla e pressiono novamente, dai começa o som do clip que foi atribuido ao AudioSource
A dias que estou tentando resolver isso kkk é muito complicado, desculpe se eu estiver ocupando muito tempo
O código alterado:
- Código:
[size=16][i]// Vitin Ruas[/i]
[i]// 29-07-2021[/i]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAudio : MonoBehaviour
{
[System.Serializable]
#region AUDIO
public struct AUDIO {
[i]// Clips[/i]
[Header("Audio Clips")]
[Tooltip("Clips to be Played")]
public AudioClip grassClip;
public AudioClip sandClip, woodClip;
[Header("Audio Source")]
[i]// Controladores[/i]
[Tooltip("Audio Controller")]
public AudioSource _audioSourcePlayer;
[Header("Character Controller and Tags")]
public CharacterController _controller;
public string floorTag;
}
#endregion
public AUDIO audioWalking;
private void Awake() {
audioWalking._controller = GetComponent<CharacterController>();
audioWalking._audioSourcePlayer = GetComponent<AudioSource>();
}
private void Update() {
[i]// Se o player estiver no chão[/i]
RaycastHit hit;
if (audioWalking._controller.isGrounded == true)
{
[i]// Se o raio retornar true ou false de um determinado ponto que o mesmo colidiu[/i]
if (Physics.Raycast(transform.position, Vector3.down, out hit))
{
[i]// Atribuindo tag de um objeto que o raio colidiu[/i]
audioWalking.floorTag = hit.collider.gameObject.tag;
[i]// Se colidir com a grama ou com a madeira, faça a troca de clips[/i]
if (audioWalking.floorTag == "Grass")
{
audioWalking._audioSourcePlayer.clip = audioWalking.grassClip;
} else if (audioWalking.floorTag == "Wood") {
audioWalking._audioSourcePlayer.clip = audioWalking.woodClip;
}
}
[i]// Se o player interagir com as entradas, execute o audio[/i]
if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D))
{
audioWalking._audioSourcePlayer.loop = true;
audioWalking._audioSourcePlayer.Play(); [i]// irá reproduzir o atual clip detectado e associado pelo raycast[/i]
} else if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D)) {
[i]// Se não, pare o audio[/i]
audioWalking._audioSourcePlayer.loop = false;
audioWalking._audioSourcePlayer.Stop();
}
}
}
}[/size]
VitinRuas- Iniciante
- PONTOS : 1231
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Não tenho certeza, mas acredito que isso aconteça devido a alteração de audioclips repentina entre os terrenos, não sei se é a melhor opção mas tente fazer um delay de atualização quando ocorrer as mudanças entre terrenos, tipo uma verificação com uma co-rotina.
Pokedlg- ProgramadorMaster
- PONTOS : 2337
REPUTAÇÃO : 198
Áreas de atuação : Iniciante: ShaderLab, Blender, Java, C++, ASP.NET.
Intermediário: C#.NET, Unity, Shader Graph.
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Entendo, então seria bom eu definir um coroutine ou um Time.deltaTime, aqui ? onde verifica e atribui os clipsPokedlg escreveu:Não tenho certeza, mas acredito que isso aconteça devido a alteração de audioclips repentina entre os terrenos, não sei se é a melhor opção mas tente fazer um delay de atualização quando ocorrer as mudanças entre terrenos, tipo uma verificação com uma co-rotina.
- Código:
[size=20]if (audioWalking.floorTag == "Grass")
{
audioWalking._audioSourcePlayer.clip = audioWalking.grassClip;
} else if (audioWalking.floorTag == "Wood")
{
audioWalking._audioSourcePlayer.clip = audioWalking.woodClip;
}[/size]
?
VitinRuas- Iniciante
- PONTOS : 1231
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Na minha opinião, o problema é que o Play() só é chamado ao apertar ou soltar a tecla.
na imensa maioria do tempo, você vai estar segurando a tecla, logo, alterar o clip não vai fazer ele tocar de imediato.
Eu reestruturaria o código assim:
armazenaria a tag_atual do terreno, e onde você faz o raycast eu checaria se a tag do raycast é igual a tag_atual, se for diferente, eu altero o clip, dou Play() no audioSource e faço tag_atual receber a nova tag.
O GetKeyDown e o GetKeyUp só controlaria o volume, up = 0, down = 1 ou até mesmo desabilitaria e habilitaria o componente AudioSource;
na imensa maioria do tempo, você vai estar segurando a tecla, logo, alterar o clip não vai fazer ele tocar de imediato.
Eu reestruturaria o código assim:
armazenaria a tag_atual do terreno, e onde você faz o raycast eu checaria se a tag do raycast é igual a tag_atual, se for diferente, eu altero o clip, dou Play() no audioSource e faço tag_atual receber a nova tag.
O GetKeyDown e o GetKeyUp só controlaria o volume, up = 0, down = 1 ou até mesmo desabilitaria e habilitaria o componente AudioSource;
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Eu não sei se a lógica seria essa, só que agora não sai som, só sai se eu não estiver detectando o terrenoFagner escreveu:Na minha opinião, o problema é que o Play() só é chamado ao apertar ou soltar a tecla.
na imensa maioria do tempo, você vai estar segurando a tecla, logo, alterar o clip não vai fazer ele tocar de imediato.
Eu reestruturaria o código assim:
armazenaria a tag_atual do terreno, e onde você faz o raycast eu checaria se a tag do raycast é igual a tag_atual, se for diferente, eu altero o clip, dou Play() no audioSource e faço tag_atual receber a nova tag.
O GetKeyDown e o GetKeyUp só controlaria o volume, up = 0, down = 1 ou até mesmo desabilitaria e habilitaria o componente AudioSource;
Por exemplo: quando eu pulo sai o som trocado, mas quando eu estou no chão não sai o som
- Código:
[size=20][i]// Vitin Ruas[/i]
[i]// 29-07-2021[/i]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAudio : MonoBehaviour
{
[System.Serializable]
#region AUDIO
public struct AUDIO {
[i]// Clips[/i]
[Header("Audio Clips")]
[Tooltip("Clips to be Played")]
public AudioClip grassClip;
public AudioClip sandClip, woodClip;
[Header("Audio Source")]
[i]// Controladores[/i]
[Tooltip("Audio Controller")]
public AudioSource _audioSourcePlayer;
[Header("Character Controller and Tags")]
public CharacterController _controller;
public string atualTag, saveTag;
}
#endregion
public AUDIO audioWalking;
private void Awake() {
audioWalking.saveTag = "Grass";
audioWalking._controller = GetComponent<CharacterController>();
audioWalking._audioSourcePlayer = GetComponent<AudioSource>();
audioWalking._audioSourcePlayer.clip = audioWalking.grassClip;
}
private void Update() {
[i]// Se o player estiver no chão[/i]
RaycastHit hit;
if (audioWalking._controller.isGrounded == true)
{
[i]// Se o raio retornar true ou false de um determinado ponto que o mesmo colidiu[/i]
if (Physics.Raycast(transform.position, Vector3.down, out hit))
{
audioWalking.atualTag = hit.collider.gameObject.tag;
[i]// Se a tag atual for igual a tag salva, então dê Play[/i]
if (audioWalking.atualTag == audioWalking.saveTag)
{
audioWalking._audioSourcePlayer.Play();
} else
{
[i]// Se o audio clip atual for da madeira, então troque para a grama[/i]
if (audioWalking._audioSourcePlayer.clip == audioWalking.woodClip)
{
audioWalking._audioSourcePlayer.clip = audioWalking.grassClip;
} else { [i]// se não, se cause for da grama, então troque para a madeira[/i]
audioWalking._audioSourcePlayer.clip = audioWalking.woodClip;
}
[i]// a tag salva receberá a tag atual detectada pelo RayCast[/i]
audioWalking.saveTag = audioWalking.atualTag;
}
}
[i]// Se o player interagir com as entradas, desative ou não o componente AudioSource[/i]
if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D))
{
audioWalking._audioSourcePlayer.enabled = true;
} else if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D)) {
[i]// Se não, pare o audio[/i]
audioWalking._audioSourcePlayer.enabled = false;
}
}
}
}[/size]
VitinRuas- Iniciante
- PONTOS : 1231
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Eu refiz com algumas mudanças:
Volume só aumenta se a velocidade do jogador for maior que x, dessa forma se você soltar o W mas não parar imediatamente, ainda toca o som.
Usei um dicionário pros áudios, passando a Tag como chave, dessa forma, troco o áudio sem precisar de vários IFs pra cada Tag.
Ao invés de checar se a tag é igual, eu comparo a referência do audioClip, poupa uma comparação de string.
Se a tag for diferente, mudo pro áudio correto e dou play().
Se áudio for igual ao que já estou tocando, não faço nada, mas caso não esteja tocando, chamo Play(). Isso é útil caso você passe numa zona sem tag e volte pra ultima zona que passou.
Se a zona não tiver tag, paro o áudio.
Obs: Já deixei o AudioSource com o Loop e PlayOnAwake marcado no inspector, pois não tem necessidade de alterar via código, nesse caso.
Volume só aumenta se a velocidade do jogador for maior que x, dessa forma se você soltar o W mas não parar imediatamente, ainda toca o som.
Usei um dicionário pros áudios, passando a Tag como chave, dessa forma, troco o áudio sem precisar de vários IFs pra cada Tag.
Ao invés de checar se a tag é igual, eu comparo a referência do audioClip, poupa uma comparação de string.
Se a tag for diferente, mudo pro áudio correto e dou play().
Se áudio for igual ao que já estou tocando, não faço nada, mas caso não esteja tocando, chamo Play(). Isso é útil caso você passe numa zona sem tag e volte pra ultima zona que passou.
Se a zona não tiver tag, paro o áudio.
Obs: Já deixei o AudioSource com o Loop e PlayOnAwake marcado no inspector, pois não tem necessidade de alterar via código, nesse caso.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAudio : MonoBehaviour
{
public AudioSource playerAS;
public CharacterController playerControle;
public Zonas[] zonas;
private Dictionary<string, AudioClip> audioZonas;
private void Start()
{
audioZonas = new Dictionary<string, AudioClip>(zonas.Length);
for (int i = 0; i < zonas.Length; i++)
{
audioZonas.Add(zonas[i].Tag, zonas[i].audio);
}
}
private void Update()
{
playerAS.volume = playerControle.velocity.magnitude > 0.1f ? 1 : 0; //Se o player estiver se movendo, toco o som.
RaycastHit hit;
if (playerControle.isGrounded && Physics.Raycast(transform.position, -Vector3.up, out hit))
{
if (audioZonas.ContainsKey(hit.transform.tag))
{
if(playerAS.clip != audioZonas[hit.transform.tag])
{
playerAS.clip = audioZonas[hit.transform.tag]; //usa a tag como chave do dicionário
playerAS.Play();
}
else if(!playerAS.isPlaying)
{
playerAS.Play();
}
}
else
{
playerAS.Stop();
}
}
}
//Só pra ficar organizado no Inspector
private void OnValidate()
{
if (zonas != null)
{
for (int i = 0; i < zonas.Length; i++)
{
zonas[i].name = zonas[i].Tag;
}
}
}
[System.Serializable]
public struct Zonas
{
public AudioClip audio;
public string Tag;
[HideInInspector]
public string name;
}
}
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
Caramba kkk parece até mágica!!! estava sofrendo a dias pra resolver isso, e agora funcionou, vou até estudar seu código pra dá próxima vez eu saber construir igualFagner escreveu:Eu refiz com algumas mudanças:
Volume só aumenta se a velocidade do jogador for maior que x, dessa forma se você soltar o W mas não parar imediatamente, ainda toca o som.
Usei um dicionário pros áudios, passando a Tag como chave, dessa forma, troco o áudio sem precisar de vários IFs pra cada Tag.
Ao invés de checar se a tag é igual, eu comparo a referência do audioClip, poupa uma comparação de string.
Se a tag for diferente, mudo pro áudio correto e dou play().
Se áudio for igual ao que já estou tocando, não faço nada, mas caso não esteja tocando, chamo Play(). Isso é útil caso você passe numa zona sem tag e volte pra ultima zona que passou.
Se a zona não tiver tag, paro o áudio.
Obs: Já deixei o AudioSource com o Loop e PlayOnAwake marcado no inspector, pois não tem necessidade de alterar via código, nesse caso.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerAudio : MonoBehaviour
{
public AudioSource playerAS;
public CharacterController playerControle;
public Zonas[] zonas;
private Dictionary<string, AudioClip> audioZonas;
private void Start()
{
audioZonas = new Dictionary<string, AudioClip>(zonas.Length);
for (int i = 0; i < zonas.Length; i++)
{
audioZonas.Add(zonas[i].Tag, zonas[i].audio);
}
}
private void Update()
{
playerAS.volume = playerControle.velocity.magnitude > 0.1f ? 1 : 0; //Se o player estiver se movendo, toco o som.
RaycastHit hit;
if (playerControle.isGrounded && Physics.Raycast(transform.position, -Vector3.up, out hit))
{
if (audioZonas.ContainsKey(hit.transform.tag))
{
if(playerAS.clip != audioZonas[hit.transform.tag])
{
playerAS.clip = audioZonas[hit.transform.tag]; //usa a tag como chave do dicionário
playerAS.Play();
}
else if(!playerAS.isPlaying)
{
playerAS.Play();
}
}
else
{
playerAS.Stop();
}
}
}
//Só pra ficar organizado no Inspector
private void OnValidate()
{
if (zonas != null)
{
for (int i = 0; i < zonas.Length; i++)
{
zonas[i].name = zonas[i].Tag;
}
}
}
[System.Serializable]
public struct Zonas
{
public AudioClip audio;
public string Tag;
[HideInInspector]
public string name;
}
}
Obrigado Fagner, deu certinho!
VitinRuas- Iniciante
- PONTOS : 1231
REPUTAÇÃO : 3
Respeito as regras :
Re: [RESOLVIDO] Trocar o áudio dependendo da tag do terreno
por nada jovem, boa sorte com o jogo!
Fagner- Moderador
- PONTOS : 4443
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Reproduzir audio e com a mesma tecla um audio diferente
» [RESOLVIDO] Dúvida com audio.stop e audio.play
» [RESOLVIDO]Colocar dois fundos diferentes em um mesmo canvas dependendo do menu carregado.
» [RESOLVIDO] trocar espaço em string por "_"
» [RESOLVIDO] Trocar cor de um objeto ao apertar uma tecla
» [RESOLVIDO] Dúvida com audio.stop e audio.play
» [RESOLVIDO]Colocar dois fundos diferentes em um mesmo canvas dependendo do menu carregado.
» [RESOLVIDO] trocar espaço em string por "_"
» [RESOLVIDO] Trocar cor de um objeto ao apertar uma tecla
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos