增强现实的解密游戏


有兴趣的朋友可以试试,不过好像不很稳定。

游戏过程的视频:http://www.bilibili.com/video/av3375068/

游戏的APK下载地址: http://www.nshworkshop.cn/demo/12/arpuzzlegame.apk

游戏用到的图片下载:http://www.nshworkshop.cn/demo/12/pic.zip

 游戏源码:https://code.csdn.net/wuyt2008/arpuzzlegame






最近在弄增强现实,主要是基于Unity3D和vuforia AR SDK。有个想做真人密室逃脱游戏的朋友看到了,就说这个可以用在真人密室逃脱游戏里,于是就有了这个demo。

这个演示其实很简单,就是在识别率特定图片以后,会载入新的场景来推动游戏进程。

Unity3D制作AR图片识别请看以前的文章:http://blog.csdn.net/wuyt2008/article/details/48326767


Vuforia给的例子中的视频播放脚本稍微修改下

/*============================================================================== 
 * Copyright (c) 2012-2014 Qualcomm Connected Experiences, Inc. All Rights Reserved. 
 * ==============================================================================*/

using UnityEngine;
using Vuforia;

/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class TrackableEventHandler : MonoBehaviour,
                                     ITrackableEventHandler
{
    #region PRIVATE_MEMBER_VARIABLES

    private TrackableBehaviour mTrackableBehaviour;

    private bool mHasBeenFound = false;
    private bool mLostTracking;
    private float mSecondsSinceLost;

    #endregion // PRIVATE_MEMBER_VARIABLES

	private bool track=false;

    #region UNITY_MONOBEHAVIOUR_METHODS

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

        OnTrackingLost();
    }


    void Update()
    {
        // Pause the video if tracking is lost for more than two seconds
        if (mHasBeenFound && mLostTracking)
        {
            if (mSecondsSinceLost > 0.5f)
            {
                VideoPlaybackBehaviour video = GetComponentInChildren<VideoPlaybackBehaviour>();
                if (video != null &&
                    video.CurrentState == VideoPlayerHelper.MediaState.PLAYING)
                {
                    video.VideoPlayer.Pause();
                }

                mLostTracking = false;
            }

            mSecondsSinceLost += Time.deltaTime;
        }
    }

    #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)
    {
        if (newStatus == TrackableBehaviour.Status.DETECTED ||
            newStatus == TrackableBehaviour.Status.TRACKED ||
            newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
        {
            OnTrackingFound();
        }
        else
        {
            OnTrackingLost();
        }
    }

    #endregion // PUBLIC_METHODS



    #region PRIVATE_METHODS

    private void OnTrackingFound()
    {
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>();
        Collider[] colliderComponents = GetComponentsInChildren<Collider>();

        // 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");

        // Optionally play the video automatically when the target is found

        VideoPlaybackBehaviour video = GetComponentInChildren<VideoPlaybackBehaviour>();
        if (video != null && video.AutoPlay)
        {
            if (video.VideoPlayer.IsPlayableOnTexture())
            {
                VideoPlayerHelper.MediaState state = video.VideoPlayer.GetStatus();
                if (state == VideoPlayerHelper.MediaState.PAUSED ||
                    state == VideoPlayerHelper.MediaState.READY ||
                    state == VideoPlayerHelper.MediaState.STOPPED)
                {
                    // Pause other videos before playing this one
                    PauseOtherVideos(video);

                    // Play this video on texture where it left off
                    video.VideoPlayer.Play(false, video.VideoPlayer.GetCurrentPosition());
                }
                else if (state == VideoPlayerHelper.MediaState.REACHED_END)
                {
                    // Pause other videos before playing this one
                    PauseOtherVideos(video);

                    // Play this video from the beginning
                    video.VideoPlayer.Play(false, 0);
                }
            }
        }

        mHasBeenFound = true;
        mLostTracking = false;
		track = true;
    }


    private void OnTrackingLost()
    {
        Renderer[] rendererComponents = GetComponentsInChildren<Renderer>();
        Collider[] colliderComponents = GetComponentsInChildren<Collider>();

        // 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");

        mLostTracking = true;
        mSecondsSinceLost = 0;

		if (track) {
			GameManager.TrackLost(gameObject.name);
		} 

		track = false;
    }


    // Pause all videos except this one
    private void PauseOtherVideos(VideoPlaybackBehaviour currentVideo)
    {
        VideoPlaybackBehaviour[] videos = (VideoPlaybackBehaviour[])
                FindObjectsOfType(typeof(VideoPlaybackBehaviour));

        foreach (VideoPlaybackBehaviour video in videos)
        {
            if (video != currentVideo)
            {
                if (video.CurrentState == VideoPlayerHelper.MediaState.PLAYING)
                {
                    video.VideoPlayer.Pause();
                }
            }
        }
    }

    #endregion // PRIVATE_METHODS
}

这个是控制游戏的类

using UnityEngine;
using System.Collections;

public static class GameManager {

	public static int currentScene=0;
	public static string[] tips = {"努力加载中","开始游戏吧","你找到一个锁着的箱子","再问问宫森葵,她知道的更多","快去找宫森葵,你找到资料了","恭喜你,游戏已经通关","请把手机放到Cardboard里,请小心周围情况。"};
	public static string[] scene = {"Open","SceneOne","SceneTow","SceneSAO","SceneFour","SceneEnd","BoxAR"};
	private static string[] rnd = {"SceneAB","SceneSAO","SceneKoto","SceneSuzumiya"};

	public static void TrackLost(string information){
		switch (currentScene) {
		case 0:
			break;
		case 1:
			if(information=="Box"){
				currentScene=2;
				Application.LoadLevel("LoadScene");
			}
			break;
		case 2:
			if(information=="Miyamori"){
				currentScene=3;
				scene[3]=RandomScene();
				Application.LoadLevel("LoadScene");
			}
			break;
		case 3:
			if(information=="SAO"||information=="AB"||information=="Koto"||information=="Suzumiya"){
				currentScene=4;
				Application.LoadLevel("LoadScene");
			}
			break;
		case 4:
			if(information=="Box"){
				currentScene=5;
				Application.LoadLevel("LoadScene");
			}
			break;
		default:
			break;
		}
	}

	private static string RandomScene(){
		string strReturn = PlayerPrefs.GetString("scene","SceneAB");
		int temp = Random.Range (0, 4);
		if(strReturn==rnd[temp]){
			temp=temp+1;
		}
		if(temp>=rnd.Length){
			temp=0;
		}
		strReturn = rnd [temp];
		PlayerPrefs.SetString ("scene",strReturn);
		return strReturn;
	}
}



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值