AR開(kāi)發(fā)實(shí)戰(zhàn)Vuforia項(xiàng)目之AR尋寶(實(shí)現(xiàn)與服務(wù)器對(duì)接功能)

一、框架視圖

二、關(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
    }
}

三爹袁、效果展示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末远荠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子失息,更是在濱河造成了極大的恐慌譬淳,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件根时,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辰晕,警方通過(guò)查閱死者的電腦和手機(jī)蛤迎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)含友,“玉大人替裆,你說(shuō)我怎么就攤上這事【轿剩” “怎么了辆童?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惠赫。 經(jīng)常有香客問(wèn)我把鉴,道長(zhǎng),這世上最難降的妖魔是什么儿咱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任庭砍,我火速辦了婚禮,結(jié)果婚禮上混埠,老公的妹妹穿的比我還像新娘怠缸。我一直安慰自己,他們只是感情好钳宪,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布揭北。 她就那樣靜靜地躺著,像睡著了一般吏颖。 火紅的嫁衣襯著肌膚如雪搔体。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天半醉,我揣著相機(jī)與錄音嫉柴,去河邊找鬼。 笑死奉呛,一個(gè)胖子當(dāng)著我的面吹牛计螺,可吹牛的內(nèi)容都是我干的夯尽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼登馒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匙握!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起陈轿,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圈纺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后麦射,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛾娶,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年潜秋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛔琅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡峻呛,死狀恐怖罗售,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钩述,我是刑警寧澤寨躁,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站牙勘,受9級(jí)特大地震影響职恳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜方面,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一话肖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葡幸,春花似錦最筒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蔑水,卻和暖如春邢锯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搀别。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工丹擎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓蒂培,卻偏偏與公主長(zhǎng)得像再愈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子护戳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容