> 技术文档 > Unity | 从零开始在vuforia框架下打造你的专属‘游戏相机’,一键捕捉并保存精彩瞬间_unity vuforia使用

Unity | 从零开始在vuforia框架下打造你的专属‘游戏相机’,一键捕捉并保存精彩瞬间_unity vuforia使用


一、vuforia的导入

在asset store里找到vuforia


将其导入unity并在包管理器中找到我的资产

导入之后会有如下一个文件夹,只是一个示例文件夹,将其删除(不然后面会有bug)

二、注册vuforia

此时需要我们配置app license key才能使用

去官网注册账号

注册好后登录进入,点击Plan&Licenses

点击你创建好的

将这个复制

复制到unity中的App License key(上面有图告诉有在哪)

三、开始制作AR场景

将此原来的camera换成vuforia的AR camera

再添加Image Target

此时再次回到vuforia的官网,这次点击Target Manager生成我们的数据库,然后点击Generate Database

生成

点击创建好的test会看见如下画面

点击test进去添加你所需要的图片,可以添加不止一张

下图是我本人自己所已经添加好的,后面的演示我就用这个,按照上面的步骤添加就行了,不一定非要按照博主的来,然后星级所代表的是能够识别的图片的评分,接下来点击Download Database将其导入unity中

下载后会有一个包

找到这个包直接将其导入unity中 

然后在imagetarget中找到你的From Database

Database选择你刚才添加好的(上面博主说了用自己添加好的12,你们应该是自己命名的什么添加什么就好了)

然后这里随便选应该那你添加的图片,我这里选择rabbit,他就会出现如图显示的一张图片

随便将一个模型拖到这个ImagerTarget底下(博主这边是随便举个例子,就随便添加了一个立方体给这个,你可以自己添加自己想要的模型)

然后你调一下立方体的位置

到了这一步你已经可以识别图片并显示模型了

可以自行点击试一下

四、开始制作按钮

添加一个button,当然旧版的按钮也可以

这里博主就随便选一个类似拍照按钮的图像(当然你们可以自己选择,或者自己优化一下)

可以调下他的大小让他看起来圆润一点

把那个Text(TMP)删除可以把那个Button这个文本去掉美观一点

五、前置插件

这个功能首先需要一个叫NativeGallery的插件,这个插件我们可以在Unity Asset Store或其GitHub仓库免费获取

这里有提供网页链接:

  • Asset Store链接: Native Gallery for Android & iOS | Integration | Unity Asset Store
  • GitHub链接: https://github.com/yasirkula/UnityNativeGallery

点击第二个

第一个就是

 将其导入unity的过程就不再赘述,做到这一步的应该都会了,接下来是代码部分

六、代码部分

创建一个C#脚本

完整代码如下

using UnityEngine;using System.Collections;using UnityEngine.UI;using System;public class TakePhotos : MonoBehaviour{ [SerializeField] private Button takePictureButton; private RectTransform rectTransform; public static bool isPhotoClicked; void Start() { rectTransform = GetComponent(); if (takePictureButton != null) { takePictureButton.onClick.AddListener(() => StartCoroutine(TakeAphoto())); } } IEnumerator TakeAphoto() { isPhotoClicked = true; // 关键点1:等待帧渲染结束 yield return new WaitForEndOfFrame(); Camera camera = Camera.main; if (camera == null) { Debug.LogError(\"Main camera not found.\"); yield break; } // 关键点2:使用RenderTexture作为临时画布 int width = Screen.width; int height = Screen.height; RenderTexture rt = new RenderTexture(width, height, 24); camera.targetTexture = rt; // 摄像机输出重定向 var currentRT = RenderTexture.active; RenderTexture.active = rt; camera.Render();// 手动渲染一帧到RenderTexture // 关键点3:从RenderTexture读取像素 Texture2D image = new Texture2D(width, height); image.ReadPixels(new Rect(0, 0, width, height), 0, 0); image.Apply(); // 关键点4:清理与恢复 camera.targetTexture = null; RenderTexture.active = currentRT; byte[] bytes = image.EncodeToPNG(); string fileName = DateTime.Now.ToString(\"yyyyMMdd_HHmmss\") + \".png\"; SaveImageToGallery(bytes, fileName); Destroy(rt); Destroy(image); yield return null; isPhotoClicked = false; } void SaveImageToGallery(byte[] bytes, string fileName) { // 关键点5:跨平台保存#if UNITY_ANDROID || UNITY_IOS // 使用回调方式保存图片 NativeGallery.SaveImageToGallery(bytes, \"GalleryTest\", fileName, (success, path) => { if (success) { Debug.Log(\"Saved image to gallery: \" + path); } else { Debug.LogError(\"Failed to save image to gallery\"); } });#else Debug.LogError(\"Unsupported platform\");#endif } public bool IsTouchOnButton(Vector2 touchPosition) { if (takePictureButton == null || rectTransform == null) { return false; } Vector2 localPoint; RectTransformUtility.ScreenPointToLocalPointInRectangle(rectTransform, touchPosition, null, out localPoint); return rectTransform.rect.Contains(localPoint); }}

创建一个空对象并将此代码挂载到空对象上

点击空对象,将设置好的按钮拖到脚本上

ps:这里如果打包出来有问题请删掉这个文件夹

这个文件夹是vuforia自带的实例文件,对此功能并无实际意义

七、打包成apk测试

点击生成设置

选择Android打包成apk后即可导入手机使用

现在轻按一下你设置好的按钮即可在相册中找到你想要的照片