我试着做了一个脚本,当我点击场景中的对象时,就会发出声音。所以,我有音频源和我的脚本实现的对象。然而,我的脚本下面,它只部署的第一个音频,我有(杯)。我想改变我的代码,或者让它变得更好,就是在我点击对象之前不要让音频运行,以及有什么方法可以让我点击对象时触发音频? 请给我建议。
更新。现在,如果我选择任何地方的声音都会触发,而每当我点击其他对象时,它就会给出我所有对象的一个音频,这不是我想要的。
这是我的代码。
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;
}
}
}
}
所以,在意识到你的问题,我改变了这个答案。
首先,你的代码必须附加只有一个游戏对象,例如相机,像这样的。
我把我的脚本命名为StackOverflow,你可以把它命名为任何你想要的名字。
而BoxCollider必须连接到你的塑料瓶或杯子上,就像这样。你可以把它设置为触发或不触发(取决于你的需要),并设置它的大小以适应场景中对象的实际大小。
最后是这个脚本,我把它命名为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;
}
}
不清楚的地方请在评论里问我
所以你似乎误解了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
}
}
}