網頁

2019年9月1日 星期日

Unity 程式設計 - 統計每種圖卡辨識的次數和已辨識圖卡的數量

題目:統計每種圖卡辨識的次數和已辨識圖卡的數量。例如 生日快樂和 unitychan 二張圖卡辨識的次數 及 已辨識幾種圖卡。
方法:
請先看以下二篇文章
Unity 的程式設計 - 當沒偵測到辨識圖時,audio 和 video 組件停止播放
Unity 程式設計 - 按鈕綁定事件 Button Script 的應用

增加Text物件
選  Canvas(畫布),按右鍵,選 UI/Text。
更名為 KindText。
 在 Inspector視窗,Text  輸入: 生日快樂辨識的次數
Font Size(大小): 20
Horizontal Overflow : Overflow。 超過水平寬度,仍顯示在同一列。若是選 Wrap ,會自動換列。
Horizontal Overflow : Overflow。 超過垂直高度,仍會顯示。若是選 Truncate ,會被截斷。
Color (字的顏色): 紅色。
如何選顏色?
先選色環,再選顏色。
移動 KindText 的位置,在下面的 Game視窗可以看到結果。
選  KindText  ,按右鍵,選   Duplicate(再製)。
更名為 TotalText ,Text 輸入:  有幾種圖卡被辨識
移動 TotalText 的位置,在 Game視窗可以看到結果。
在Project 視窗,選 Script,按右鍵,選 Create/C# Script。
新 Script(腳本)更名為 : GlobalDataScript。
對此 Script連按二下,進入  Visual Studio。
輸入程式如下:
-----------------------------------------
static class GlobalData
{
    public static int number = 0; // 所有圖卡被辨識的總次數
    public static int[] VisitArray = new int[2];  //每一種圖卡被辨識的次數, 依本例來說 陣列索引值 0 :生日快樂 , 1: unitychan。
    public static string[] NameArray = new string[]{"生日快樂", "unitychan" };  //每一種圖卡的名字,0 :生日快樂 , 1: unitychan。
}
-------------------------------------------------------
新增1個 Script,更名為 StopTargetScript。
程式如下:
--------------------------------------------------
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class StopTargetScript : MonoBehaviour {
    private Text KindText; // 用來顯示 每一種圖卡被辨識的次數 此字串
    private Text TotalText; // 用來顯示 有多少種圖卡被辨識 此字串
    private GameObject birth, unitychan;

    // Use this for initialization
    void Start ()
    {
        birth = GameObject.Find("Target_birth");
        unitychan = GameObject.Find("Target_unitychan");
        KindText = GameObject.Find("KindText").GetComponent<Text>();
        TotalText = GameObject.Find("TotalText").GetComponent<Text>();
        KindText.text = "";
        TotalText.text = "";
    }

    public void Click()
    {
        int number_of_visitedtarget = 0; //一開始,還沒有辨識任何圖卡,所以初始值設為0
        string kindtext = "";
     
        for (int i = 0; i < 2; i++)
        {
            if (GlobalData.VisitArray[i] > 0)
            {
                number_of_visitedtarget += 1;
            }
            kindtext = kindtext + GlobalData.NameArray[i] + "辨識" + GlobalData.VisitArray[i] + "次\n";
        }
        birth.SetActive(false);
        unitychan.SetActive(false);
   
        TotalText.text = "有" + number_of_visitedtarget + "種圖卡被辨識";
        KindText.text = kindtext;
   
    }

}
---------------------------------------------------
結果如下:
選 Button_stop 此物件,將 StopTargetScript 拖曳到 Inspector視窗的下面,如下:
按「+」。
選小圓點 圖示,輸入 button ,選 Button_stop 此物件。
按「No Function」,選「StopTargetScript」,選「Click()」。
在  Visual Studio中, 修改 BirthTrackedScript 中的  OnTrackableStateChanged 程序內容如下:
-------------------------------------------------------------------------------------------
 public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
    {

        if (newStatus == TrackableBehaviour.Status.TRACKED || newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            //target tracked 
            videoPlayer.Play();
            audioSource.Play();
            // Debug.Log("Playing Video");
            GlobalData.number += 1;
            GlobalData.VisitArray[0] += 1;

        }
        else
        {
            //target lost

            videoPlayer.Stop();
            audioSource.Stop();
            //Debug.Log("Not Playing Video");
        }
    }
-------------------------------------------------------------------------------------------
在  Visual Studio中, 修改 GirlTrackedScript 中的  OnTrackableStateChanged 程序內容如下:
-------------------------------------------------------------------------------------------
 public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
    {

        if (newStatus == TrackableBehaviour.Status.TRACKED || newStatus == TrackableBehaviour.Status.DETECTED || newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            //target tracked 

            audioSource.Play();
            // Debug.Log("Playing Audio");
            GlobalData.number += 1;
            GlobalData.VisitArray[1] += 1;
        }
        else
        {
            //target lost
            audioSource.Stop();
            //Debug.Log("Not Playing Audio");
        }
    }
-------------------------------------------------------------------------------------------
 Visual Studio,按 「附加至 Unity」按鈕,測試程式有無錯誤。
在 unity,按播放鈕,看結果。
在手機上執行結果解釋:
按了「停止辨識」按鈕,祇是把二種圖卡設為沒有 AR 作用,但仍有辨識的功能,所以祇要手機掃描到圖卡,就會增加1次。