Так что, если я правильно вас понимаю, ваш код в основном работает нормально, но вместо прямого воспроизведения соответствующего звука для распознанной цели вы хотите воспроизводить его только при нажатии кнопки, верно?
Вы можете просто добавить метод PlayCurrentSound
и ссылаться на него в onClick
:
// SET THIS NAME INSTEAD OF DIRECTLY PLAYING IT
private string currentSoundName;
// THIS IS THE METHOD CALLED BY THE BUTTON
public void PlayCurrentSound()
{
if(!string.IsNullOrWhiteSpace(currentSoundName)) playSound(currentSoundName);
}
и вместо этого в OnTrackableStateChanged
измените только значение currentSoundName
вместо прямого воспроизведения
public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
{
m_PreviousStatus = previousStatus;
m_NewStatus = newStatus;
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
// HERE BETTER USE A SWITCH INSTEAD
switch(mTrackableBehaviour.TrackableName)
{
case "1":
currentSoundName = "audio/1_eng";
break;
case "2":
currentSoundName = "audio/2_eng";
break;
case "3":
currentSoundName = "audio/3_eng";
break;
default:
currentSoundName = "";
break;
}
// OR ALTERNATIVELY IF YOU ANYWAY WANT TO
// SET THE NAME FOR ALL POSSIBLE NAMES YOU COULD EVEN GO
currentSoundName = string.Format("audio/{0}_eng", mTrackableBehaviour.TrackableName);
OnTrackingFound();
}
else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
newStatus == TrackableBehaviour.Status.NO_POSE)
{
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
StopAllAudio();
// RESET currentSoundName
currentSoundName = "";
OnTrackingLost();
}
else
{
// For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND
// Vuforia is starting, but tracking has not been lost or found yet
// Call OnTrackingLost() to hide the augmentations
OnTrackingLost();
// RESET currentSoundName
currentSoundName = "";
}
}
Однако есть и другие мелочи, которые я бы тоже изменил:
soundTarget.loop = false;
soundTarget.playOnAwake = false;
это уже может быть сделано при запуске игры, только один раз и не должно повторяться каждый раз. Так сделайте это в:
private void Awake()
{
soundTarget.loop = false;
soundTarget.playOnAwake = false;
}
чем
clipTarget = (AudioClip)Resources.Load(ss);
загружает (возможно) один и тот же звук снова и снова из ресурсов ... не очень эффективно. Возможно, вы захотите сохранить ссылку после загрузки, например
private Dictionary<string, AudioClip> clips = new Dictionary<string, AudioClip>();
void playSound(string ss)
{
if(clips.ContainsKey(ss) && clip[ss] != null)
{
clipTarget = clips[ss];
else
{
clip = (AudioClip)Resources.Load(ss);
if(clipTarget == null)
{
Debug.LogError("Couldn't get clip for " + ss, this);
return;
}
clips.Add(ss, clipTarget);
}
soundTarget.clip = clipTarget;
soundTarget.Play();
}
Вы также можете использовать soundTarget.PlayOneShot(clipTarget)
вместо этого. Разница в том, что PlayOneShot
воспроизводит весь звук и допускает одновременные звуки, в то время как Play
прерывает текущий звук и запускает новый (зависит от ваших потребностей).