亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

不同的聲音、不同的圖像目標和一個按鈕。Vuforia(Unity3d)

不同的聲音、不同的圖像目標和一個按鈕。Vuforia(Unity3d)

C#
qq_遁去的一_1 2022-11-21 20:35:11
我將識別幾個 imageTargets,我想用 onClick(button) 播放聲音。此按鈕位于畫布上,并且在應用程序生命周期內始終位于頂部。所以你總能看到它。在這個按鈕后面,您可以看到相機視圖并識別標記。Fe 我有兩個標記:狗和牛。狗已分配音頻 - 吠聲。牛已分配音頻- muu。當我識別出 Cow -> 單擊按鈕時,它應該會發出 muu 的聲音,但是當我識別出 Dog 時,同樣的按鈕在單擊時應該會發出吠聲。這是一個問題。我無法解決它。我想我應該為這個按鈕編寫一個腳本來為適當的標記播放 onClick 聲音,但我不知道如何告訴按鈕現在我可以看到 Cow 而另一次我可以看到 Dog。我制作了一個在識別圖像時播放聲音的腳本,但我想用按鈕來做。如果有什么地方不夠清楚 - 讓我知道,我會寫得更好或再寫一遍。
查看完整描述

1 回答

?
DIEA

TA貢獻1820條經驗 獲得超2個贊

因此,如果我對您的理解正確,您的代碼基本上可以正常工作,但您不是直接為識別的目標播放相應的聲音,而是只想在單擊按鈕時播放它,對嗎?


您可以簡單地添加一個方法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中斷當前聲音并開始新聲音(取決于您的需要)。


查看完整回答
反對 回復 2022-11-21
  • 1 回答
  • 0 關注
  • 98 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號