一、框架視圖
二、關(guān)鍵代碼
CameraMode
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class CameraMode : MonoBehaviour
{
/// <summary>
/// 高通攝像頭對(duì)焦功能
/// </summary>
void Start()
{
VuforiaARController.Instance.RegisterVuforiaStartedCallback(OnVuforiaStarted);
VuforiaARController.Instance.RegisterOnPauseCallback(OnPaused);
}
void Update()
{
}
private void OnVuforiaStarted()
{
CameraDevice.Instance.SetFocusMode(
CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
private void OnPaused(bool paused)
{
if (!paused)
{ // resume
CameraDevice.Instance.SetFocusMode(
CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
}
}
CoinMannge
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
using DG.Tweening;
public class CoinMannger : MonoBehaviour
{
public GameObject[] AllGoes; //儲(chǔ)存所有目標(biāo)圖片 30張
public Camera mCamera; //渲染Ar相機(jī)為實(shí)現(xiàn)相機(jī)跟隨物體的引用
public GameObject coinPrefabs;//5G幣的預(yù)制體
public GameObject[] goldCoins; //儲(chǔ)存生成的5G幣
public GameObject redPack; //紅包動(dòng)畫(huà)
private Vector3 worldPos; //世界坐標(biāo)
public GameObject PromptTxt; //提示語(yǔ)儲(chǔ)存游戲?qū)ο? private int number=0; //初始值硬幣數(shù)為零
public Text ScroreTxt; //獲得金幣的總數(shù)文本
public GameObject ScanFrame; //掃描框
private AudioSource mAudioSource; //聲音文件的引用
public AudioClip bgClip; //背景音樂(lè)
public AudioClip hahaClip;//哈哈提示聲
public AudioClip noCoinClip; //沒(méi)有金幣的提示聲
public AudioClip foundAllClip; //找到所有金幣
public bool isPlayFoundAll; //是否找到所有金幣或者已經(jīng)滿(mǎn)5次的標(biāo)志位
public bool notFoud; //沒(méi)有金幣或者已經(jīng)掃描過(guò)的金幣
private string regInfo; //提示語(yǔ)信息
private string mToken; //Token碼的引用
private bool isTokenUseless = true; //Token是否失效
private string scanImgId; //掃描圖片的ID號(hào)
public Text RCountTxt; //彈框紅包顯示本次獲得多少個(gè)金幣
public GameObject Img_Bounced; //彈框紅包
public bool isClickPack=true; //是否點(diǎn)擊紅包的標(biāo)志位 默認(rèn)為true
//接口說(shuō)明:返回用戶(hù)掃紅包的總次數(shù),5g幣數(shù),掃過(guò)的紅包圖片id
//測(cè)試請(qǐng)求地址:http://www.top/app/arRedPacket/listRed?token=xxx
//正式請(qǐng)求地址:http://www.vip/app/arRedPacket/listRed?token=xxx
private string getListRedUrl = @"http://www.top/app/ar/arRedPacket/listRed?token={0}"; //紅包信息
//private string getListRedUrl = @"http://www.vip/app/ar/arRedPacket/listRed?token={0}"; //紅包信息
// 接口說(shuō)明:返回圖片次數(shù)
// 測(cè)試請(qǐng)求地址:http://www.top/app/arRedPacket/imgCount?imgId=xx&token=xxx
//正式請(qǐng)求地址:http://www.vip/app/arRedPacket/imgCount?imgId=x&token=xxx
private string getScanRedUrl = @"http://www.top/app/arRedPacket/imgCount?imgId={0}&token={1}"; //接收紅包信息
//private string getScanRedUrl = @"http://www.vip/app/ar/arRedPacket/imgCount?imgId={0}&token={1}"; //接收紅包信息
//接口說(shuō)明:掃描圖片
//測(cè)試請(qǐng)求地址:http://www.top/app/arRedPacket/scanningRed?imgId=xx&gbNumber=xx&token=xx
//正式請(qǐng)求地址:http://www.vip/app/arRedPacket/scanningRed?imgId=xx&gbNumber=xx&token=xx
private string sendScanRedUrl = @"http://www.top/app/arRedPacket/scanningRed?imgId={0}&gbNumber={1}&token={2}"; //發(fā)送紅包信息
// private string sendScanRedUrl = @"http://www.vip/app/arRedPacket/scanningRed?imgId={0}&gbNumber={1}&token={2}"; //發(fā)送紅包信息
void Start()
{
//聲效的引用
mAudioSource = gameObject.GetComponent<AudioSource>();
mAudioSource.clip = bgClip; //背景聲
mAudioSource.volume = 1f;
mAudioSource.pitch = 1f;
mAudioSource.loop = true;
mAudioSource.Play(); //播放背景聲
mToken = PlayerPrefs.GetString("mToken"); //獲取Token碼
GetRedStatus_OnGetRedPackStatus(mToken); //獲取用戶(hù)掃描圖片(紅包)信息接口
//Debug.Log(PlayerPrefs.GetString("mToken"));
worldPos = new Vector3(0, 0, 0); //世界坐標(biāo)
}
void Update()
{
if (ScanFrame.activeSelf)
{
ScanFrame.transform.Rotate(new Vector3(0, 0, -1)); //掃描框旋轉(zhuǎn)
}
}
/// <summary>
///找到目標(biāo) 發(fā)現(xiàn)目標(biāo)
/// </summary>
/// <param name="imgId">圖片ID號(hào)</param>
public void FoundTarget(string imgId)
{
StopAllCoroutines(); //避免出現(xiàn)bug,在此滿(mǎn)足發(fā)現(xiàn)條件時(shí)取消所有協(xié)程
ScanFrame.SetActive(false); //隱藏掃描框
scanImgId = imgId;//圖片ID號(hào)
GetRedStatus_OnScanForwardRedPackStatus(scanImgId, mToken);//調(diào)用獲取用戶(hù)紅包信息的接口(掃描前)動(dòng)畫(huà)彈出來(lái)前的判斷接口
}
/// <summary>
/// 實(shí)例化金幣的過(guò)程
/// </summary>
public void InitCoin() {
goldCoins = new GameObject[UnityEngine.Random.Range(1, 5)]; //隨機(jī)1-5個(gè)金幣的長(zhǎng)度
RCountTxt.text = goldCoins.Length+"個(gè)"; //彈框紅包的文本顯示
number+= goldCoins.Length; //總數(shù)累加
for (int i = 0; i < goldCoins.Length; i++) //實(shí)例化金幣 5秒后銷(xiāo)毀
{
goldCoins[i] = GameObject.Instantiate(coinPrefabs, worldPos, Quaternion.identity);
Destroy(goldCoins[i], 5f);
}
//相機(jī)跟隨金幣 控制物體在相機(jī)框內(nèi)掉落
mCamera.transform.position = new Vector3(goldCoins[goldCoins.Length-1].transform.position.x, goldCoins[goldCoins.Length - 1].transform.position.y + 10, goldCoins[goldCoins.Length - 1].transform.position.z + 10);
mCamera.transform.LookAt(goldCoins[goldCoins.Length - 1].transform); //相機(jī)朝向最后一個(gè)金幣位置
//PlayerPrefs.SetInt("Score", number); //設(shè)置儲(chǔ)存金幣總數(shù)
StartCoroutine("RedTxtDelayShow"); //顯示彈框紅包的過(guò)程
}
/// <summary>
/// 彈框紅包的協(xié)程
/// </summary>
/// <returns></returns>
IEnumerator RedTxtDelayShow()
{
yield return new WaitForSeconds(2f); //等待金幣掉落2秒后顯示紅包
GetRedStatus_OnScanFinishRedPackStatus(scanImgId, goldCoins.Length, mToken); //獲取金幣后把圖片ID號(hào) 金幣數(shù)量 Token調(diào)用接口傳回去
Img_Bounced.SetActive(true); //顯示彈框紅包
Img_Bounced.transform.localScale = new Vector3(0,0,0); //設(shè)置初始化尺寸
Img_Bounced.transform.DOScale(new Vector3(1, 1, 1), 0.5f); //dotween動(dòng)畫(huà)過(guò)程
ScroreTxt.text = "恭喜您已獲得" + number + "個(gè)5G幣!"; //底部顯示金幣總數(shù)量
}
/// <summary>
/// 沒(méi)有找到目標(biāo) 沒(méi)有金幣 或已掃描過(guò)的方法
/// </summary>
public void NotFoundTarget()
{
if (notFoud==false)
{
if (isPlayFoundAll) //已找到5次目標(biāo)
{
mAudioSource.clip = foundAllClip; //聲效賦值全部找到金幣
PromptTxt.transform.GetComponent<Text>().text = "恭喜您已經(jīng)搶到所有紅包!";
}
else
{
mAudioSource.clip = noCoinClip; //沒(méi)有金幣的聲效
PromptTxt.transform.GetComponent<Text>().text = "這里已經(jīng)沒(méi)有5G幣了···";
}
mAudioSource.volume = 1f;
mAudioSource.pitch = 1f;
mAudioSource.loop = false;
mAudioSource.Play();//播放聲效
StartCoroutine(DelayHidden()); //開(kāi)啟延遲文字消失的過(guò)程 漸變
}
}
/// <summary>
/// 逐漸消失的過(guò)程
/// </summary>
/// <returns></returns>
IEnumerator DelayHidden()
{
PromptTxt.SetActive(true); //提示語(yǔ)顯示
yield return new WaitForSeconds(3.5f);
mAudioSource.clip = bgClip;
mAudioSource.volume = 1f;
mAudioSource.pitch = 1f;
mAudioSource.loop = true;
mAudioSource.Play();
Component[] comps = PromptTxt.GetComponentsInChildren<Component>();
foreach (Component c in comps)
{
if (c is Graphic)
{
(c as Graphic).CrossFadeAlpha(0, 2, true);
}
}
yield return new WaitForSeconds(1.5f);
PromptTxt.SetActive(false); //提示語(yǔ)消失
if (isTokenUseless==false)
{
//如果別的手機(jī)登錄跳轉(zhuǎn)到登錄界面
SceneManager.LoadScene("Login");
}
}
/// <summary>
/// 返回按鈕
/// </summary>
public void ReturnBtn() {
SceneManager.LoadScene("Login");
}
/// <summary>
/// 退出按鈕
/// </summary>
public void ExitBtn() {
Application.Quit();
}
/// <summary>
/// 點(diǎn)擊 開(kāi) 按鈕 隱藏動(dòng)畫(huà) 實(shí)例化金幣
/// </summary>
public void HideRedPack() {
redPack.SetActive(false);
InitCoin();
}
/// <summary>
/// 登錄成功后獲取相關(guān)紅包的信息 掃描蚕泽,掃描次數(shù) 掃描過(guò)的圖片id號(hào) 掃描過(guò)的金幣數(shù)
/// </summary>
/// <param name="token">傳回Token碼</param>
public void GetRedStatus_OnGetRedPackStatus(string token)
{
string url = string.Format(getListRedUrl, token);
StartCoroutine(GetFromUrl_RedPack(url,
(v) =>
{
regInfo = v.code + v.imgIdTags + v.message+v.gbNumber+v.scanCount;
if (v.code== "1") //獲取狀態(tài)碼之后進(jìn)行判斷
{
number = v.gbNumber;
ScroreTxt.text = "您已獲得" + number + "個(gè)5G幣!";
if (v.scanCount==0) //5次掃描
{
PromptTxt.transform.GetComponent<Text>().text = "恭喜你桥嗤,你有5次尋寶機(jī)會(huì)哦·";
}
else if (v.scanCount != 5) //剩下的次數(shù)
{
PromptTxt.transform.GetComponent<Text>().text = "來(lái)须妻,來(lái),來(lái)泛领,你還有"+(5-v.scanCount)+"次尋寶機(jī)會(huì)哦·";
}
else //全部掃過(guò)
{
PromptTxt.transform.GetComponent<Text>().text = "恭喜您已經(jīng)搶到所有紅包!";
HideAllGameObject();
redPack.SetActive(false);
isPlayFoundAll = true;
}
StartCoroutine(DelayHidden());
}
else
{
PromptTxt.transform.GetComponent<Text>().text = "服務(wù)器內(nèi)部錯(cuò)誤荒吏,稍后再試";
StartCoroutine(DelayHidden());
}
}
));
}
/// <summary>
/// d登錄成功后開(kāi)啟的網(wǎng)絡(luò)協(xié)程
/// </summary>
/// <param name="url">接口</param>
/// <param name="callback">回調(diào)</param>
/// <returns></returns>
IEnumerator GetFromUrl_RedPack(string url, Action<JsonRedList> callback)
{
WWW www = new WWW(url);
yield return www;
if (www.isDone && string.IsNullOrEmpty(www.error))
{
if (null != callback)
{
string jsonStr = www.text.Trim();
JsonRedList jd = JsonUtility.FromJson<JsonRedList>(jsonStr);
callback.Invoke(jd);
}
}
else
{
Debug.Log("網(wǎng)絡(luò)錯(cuò)誤" + www.error);
PromptTxt.transform.GetComponent<Text>().text = "網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)重新登錄";
DelayHidden();
}
}
/// <summary>
/// 掃描前的判斷
/// </summary>
/// <param name="imgId">圖片ID號(hào)</param>
/// <param name="token">Token碼</param>
public void GetRedStatus_OnScanForwardRedPackStatus(string imgId, string token)
{
string url = string.Format(getScanRedUrl, imgId,token);
StartCoroutine(GetFromUrl_ScanForwardRedPack(url,
(v) =>
{
regInfo =v.code +v.imgId +v.scanCount+ v.message;
if (v.code == "1") //成功返回信息
{
if (v.scanCount < 5) //少于5次播放音效 播放紅包動(dòng)畫(huà)
{
mAudioSource.clip = hahaClip;
mAudioSource.volume = 1f;
mAudioSource.pitch = 1f;
mAudioSource.loop = false;
mAudioSource.Play();
PromptTxt.transform.GetComponent<Text>().text = "哈哈,這都被你找到了···";
StartCoroutine(DelayHidden()); //文字逐漸消失過(guò)程
redPack.SetActive(true); //h紅包動(dòng)畫(huà)
}
else //超過(guò)5次的就播放沒(méi)有找到目標(biāo)的方法
{
NotFoundTarget();
ScanFrame.SetActive(true); //掃描框顯示
}
}
else if (v.code == "10") //表示已經(jīng)搶過(guò)了此id圖片紅包
{
mAudioSource.clip = noCoinClip; //沒(méi)有紅包的聲效
NotFoundTarget();
}
else if (v.code == "88") //表示已經(jīng)搶完所有紅包 只是發(fā)現(xiàn)目標(biāo)而已
{
mAudioSource.clip = foundAllClip; //所有紅包聲效
isPlayFoundAll = true;//所有紅包的標(biāo)志位
HideAllGameObject();//隱藏所有目標(biāo)體
redPack.SetActive(false); //紅包動(dòng)畫(huà)關(guān)閉
NotFoundTarget(); //沒(méi)有發(fā)現(xiàn)目標(biāo)的方法
PromptTxt.transform.GetComponent<Text>().text = "恭喜您已經(jīng)搶到所有紅包了!";
StartCoroutine(DelayHidden()); //文字逐漸消失的過(guò)程
ScanFrame.SetActive(true); //顯示掃描框
}
else
{
PromptTxt.transform.GetComponent<Text>().text = "網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)重新登錄";
DelayHidden();
}
}
));
}
/// <summary>
/// 返回圖片 被掃過(guò)的次數(shù)返回值
/// </summary>
/// <param name="url"></param>
/// <param name="callback"></param>
/// <returns></returns>
IEnumerator GetFromUrl_ScanForwardRedPack(string url, Action<JsonImgCount> callback)
{
WWW www = new WWW(url);
yield return www;
if (www.isDone && string.IsNullOrEmpty(www.error))
{
if (null != callback)
{
string jsonStr = www.text.Trim();
JsonImgCount jd = JsonUtility.FromJson<JsonImgCount>(jsonStr);
callback.Invoke(jd);
}
}
else
{
Debug.Log("網(wǎng)絡(luò)錯(cuò)誤" + www.error);
PromptTxt.transform.GetComponent<Text>().text = "網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)重新登錄";
DelayHidden();
}
}
/// <summary>
/// 掃描完成 金幣生成完畢之后 把被掃描圖片的id號(hào) 金幣數(shù) Token傳回服務(wù)器
/// </summary>
/// <param name="imgId"></param>
/// <param name="gbNumber"></param>
/// <param name="token"></param>
public void GetRedStatus_OnScanFinishRedPackStatus(string imgId,int gbNumber, string token)
{
string url = string.Format(sendScanRedUrl, imgId, gbNumber, token);
StartCoroutine(GetFromUrl_ScanFinishRedPack(url,
(v) =>
{
regInfo = v.code + v.message ;
switch (v.code)
{
case "1":
//number
break;
case "422":
PromptTxt.transform.GetComponent<Text>().text = "你手機(jī)在別處登錄···"; //Token失效
isTokenUseless = false; //開(kāi)啟標(biāo)志位
StartCoroutine(DelayHidden());
break;
case "0":
Debug.Log("圖片參數(shù)id不能為空");
break;
case "2":
Debug.Log("用戶(hù)token不能為空渊鞋!");
break;
case "10":
Debug.Log("您已經(jīng)搶到紅包绰更,您還可以尋找另外的紅包點(diǎn)!");
break;
case "88": //搶完所有紅包
if (notFoud==false)
{
HideAllGameObject();
PromptTxt.transform.GetComponent<Text>().text = "恭喜您已經(jīng)搶到所有紅包了!";
isPlayFoundAll = true;
NotFoundTarget();
}
break;
case "500":
Debug.Log("服務(wù)器內(nèi)部錯(cuò)誤锡宋!");
break;
default:
PromptTxt.transform.GetComponent<Text>().text = "服務(wù)器內(nèi)部錯(cuò)誤儡湾,稍后再試";
StartCoroutine(DelayHidden());
break;
}
}
));
}
/// <summary>
/// 掃描完成 把數(shù)據(jù)傳回去開(kāi)啟網(wǎng)絡(luò)協(xié)程
/// </summary>
/// <param name="url"></param>
/// <param name="callback"></param>
/// <returns></returns>
IEnumerator GetFromUrl_ScanFinishRedPack(string url, Action<JsonSend> callback)
{
WWW www = new WWW(url);
yield return www;
if (www.isDone && string.IsNullOrEmpty(www.error))
{
if (null != callback)
{
string jsonStr = www.text.Trim();
JsonSend jd = JsonUtility.FromJson<JsonSend>(jsonStr);
callback.Invoke(jd);
}
}
else
{
Debug.Log("網(wǎng)絡(luò)錯(cuò)誤" + www.error);
PromptTxt.transform.GetComponent<Text>().text = "網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)重新登錄";
DelayHidden();
}
}
/// <summary>
/// 隱藏所有目標(biāo)物體
/// </summary>
public void HideAllGameObject() {
for (int i = 0; i < AllGoes.Length; i++)
{
AllGoes[i].SetActive(false);
}
}
/// <summary>
/// 世界坐標(biāo)轉(zhuǎn)換成屏幕坐標(biāo)
/// </summary>
/// <param name="canvas"></param>
/// <param name="worldGo"></param>
/// <returns></returns>
//public static Vector3 WorldToUIPoint(Canvas canvas, Transform worldGo)
//{
// Vector3 v_v3 = Camera.main.WorldToScreenPoint(worldGo.position);
// Vector3 v_ui = canvas.worldCamera.ScreenToWorldPoint(v_v3);
// Vector3 v_new = new Vector3(v_ui.x, v_ui.y, canvas.GetComponent<RectTransform>().anchoredPosition3D.z);
// return v_new;
//}
public static Vector3 WorldToUI(Camera camera, Vector3 pos)
{
CanvasScaler scaler = GameObject.Find("Canvas").GetComponent<CanvasScaler>();
float resolutionX = scaler.referenceResolution.x;
float resolutionY = scaler.referenceResolution.y;
Vector3 viewportPos = camera.WorldToViewportPoint(pos);
Vector3 uiPos = new Vector3(viewportPos.x * resolutionX - resolutionX * 0.5f,
viewportPos.y * resolutionY - resolutionY * 0.5f, 0);
return uiPos;
}
/// <summary>
/// Dotween開(kāi)啟 隱藏紅包功能
/// </summary>
public void HideRedScoreBtn() {
// StopCoroutine("RedTxtDelayHidden");
StartCoroutine("DelaySetActive");
//點(diǎn)擊紅包收縮 之后實(shí)例化金幣緊張?jiān)僭O(shè)置為標(biāo)志位true
isClickPack = true;
}
/// <summary>
/// 把紅包金幣數(shù)延遲隱藏
/// </summary>
/// <returns></returns>
IEnumerator DelaySetActive()
{
Img_Bounced.transform.DOScale(new Vector3(0, 0, 0), 0.4f);//設(shè)置尺寸
yield return new WaitForSeconds(1f);//延遲一秒之后
Img_Bounced.SetActive(false); //獲得金幣數(shù)紅包隱藏
ScanFrame.SetActive(true); //掃描框顯示
//yield return new WaitForSeconds(1f);//延遲一秒之后
//StopAllCoroutines(); //避免出現(xiàn)bug,在此滿(mǎn)足發(fā)現(xiàn)條件時(shí)取消所有協(xié)程
}
}
CoinTrackableEventHandler
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//using UnityEngine.UI;
namespace Vuforia
{
/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class CoinTrackableEventHandler : MonoBehaviour,
ITrackableEventHandler
{
#region PRIVATE_MEMBER_VARIABLES
private TrackableBehaviour mTrackableBehaviour; //定義跟蹤變量
private List<GameObject> listGoes = new List<GameObject>(); //儲(chǔ)存所有游戲物體
#endregion // PRIVATE_MEMBER_VARIABLES
#region UNTIY_MONOBEHAVIOUR_METHODS
void Start()
{
//相關(guān)變量的引用
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
}
#endregion // UNTIY_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)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
// OnTrackingFound();
if (gameObject.activeSelf == true && GameObject.Find("GoManager").transform.GetComponent<CoinMannger>().isClickPack == true) //如果當(dāng)前掃描到的游戲物體是活躍的前提下才執(zhí)行
//if (gameObject.activeSelf == true) //如果當(dāng)前掃描到的游戲物體是活躍的前提下才執(zhí)行
{
OnTrackingFound();
//找到對(duì)應(yīng)物體下掛到腳本的發(fā)現(xiàn)目標(biāo)的方法 傳圖片的ID號(hào)
GameObject.Find("GoManager").transform.GetComponent<CoinMannger>().FoundTarget(gameObject.transform.tag);
Debug.Log(gameObject.transform.tag);
gameObject.SetActive(false); //執(zhí)行方法之后把自己物體隱藏掉
//設(shè)置點(diǎn)擊紅包標(biāo)志位為不可執(zhí)行
GameObject.Find("GoManager").transform.GetComponent<CoinMannger>().isClickPack = false;
}
else
//if (gameObject.activeSelf == false )
//如果不是活躍的話
{
//判斷紅包是不是 隱藏狀態(tài) 不播放
if (GameObject.Find("GoManager").transform.GetComponent<CoinMannger>().redPack.activeSelf == false&& GameObject.Find("GoManager").transform.GetComponent<CoinMannger>().Img_Bounced.activeSelf==false)
{
//執(zhí)行沒(méi)有發(fā)現(xiàn)目標(biāo)的方法
GameObject.Find("GoManager").transform.GetComponent<CoinMannger>().NotFoundTarget();
}
}
}
else
{
OnTrackingLost();
listGoes.Clear(); //清空游戲物體
StopAllCoroutines(); //停止所有的協(xié)程
}
}
#endregion // PUBLIC_METHODS
#region PRIVATE_METHODS
private void OnTrackingFound()
{
if (gameObject.activeSelf == true) //加個(gè)判斷 物體是激活狀態(tài)
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
// Enable rendering:
foreach (Renderer component in rendererComponents)
{
component.enabled = true;
}
// Enable colliders:
foreach (Collider component in colliderComponents)
{
component.enabled = true;
}
}
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
}
private void OnTrackingLost()
{
if (gameObject.activeSelf == true) //加個(gè)判斷 物體是激活狀態(tài)
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
// Disable rendering:
foreach (Renderer component in rendererComponents)
{
component.enabled = false;
}
// Disable colliders:
foreach (Collider component in colliderComponents)
{
component.enabled = false;
}
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}
}
#endregion // PRIVATE_METHODS
}
}
JsonParsing
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 登錄
/// </summary>
public class JsonLogin
{
public string code;
public string token;
public string message;
}
/// <summary>
/// 獲取圖片被掃描的次數(shù)
/// </summary>
public class JsonImgCount
{
public string code;
public int scanCount;
public string imgId;
public string message;
}
/// <summary>
/// 個(gè)人用戶(hù)獲取紅包相關(guān)信息
/// </summary>
public class JsonRedList
{
public string code;
public string imgIdTags;
public string message;
public int gbNumber;
public int scanCount;
}
/// <summary>
/// 把掃描過(guò)執(zhí)行生成金幣后的相關(guān)信息傳回后臺(tái)
/// </summary>
public class JsonSend
{
public string code;
public string message;
}
LoginCtrl
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
using System.Text.RegularExpressions;//正則表達(dá)式
public class LoginCtrl : MonoBehaviour {
public InputField InputFieldMobile; //獲取手機(jī)輸入框內(nèi)容
public InputField InputFieldVerificationCode; //獲取手機(jī)驗(yàn)證碼輸入框內(nèi)容
public Button Btn_Login; //登錄按鈕
public string tokenCode; //token碼
public GameObject RegProImg; //提示信息游戲?qū)ο? public string StatusNumber; //狀態(tài)碼
private string promptTxt; //方便設(shè)施提示語(yǔ)
private bool isTiming = false; //計(jì)時(shí)是否開(kāi)始
private int NowSecond; // 設(shè)置時(shí)間為60秒
private int i = 0; //幀數(shù)開(kāi)始漸變
public Button Btn_Reset; //重置 重新發(fā)送驗(yàn)證碼
private string regInfo; //Json解析出來(lái)狀態(tài)信息
// 1.檢查手機(jī)是否注冊(cè)并發(fā)送驗(yàn)證碼
//接口說(shuō)明:檢查手機(jī)是否有效执俩,如果手機(jī)有效就發(fā)送驗(yàn)證碼
//測(cè)試請(qǐng)求地址:http://www.top/app/sendVerifiCode?mobile=13534226999
//正式請(qǐng)求地址:http://www.vip/app/sendVerifiCode?mobile=13534226999
private string sendVerifiCodeUrl = @"http://www.top/app/sendVerifiCode?mobile={0}";
//private string sendVerifiCodeUrl = @"http://www.vip/app/sendVerifiCode?mobile={0}"; //重新發(fā)送驗(yàn)證碼
// 2.登入檢查驗(yàn)證碼
//接口說(shuō)明:檢查驗(yàn)證碼徐钠。
//測(cè)試請(qǐng)求地址:http://www.top/app/arRedPacket/toLogin?mobile=18823770014&code=1452
//正式請(qǐng)求地址:http://www.vip/app/arRedPacket/toLogin?mobile=18823770014&code=1452
private string toLoginUrl = @"http://www.top/app/arRedPacket/toLogin?mobile={0}&code={1}"; //登錄接口
//private string toLoginUrl = @"http://www.vip/app/arRedPacket/toLogin?mobile={0}&code={1}"; //登錄接口
//public Text mText;
void Start () {
//SignatureVerify.IsCorrect();
//mText.text= SignatureVerify.myHash+"簽名";
//獲取已經(jīng)儲(chǔ)存用戶(hù)名和驗(yàn)證碼
if (PlayerPrefs.GetString("P_User").ToString() != null)
{
InputFieldMobile.text = PlayerPrefs.GetString("P_User").ToString();
InputFieldVerificationCode.text = PlayerPrefs.GetString("P_Password").ToString();
}
}
void Update () {
}
/// <summary>
/// 計(jì)時(shí)器開(kāi)啟
/// </summary>
void FixedUpdate()
{
if (isTiming) //計(jì)時(shí)開(kāi)啟
{
i++;
if (i > 30)
{
i = 0;
NowSecond--; //減
}
Btn_Reset.transform.Find("Text").transform.GetComponent<Text>().text = "(" + NowSecond + "s)"+ "<color=#C8C8C8FF>重新發(fā)送</color>";
if (NowSecond < 1)
{
isTiming = false; //計(jì)時(shí)暫停
Btn_Reset.transform.Find("Text").transform.GetComponent<Text>().text = "重新獲取"; //顯示最終按鈕
Btn_Reset.interactable = true; //按鈕設(shè)置可用
}
}
}
/// <summary>
/// 登錄按鈕控制
/// </summary>
public void LoginBtn() {
if (!CheckPhoneIsAble(InputFieldMobile.text)) //調(diào)用檢查手機(jī)的方法
{
InputFieldMobile.text = "";
InputFieldVerificationCode.text = "";
promptTxt = "輸入的手機(jī)格式不對(duì),請(qǐng)重新輸入";
StartCoroutine(DelayHidden());
}
else if (InputFieldVerificationCode.text.Length != 4) //驗(yàn)證碼不是4位的判斷 包括空少于4位或者超過(guò)4位的
{
promptTxt = "驗(yàn)證碼是4位數(shù),請(qǐng)重新輸入";
StartCoroutine(DelayHidden());
}
else {
GetRegStatus_OnGetLoginStatus(InputFieldMobile.text,InputFieldVerificationCode.text);//符合條件 調(diào)用登錄按鈕的接口
}
}
//---------------------------------------------------------登錄接口匯編-----------------------------
/// <summary>
/// 登錄的接口 獲取狀態(tài)碼的判斷
/// </summary>
/// <param name="userLg">手機(jī)號(hào)</param>
/// <param name="passwordLg">驗(yàn)證碼</param>
public void GetRegStatus_OnGetLoginStatus(string userLg, string passwordLg)
{
string url = string.Format(toLoginUrl, userLg, passwordLg); //鏈接按字符串的格式獲取
StartCoroutine(GetFromUrl_Token(url,
(v) =>
{
regInfo = "狀態(tài)碼:" + v.code + " token碼:" + v.token + "返回信息提示語(yǔ):" + v.message; //打印狀態(tài)信息
StatusNumber = v.code; //獲取狀態(tài)碼進(jìn)行賦值
tokenCode = v.token; //儲(chǔ)存token
if (StatusNumber == "1") //成功
{
PlayerPrefs.SetString("P_User", InputFieldMobile.text); //設(shè)置手機(jī)號(hào)來(lái)儲(chǔ)存
PlayerPrefs.SetString("P_Password", InputFieldVerificationCode.text); //設(shè)置驗(yàn)證碼儲(chǔ)存
PlayerPrefs.SetString("mToken", tokenCode); //設(shè)置Token儲(chǔ)存
promptTxt = "正在啟動(dòng)AR紅包,請(qǐng)準(zhǔn)備開(kāi)始您的尋寶之旅吧"; //提示語(yǔ)
StartCoroutine(DelayHidden()); //開(kāi)啟提示語(yǔ)漸變的過(guò)程
SceneManager.LoadScene("Main"); //成功之后調(diào)入主場(chǎng)景
Btn_Login.interactable = false; //設(shè)置為不可用
} //返回狀態(tài)判斷
else if (StatusNumber == "0")
{
InputFieldVerificationCode.text = "";
promptTxt = "請(qǐng)輸入手機(jī)號(hào):";
StartCoroutine(DelayHidden());
}
else if (StatusNumber == "5")
{
InputFieldVerificationCode.text = "";
promptTxt = "驗(yàn)證碼錯(cuò)誤,請(qǐng)重新輸入";
StartCoroutine(DelayHidden());
}
else if (StatusNumber == "8")
{
InputFieldVerificationCode.text = "";
promptTxt = "驗(yàn)證碼失效,請(qǐng)重新發(fā)送";
StartCoroutine(DelayHidden());
}
else if (StatusNumber == "9")
{
promptTxt = "請(qǐng)輸入驗(yàn)證碼";
StartCoroutine(DelayHidden());
}
else
{
InputFieldVerificationCode.text = "";
promptTxt = "服務(wù)器內(nèi)部錯(cuò)誤役首,稍后再試";
StartCoroutine(DelayHidden());
}
}
));
}
/// <summary>
/// 開(kāi)啟協(xié)程獲取網(wǎng)絡(luò)狀態(tài) Action沒(méi)有參數(shù)回調(diào) Funtion有參數(shù)回調(diào)
/// </summary>
/// <param name="url"></param>
/// <param name="callback"></param>
/// <returns></returns>
IEnumerator GetFromUrl_Token(string url, Action<JsonLogin> callback)
{
WWW www = new WWW(url);
yield return www;
if (www.isDone && string.IsNullOrEmpty(www.error))
{
//Debug.Log(www.text);
if (null != callback)
{
string jsonStr = www.text.Trim();
JsonLogin jd = JsonUtility.FromJson<JsonLogin>(jsonStr);
callback.Invoke(jd);
}
}
else
{
Debug.Log("網(wǎng)絡(luò)錯(cuò)誤" + www.error);
promptTxt = "網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)重新登錄";
DelayHidden();
}
}
//---------------------------------------------------------登錄接口匯編完畢-----------------------------
/// <summary>
/// 開(kāi)啟提示按鈕慢慢消失的過(guò)程
/// </summary>
/// <returns></returns>
IEnumerator DelayHidden()
{
RegProImg.SetActive(true);
RegProImg.transform.GetChild(0).GetComponent<Text>().text = promptTxt;
yield return new WaitForSeconds(1.5f);
Component[] comps = RegProImg.GetComponentsInChildren<Component>();
foreach (Component c in comps)
{
if (c is Graphic)
{
(c as Graphic).CrossFadeAlpha(0, 2, true);
}
}
yield return new WaitForSeconds(1.5f);
RegProImg.SetActive(false);
}
/// <summary>
/// 檢查手機(jī)是否合法可用 可在可視面板控制輸入的是11位
/// </summary>
/// <param name="input">輸入的手機(jī)號(hào)</param>
/// <returns></returns>
private bool CheckPhoneIsAble(string input)
{
if (input.Length < 11)
{
return false;
}
string dianxin = @"^1[3578][01379]\d{8}$";
Regex regexDX = new Regex(dianxin);
string liantong = @"^1[34578][01256]\d{8}";
Regex regexLT = new Regex(liantong);
string yidong = @"^(1[012345678]\d{8}|1[345678][012356789]\d{8})$";
Regex regexYD = new Regex(yidong);
if (regexDX.IsMatch(input) || regexLT.IsMatch(input) || regexYD.IsMatch(input))
{
return true;
}
else
{
return false;
}
}
/// <summary>
/// 點(diǎn)擊獲取驗(yàn)證碼的判斷
/// </summary>
public void ClickBtnSendReset()
{
if (!CheckPhoneIsAble(InputFieldMobile.text)) //調(diào)用手機(jī)號(hào)是否合法可用
{
promptTxt = "輸入的手機(jī)格式不對(duì),請(qǐng)重新輸入";
StartCoroutine(DelayHidden());
}
else
{
NowSecond = 60; //開(kāi)啟60秒倒計(jì)時(shí)
isTiming = true; //開(kāi)啟計(jì)時(shí)
Btn_Reset.interactable = false; //按鈕不可用
GetRegStatus_OnGetRegStatus(InputFieldMobile.text); //調(diào)用回去驗(yàn)證碼的接口
}
}
//--------------------------------------------驗(yàn)證碼接口---------------------------
/// <summary>
/// 調(diào)用獲取驗(yàn)證碼的接口
/// </summary>
/// <param name="phoneNum"></param>
public void GetRegStatus_OnGetRegStatus(string phoneNum)
{
string url = string.Format(sendVerifiCodeUrl, phoneNum);
StartCoroutine(GetFromUrl(url,
(v) =>
{
regInfo = v.code + "\n" + v.message + "\n";
StatusNumber = v.code;
if (StatusNumber == "1")
{
promptTxt = v.message;
StartCoroutine(DelayHidden());
}
else if (StatusNumber == "0")
{
promptTxt = "網(wǎng)絡(luò)錯(cuò)誤尝丐,請(qǐng)重新發(fā)送....";
StartCoroutine(DelayHidden());
}
else if (StatusNumber == "2")
{
promptTxt = "網(wǎng)絡(luò)錯(cuò)誤显拜,請(qǐng)重新發(fā)送....";
StartCoroutine(DelayHidden());
}
}
));
}
IEnumerator GetFromUrl(string url, Action<JsonSend> callback)
{
WWW www = new WWW(url);
yield return www;
if (www.isDone && string.IsNullOrEmpty(www.error))
{
Debug.Log(www.text);
if (null != callback)
{
string jsonStr = www.text.Trim();
JsonSend jd = JsonUtility.FromJson<JsonSend>(jsonStr);
callback.Invoke(jd);
}
}
else
{
Debug.Log("網(wǎng)絡(luò)錯(cuò)誤" + www.error);
RegProImg.SetActive(true);
RegProImg.transform.GetChild(0).GetComponent<Text>().text = "網(wǎng)絡(luò)錯(cuò)誤,請(qǐng)重新登錄";
}
}
//--------------------------------------------驗(yàn)證碼接口完畢---------------------------
}
RedPackCtrl
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class RedPackCtrl : MonoBehaviour
{
private Ray ray;
private RaycastHit hit;
void Start()
{
}
void Update()
{
}
/// <summary>
/// 封裝射線
/// </summary>
void RaySend()
{
if (Input.GetMouseButton(0))
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out hit))
{
if (hit.transform.tag == "Red")
{
GameObject.Find("GoManager").transform.GetComponent<CoinMannger>().InitCoin();
Destroy(gameObject);
}
}
}
}
/// <summary>
/// 生成金幣的方法
/// </summary>
public void InitCoin()
{
GameObject.Find("Go").transform.GetComponent<CoinMannger>().InitCoin();
Destroy(this.transform.gameObject);
}
}
ScreenAdaptation
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ScreenAdaptation : MonoBehaviour {
/// <summary>
/// 屏幕適配
/// </summary>
void Start()
{
float standard_width = 800f; //初始寬度
float standard_height =600f; //初始高度
float device_width = 0f; //當(dāng)前設(shè)備寬度
float device_height = 0f; //當(dāng)前設(shè)備高度
float adjustor = 0f; //屏幕矯正比例
//獲取設(shè)備寬高
device_width = Screen.width;
device_height = Screen.height;
//計(jì)算寬高比例
float standard_aspect = standard_width / standard_height;
float device_aspect = device_width / device_height;
//計(jì)算矯正比例
if (device_aspect < standard_aspect)
{
adjustor = standard_aspect / device_aspect;
}
CanvasScaler canvasScalerTemp = transform.GetComponent<CanvasScaler>(); //獲取UI下的組件
if (adjustor == 0)
{
canvasScalerTemp.matchWidthOrHeight = 0; //注意數(shù)值
}
else
{
canvasScalerTemp.matchWidthOrHeight = 1; //注意數(shù)值
}
}
void Update () {
}
}
SignatureVerify
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// Signature verify tool class
/// 防止被二次簽名重打包
/// </summary>
public class SignatureVerify {
/**
* Verify the signature is correct
**/
internal static int myHash = 0;
public static bool IsCorrect()
{
#if UNITY_ANDROID
// 獲取Android的PackageManager
AndroidJavaClass Player = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject Activity = Player.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject PackageManager = Activity.Call<AndroidJavaObject>("getPackageManager");
// 獲取當(dāng)前Android應(yīng)用的包名
string packageName = Activity.Call<string>("getPackageName");
// 調(diào)用PackageManager的getPackageInfo方法來(lái)獲取簽名信息數(shù)組
int GET_SIGNATURES = PackageManager.GetStatic<int>("GET_SIGNATURES");
AndroidJavaObject PackageInfo = PackageManager.Call<AndroidJavaObject>("getPackageInfo", packageName, GET_SIGNATURES);
AndroidJavaObject[] Signatures = PackageInfo.Get<AndroidJavaObject[]>("signatures");
// 獲取當(dāng)前的簽名的哈希值,判斷其與我們簽名的哈希值是否一致
if (Signatures != null && Signatures.Length > 0)
{
int hashCode = Signatures[0].Call<int>("hashCode");
myHash = hashCode;
return hashCode == -1705791141;//我們簽名的哈希值
}
return false;
#else
return true;
#endif
}
}