当对象旋转特定角度时播放声音

时间:2019-09-16 01:13:22

标签: c# unity3d

我试图在物体旋转到某个点时播放声音。该代码工作正常,但随后突然停止了,我不知道该怎么办。

该对象是一扇门,根据Unity的变换信息,该对象沿Z轴从-180到-300旋转。我希望门transform.rotation.z小于-190时播放声音“ portaFechando”,但它不起作用。

我只能听到“ portaAbrindo”的声音。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class abrirPorta : MonoBehaviour
{
    Animator anim;
    bool portaFechada = true;
    public AudioSource audio;
    public AudioClip abrindo;
    public AudioClip fechando;




    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();


    }

    // Update is called once per frame
    void Update()
    {


        // checkando input para abrir a porta
        if (Input.GetKeyDown("space") && portaFechada == true)
        {
            anim.SetBool("portaFechada", false);
            anim.SetFloat("portaSpeed", 1);
            portaFechada = false;
            audio.clip = abrindo;
            audio.Play();

        }

        // checkando input para fechar porta
        else if (Input.GetKeyDown("space") && portaFechada == false)
        {
            anim.SetBool("portaFechada", true);
            anim.SetFloat("portaSpeed", -1);
            portaFechada = true;
         }

        // tocando som de fechando checkando rotação (bugou)
        if (portafechada == false && transform.rotation.z <= -190)
        {
            Debug.Log("Worked!");
            audio.clip = fechando;
            audio.Play();

        }



    }
}

1 个答案:

答案 0 :(得分:2)

当前,您正在访问四元数的z分量,该分量不能度量围绕z轴的角度。

相反,请参考transform.eulerAngles.z,它将是介于0到360之间的值。这里-190等于170,-300等于60,因此,您可以检查transform.eulerAngles.z是否为小于或等于170。

我还建议跟踪自按下门关闭按钮以来是否已经发出了关闭声音。另外,您不仅希望在portafechada为假时播放声音,还希望仅在为真时播放声音:

Animator anim;
bool portaFechada = true;
public AudioSource audio;
public AudioClip abrindo;
public AudioClip fechando;

private bool playedSoundAlready = true;

// Start is called before the first frame update
void Start()
{
    anim = GetComponent<Animator>();
}

// Update is called once per frame
void Update()
{
    // checkando input para abrir a porta
    if (Input.GetKeyDown("space") && portaFechada)
    {
        anim.SetBool("portaFechada", false);
        anim.SetFloat("portaSpeed", 1);
        portaFechada = false;
        audio.clip = abrindo;
        audio.Play();
    }

    // checkando input para fechar porta
    else if (Input.GetKeyDown("space") && !portaFechada)
    {
        anim.SetBool("portaFechada", true);
        anim.SetFloat("portaSpeed", -1);
        portaFechada = true;
        playedSoundAlready = false;
     }

    // tocando som de fechando checkando rotação (bugou)
    if (!playedSoundAlready && portaFechada && transform.eulerAngles.z <= 170)
    {
        playedSoundAlready = true;
        Debug.Log("Worked!");
        audio.clip = fechando;
        audio.Play();
    }
}