I’ve figured out that PlayOneShot doesn’t work for collision sounds via OnCollisionEnter function if you have OTHER audioclips going through Update in a separate Audio function activated by user input via if statements. In this scenario, only input sounds will play.
Instead if I move the call to the Audio function away from update and into the input functions (which refer to Update anyway) it works… WHYYYY???
that makes no sense to me
using UnityEngine;
using UnityEngine.SceneManagement;
public class Rocket : MonoBehaviour
{
//Member variables
Rigidbody rigidBody;
[SerializeField] AudioClip Engine;
[SerializeField] AudioClip Rotate;
[SerializeField] AudioClip Die;
[SerializeField] AudioClip winLevel;
AudioSource audioSource;
[SerializeField] float rcsThrust = 220f;
[SerializeField] float mainThrust = 50f;
[SerializeField] float upThrust = 50f;
bool wonLevel = false;
bool died = false;
enum State {alive, dying, transcending};
State state = State.alive;
//[SerializeField] float rotateForce = 20f;
// Start is called before the first frame update
void Start()
{
rigidBody = GetComponent<Rigidbody>();
audioSource = GetComponent<AudioSource>();
}
// Update is called once per frame
void Update()
{ if (state == State.alive)
{
ThrustShip();
RotateShip();
}
//Audio(); //IF I CALL AUDIO FUNCTION FROM HERE,
// THE "DIE" AND "WINLEVEL" SOUNDS WON'T PLAY
}
private void ThrustShip()
{
if (Input.GetKey(KeyCode.Space) )
{
rigidBody.AddRelativeForce(Vector3.up * mainThrust);
rigidBody.AddForce(Vector3.up * upThrust);
Audio(); //INSTEAD IF I CALL AUDIO FROM HERE EVERYTHING WORKS
}
}
private void RotateShip()
{
rigidBody.freezeRotation = true;
float rotationThisFrame = rcsThrust * Time.deltaTime;
if (Input.GetKey(KeyCode.A))
{
transform.Rotate(Vector3.forward * rotationThisFrame);
}
else if (Input.GetKey(KeyCode.D))
{
transform.Rotate(-Vector3.forward * rotationThisFrame);
}
rigidBody.freezeRotation = false;
Audio(); //FROM HERE WORKS TOO
}
void OnCollisionEnter(Collision collision)
{
if (state != State.alive)
{
return;
}
switch (collision.gameObject.tag)
{
case "Friendly":
//do nothing
break;
case "Finish":
state = State.transcending;
audioSource.Stop();
audioSource.PlayOneShot(winLevel);
Invoke("LoadNextScene", 5f);
break;
case "Untagged":
state = State.dying;
print("playaudio");
audioSource.Stop();
audioSource.PlayOneShot(Die);
Invoke("LoadStartScene", 5f);
break;
}
}
private void LoadStartScene()
{
SceneManager.LoadScene(0);
}
private void LoadNextScene()
{
SceneManager.LoadScene(1);
}
void Audio()
{
if (Input.GetKey(KeyCode.Space) && state == State.alive && !audioSource.isPlaying)
{
audioSource.PlayOneShot(Engine);
}
if (Input.GetKeyUp(KeyCode.Space) || state == State.dying || state == State.transcending)
{
audioSource.Stop();
}
/* if (died == true && !audioSource.isPlaying )
{
print("dead");
audioSource.Stop();
audioSource.PlayOneShot(Die);
died = false;
}*/
if (Input.GetKeyDown(KeyCode.A) && state == State.alive)
{
audioSource.PlayOneShot(Rotate);
}
if (Input.GetKeyDown(KeyCode.D) && state == State.alive)
{
audioSource.PlayOneShot(Rotate);
}
/* if (wonLevel == true && !audioSource.isPlaying)
{
audioSource.PlayOneShot(winLevel);
wonLevel = false;
}*/
}
}