Unity3D-高通AR-《狼来了》-5编程实现音效播放和界面UI元素的动态显示

1. 实现音效播放和界面UI元素的动态显示

1.1 实现要求和思路

实现要求

1.场景开始时不显示按钮等UI元素
2.当识别图卡后出现AR对象时,播放音效
3.当识图卡无效时,按钮等UI元素隐藏

实现思路

1.场景中的ImageTarget对象添加AudioSource组件,并指定声音文件,初始不勾选参数Play On Awake,也就是场景开始运行时不播放该音效。
2.场景中的ImageTarget带有脚本DefaultTrackableEventHandler.cs,通过其方法OnTrackingFound()、OnTrackingLost()可以设置图卡跟踪发现、丢失时的业务逻辑,如显示UI元素、播放音效等。

操作界面如下:
在这里插入图片描述

接下来实编程实现图卡识别时播放音效及界面元素的动态显示。

1.2 自定义默认的跟踪触发处理脚本

1.打开ImageTarget对象上的脚本DefaultTrackableEventHandler.cs通过复制粘贴在_Script目录下创建MyTrackableEventHandler.cs脚本

不直接在系统提供的代码上修改,这是一个好的习惯

2.在MyTrackableEventHandler.cs脚本中定义Public型的数组变量obj

 public GameObject[]  obj ;// 需要对一些游戏对象进行处理

场景中需要动态显示的对象只要赋值给这个数组变量

3在MyTrackableEventHandler.cs脚本中找到OnTrackingFound()函数,在末尾添加以下几行代码

		Debug.Log("识别图卡了......"); //控制台调试输出
        // 对一些对象进行处理(识别图卡后,设置这些对象显示)
        for(int i = 0; i< obj.Length ;i++){
            obj[i].SetActive(true);
        }
        
        // 播放音效 
        this.GetComponent<AudioSource>().Play();

4.在MyTrackableEventHandler.cs脚本中找到OnTrackingLost()函数,在末尾添加以下几行代码

        Debug.Log("图卡不再被识别......");//控制台调试输出
        // 对一些对象进行处理(图卡不再被识别后,设置这些对象不显示)       
        for(int i = 0; i< obj.Length ;i++){
            obj[i].SetActive(false);
        }

完整的MyTrackableEventHandler.cs脚本代码如下:

/*==============================================================================
Copyright (c) 2017 PTC Inc. All Rights Reserved.

Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Protected under copyright and other laws.
==============================================================================*/

using UnityEngine;
using Vuforia;

/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
///
/// Changes made to this file could be overwritten when upgrading the Vuforia version.
/// When implementing custom event handler behavior, consider inheriting from this class instead.
/// </summary>
public class MyDefaultTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
{
    public GameObject[]  obj ;// 需要对一些游戏对象进行处理

    #region PROTECTED_MEMBER_VARIABLES

    protected TrackableBehaviour mTrackableBehaviour;
    protected TrackableBehaviour.Status m_PreviousStatus;
    protected TrackableBehaviour.Status m_NewStatus;

    #endregion // PROTECTED_MEMBER_VARIABLES

    #region UNITY_MONOBEHAVIOUR_METHODS

    protected virtual void Start()
    {
        mTrackableBehaviour = GetComponent<TrackableBehaviour>();
        if (mTrackableBehaviour)
            mTrackableBehaviour.RegisterTrackableEventHandler(this);
    }

    protected virtual void OnDestroy()
    {
        if (mTrackableBehaviour)
            mTrackableBehaviour.UnregisterTrackableEventHandler(this);
    }

    #endregion // UNITY_MONOBEHAVIOUR_METHODS

    #region PUBLIC_METHODS

    /// <summary>
    ///     Implementation of the ITrackableEventHandler function called when the
    ///     tracking state changes.
    /// </summary>
    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");
            OnTrackingFound();
        }
        else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
                 newStatus == TrackableBehaviour.Status.NO_POSE)
        {
            Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
            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();
        }
    }

    #endregion // PUBLIC_METHODS

    #region PROTECTED_METHODS

    protected virtual void OnTrackingFound()
    {
        var rendererComponents = GetComponentsInChildren<Renderer>(true);
        var colliderComponents = GetComponentsInChildren<Collider>(true);
        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Enable rendering:
        foreach (var component in rendererComponents)
            component.enabled = true;

        // Enable colliders:
        foreach (var component in colliderComponents)
            component.enabled = true;

        // Enable canvas':
        foreach (var component in canvasComponents)
            component.enabled = true;

        Debug.Log("识别图卡了......"); //控制台调试输出
        // 对一些对象进行处理(识别图卡后,设置这些对象显示)
        for(int i = 0; i< obj.Length ;i++){
            obj[i].SetActive(true);
        }
        
        // 播放音效 
        this.GetComponent<AudioSource>().Play();

    }


    protected virtual void OnTrackingLost()
    {
        var rendererComponents = GetComponentsInChildren<Renderer>(true);
        var colliderComponents = GetComponentsInChildren<Collider>(true);
        var canvasComponents = GetComponentsInChildren<Canvas>(true);

        // Disable rendering:
        foreach (var component in rendererComponents)
            component.enabled = false;

        // Disable colliders:
        foreach (var component in colliderComponents)
            component.enabled = false;

        // Disable canvas':
        foreach (var component in canvasComponents)
            component.enabled = false;

        Debug.Log("图卡不再被识别......");//控制台调试输出
        // 对一些对象进行处理(图卡不再被识别后,设置这些对象不显示)       
        for(int i = 0; i< obj.Length ;i++){
            obj[i].SetActive(false);
        }
    }

    #endregion // PROTECTED_METHODS
}

有中文注释的部分时我们添加的代码

1.3 使用MyTrackableEventHandler脚本

1.将MyTrackableEventHandler.cs脚本赋予给ImageTarget物体,并将原有的脚本组件DefaultTrackableEventHandler关闭或删除。
2.为脚本指定对应参数(将场景中的UI可视对象,拖放到对应参数中)
操作界面如下:
在这里插入图片描述
测试一下

  • 运行后,初始场景按钮等UI元素时不显示的
  • 图卡识别后,播放音效、出现按钮等UI元素
  • 每个按钮可交互

思考

图卡识别后出现一些特效(比如闪光等),该如何实现呢?

以上都是通过识图卡来实现AR场景功能的,接下来介绍,通过识别地平面来实现AR。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值