如何在unityc#中选择对象时播放正确的声音。

问题描述 投票:0回答:2

我试着做了一个脚本,当我点击场景中的对象时,就会发出声音。所以,我有音频源和我的脚本实现的对象。然而,我的脚本下面,它只部署的第一个音频,我有(杯)。我想改变我的代码,或者让它变得更好,就是在我点击对象之前不要让音频运行,以及有什么方法可以让我点击对象时触发音频? 请给我建议。

更新。现在,如果我选择任何地方的声音都会触发,而每当我点击其他对象时,它就会给出我所有对象的一个音频,这不是我想要的。

这是我的代码。

    public class TextToSpeech : MonoBehaviour
{

    [SerializeField] AudioClip _audioClip;
    [SerializeField] [Range(0.0f, 1.0f)] float _volume = 1;
    AudioSource _audioSource;


    public AudioClip SoundToPlay;
    public float Volume;
    public bool alreadyPlayed = false;
    public bool playOnAwake = false;


    private Touch touch;
    private Vector2 beginTouchPosition, endTouchPosition;




    private bool isPlaying;


    void Start()
    {
        _audioSource = GetComponent<AudioSource>();
        _audioSource.clip = _audioClip;
        _audioSource.volume = _volume;


    }


    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            _audioSource.enabled = true;
            if (!_audioSource.isPlaying) {
                _audioSource.clip = SoundToPlay;
                _audioSource.Play ();
            }
            else
            {
                _audioSource.enabled = false;

            }


        }


    }

}
c# unity3d
2个回答
1
投票

所以,在意识到你的问题,我改变了这个答案。

首先,你的代码必须附加只有一个游戏对象,例如相机,像这样的。like this

我把我的脚本命名为StackOverflow,你可以把它命名为任何你想要的名字。

而BoxCollider必须连接到你的塑料瓶或杯子上,就像这样。enter image description here你可以把它设置为触发或不触发(取决于你的需要),并设置它的大小以适应场景中对象的实际大小。

最后是这个脚本,我把它命名为StackOverFlow,在你的情况下命名为SpeechToText。

public class StackOverFlow : MonoBehaviour {

[SerializeField] AudioClip _audioClip;
[SerializeField] [Range(0.0f, 1.0f)] float _volume = 1;
AudioSource _audioSource;
bool isPlaying;

void Start() {
    _audioSource = GetComponent<AudioSource>();
    _audioSource.clip = _audioClip;
    _audioSource.volume = _volume;
}

void Update() {

    if (Input.touchCount > 0) {

        Touch touch = Input.touches[0];
        if (touch.phase == TouchPhase.Began) {

            Ray touchRay = Camera.main.ScreenPointToRay(touch.position);
            Physics.Raycast(touchRay, out RaycastHit hit, Mathf.Infinity);

            if (hit.collider != null) {
                if (hit.collider.name.Contains("Cup") || hit.collider.name.Contains("Bottle")) {
                    PlaySound();
                }
                else {
                    Debug.Log($"otherobject {hit.collider.name}");
                }
            }

        }
    }
}

private void PlaySound() {
    if (!isPlaying) {
        _audioSource.Play();
        isPlaying = true;
        StartCoroutine(CheckIfPlaying());
    }
}

private IEnumerator CheckIfPlaying() {
    yield return new WaitForSeconds(_audioClip.length);
    isPlaying = false;
}

}

不清楚的地方请在评论里问我


0
投票

所以你似乎误解了OnTriggerEnter的用途,你最好从触球位置进行射线播报,并在此基础上进行比赛。

void Update()
{
    Camera mainCam = Camera.main;  
    for (int i = 0; i < Input.touchCount; ++i)
    {
        Vector3 touchPos = mainCam.ScreenToWorldPoint(Input.GetTouch(i).position);
        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.forward);
        if(hit.gameObject == this.gameObject){
            // play sound
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.