Как правильно воспроизводить звук при выборе объекта в unity / c # - PullRequest
0 голосов
/ 28 апреля 2020

Я пытался создать сценарий, когда я нажимаю на объект на сцене, чтобы издавать звук. Итак, у меня есть аудио источник и мой скрипт, реализованный на объекте. Тем не менее, с моим сценарием ниже он развертывает только первый аудио, который у меня есть (чашка). Что я хочу изменить в своем коде или сделать его лучше, так это не позволить аудио запускаться, пока я не нажму на объект. и любой способ сделать, где я нажимаю на объект, аудио вызывает? пожалуйста, порекомендуйте. Спасибо за помощь.

Обновление: прямо сейчас, если я выбираю везде звук, который запускается, и всякий раз, когда я нажимаю на другой объект, он выдает один звук из всего моего объекта, это не то, что я хотел.

вот мой код:

    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;

            }


        }


    }

}

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Итак, осознав ваши проблемы, я изменил этот ответ.

Сначала к вашему коду должен быть прикреплен только один игровой объект, например, камера, например, like this

также я назвал свой сценарий StackOverflow, вы можете назвать его как угодно.

И BoxCollider должен быть прикреплен к вашей пластике c bottle или чашке, как это 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 голосов
/ 28 апреля 2020

Так что, похоже, вы неправильно понимаете использование 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
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...