文档章节

[Unity3D]自制UnityForAndroid二维码扫描插件

丁小未
 丁小未
发布于 2014/05/01 23:31
字数 1380
阅读 4387
收藏 10
点赞 1
评论 0

一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分析出来其实二维码无非就是记录了一个简单的信息,一般是URL,然后自己在URL上面做文章!得知了需求之后然后开始着手做二维码的生成,用了开源框架QRCode,然后解析ZXing,都是站在前人的肩膀上继续做下去,我就没有深入研究二维码的深层次方面的东西,大概只知道生成是根据一个二维Bool数组然后绘制像素点形参一个方形的图片,其中三个角跟中间一块是不包含信息的三个角是三个小矩形,是为了定位位置,正中间有一个方形区域没有信息是为了放置Logo用的,相比大家也比较清楚,都见过,现在餐厅,地铁上基本都有扫一扫的标志,呵呵,二维码已经成为一个通用的宣传手段!然后我接到这个任务之后就要一步一步的分析问题到解决问题,从生成一张二维码图片开始,到批量生成再到批量生成页面,并且每个页面中要嵌套与之对应的二维码,然后再到学习Android,因为之前没怎么接触过Java方向的东西,然后简单的看了两天Android,对Android开发有了一个大体的认识和了解,然后再到学习Android和Unity的交互,再到做出Android插件等过程,截止今晚终于将功能实现,没有什么解决不了的问题,只要动手,动脑,一切都OK!

接下来我就分享一下制作过程,关于生成二维码的我当时写了一个教程,结果还被抨击了,说.net程序员就你这水平...对于这个网友,我的确很惭愧,我的水平有限,写的内容的确比较浅显,无法满足你求高深技术的法眼,但我写出来是为了更过广大初学者,希望能给他们一点入门的帮助!我想说的人外有人,不要觉得自己厉害就看不起新手或者没你水平高的人,说不定将来他就有可能技术比你厉害!总而言之,或许对大牛而言,这个二维码的生成和解析很简单,但我还是坚持下下来,一来也是对自己这一周多时间的一个小结,二来还是前面那句话,希望和广大初学者一起学习和进步,一起交流!

二维码生成和交互可以看我之前写的文章:二维码生成 http://blog.csdn.net/dingxiaowei2013/article/details/22925709,Unity和Android交互http://blog.csdn.net/dingxiaowei2013/article/details/24485937。在这基础之上,然后接着实现功能!

更多精彩内容请关注我的微博  @丁小未    转载请注明出处:http://blog.csdn.net/dingxiaowei2013/article/details/24677795

效果图:


手机扫描后的效果:




说明:这里是Unity界面调用Android的Java方法跳转Android开发的Activity视图,然后在Android中Java方法调用Unity再回到Unity界面。

源码

Unity:

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. using UnityEngine;  

  2. using System.Collections;  

  3.   

  4. public class NewBehaviourScript : MonoBehaviour {  

  5.   

  6.     private AndroidJavaObject activity;  

  7.     private string result="http://blog.csdn.net/dingxiaowei2013";  //result用于接收二维码的返回值  

  8.     void Start()  

  9.     {  

  10.         AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");  

  11.         activity = jc.GetStatic<AndroidJavaObject>("currentActivity");  

  12.     }  

  13.   

  14.     void OnGUI()  

  15.     {  

  16.         //点击扫码调用Android方法  

  17.         if (GUI.Button(new Rect(Screen.width / 2 - 50, 20, 100, 50), "点击扫码"))  

  18.         {  

  19.             activity.Call("Show");  

  20.         }  

  21.         GUI.Label(new Rect(Screen.width / 2 - 100, 120, 300, 20), result);  

  22.     }  

  23.   

  24.     //这个是Android调用的方法  

  25.     void GetString(string str)  

  26.     {  

  27.         result = str;  

  28.     }  

  29. }  


Android:

[java] view plaincopyprint?在CODE上查看代码片派生到我的代码片

  1. package com.example.qr_codescan;  

  2.   

  3.   

  4. import android.content.Intent;  

  5. import android.os.Bundle;  

  6. import android.widget.ImageView;  

  7. import android.widget.TextView;  

  8.   

  9. import com.unity3d.player.UnityPlayer;  

  10. import com.unity3d.player.UnityPlayerActivity;  

  11.   

  12.   

  13.   

  14. public class MainActivity extends UnityPlayerActivity {  

  15.     private final static int SCANNIN_GREQUEST_CODE = 1;  

  16.     /** 

  17.      * 显示扫描结果 

  18.      */  

  19.     private TextView mTextView ;  

  20.     /** 

  21.      * 显示扫描拍的图片 

  22.      */  

  23.     private ImageView mImageView;  

  24.       

  25.   

  26.     @Override  

  27.     protected void onCreate(Bundle savedInstanceState) {  

  28.         super.onCreate(savedInstanceState);  

  29.         //setContentView(R.layout.activity_main);  

  30.           

  31. //      mTextView = (TextView) findViewById(R.id.result);   

  32. //      mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);  

  33. //        

  34. //      //点击按钮跳转到二维码扫描界面,这里用的是startActivityForResult跳转  

  35. //      //扫描完了之后调到该界面  

  36. //      Button mButton = (Button) findViewById(R.id.button1);  

  37. //      mButton.setOnClickListener(new OnClickListener() {  

  38. //            

  39. //          @Override  

  40. //          public void onClick(View v) {  

  41. //              Intent intent = new Intent();  

  42. //              intent.setClass(MainActivity.this, MipcaActivityCapture.class);  

  43. //              intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  

  44. //              startActivityForResult(intent, SCANNIN_GREQUEST_CODE);  

  45. //          }  

  46. //      });  

  47.     }  

  48.       

  49.     public void Show()  

  50.     {  

  51.         Intent intent = new Intent();  

  52.         intent.setClass(MainActivity.this, MipcaActivityCapture.class);  

  53.         intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  

  54.         startActivityForResult(intent, SCANNIN_GREQUEST_CODE);  

  55.     }  

  56.       

  57.       

  58.       

  59.     @Override  

  60.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  

  61.         super.onActivityResult(requestCode, resultCode, data);  

  62.         switch (requestCode) {  

  63.         case SCANNIN_GREQUEST_CODE:  

  64.             if(resultCode == RESULT_OK){  

  65.                 Bundle bundle = data.getExtras();  

  66.                 //显示扫描到的内容  

  67.                 //mTextView.setText(bundle.getString("result"));  

  68.                 //显示  

  69.                 //mImageView.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap"));  

  70.                 UnityPlayer.UnitySendMessage("Cube","GetString",bundle.getString("result"));  

  71.             }  

  72.             break;  

  73.         }  

  74.     }     

  75.   

  76. }  


导出插件:

然后我导出成插件,之前一个扫码插件是EasyCodeScanner,然后我今后的网名叫Aladdin,我也命名一个扫码的Android插件,为AladdinCodeScanner,日后可能继续完成添加上IOS的扫码功能,完善这一插件,我这也是深受EasyCodeScanner的折磨才决定自食其力!之前好不容易找到一个扫码的插件EasyCodeScanner,结果发现会出错还有关键的是没有实现Android的扫码功能,Android部分的方法没实现,所以也促成了我自己写插件的念头,今天如愿以偿,一身轻松!时间不早,感觉熬夜身体有点吃不消了,身体是本钱,明儿继续将工程补上!晚安!

工程源码:

http://down.51cto.com/data/1156726


© 著作权归作者所有

共有 人打赏支持
丁小未
粉丝 7
博文 17
码字总数 24438
作品 0
南通
[Unity3D]自制UnityForAndroid二维码扫描插件

一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想...

蓬莱仙羽 ⋅ 2014/04/29 ⋅ 0

使用Cocos Creator 开发微信小游戏(一)—— 项目配置与环境搭建

项目配置与环境搭建 第一次打开Cocos Creator界面,就感觉,这很Unity啊,虽然有不少地方还没有完善,但是对于开发小游戏这样轻量级的游戏是够用的了,所以用过Unity的同学上手会特别快。这个...

yao_jianlun ⋅ 05/06 ⋅ 0

Unite Beijing 2018|行业应用精彩议题曝光

我们不久之前为大家提前曝光了部分大会精彩技术议题,引起了大家的广泛关注。作为世界顶尖的内容创作引擎,Unity不仅仅可用于跨平台的游戏开发,越来越多的开发者将Unity运用到制造业,汽车,...

weixin_41849687 ⋅ 04/20 ⋅ 0

【Unity】多线程和主线程交互使用类——Loom工具分享(转载)

作者:D.S.Qiu 原文:Unity多线程(Thread)和主线程(MainThread)交互使用类——Loom工具分享 熟悉Unity的developer都知道在Unity中的线程不能使用Unity的对象,但可以使用Unity的值类型变...

何三思 ⋅ 04/12 ⋅ 0

Unity网页数据交互基本原理

1. u3d是一个3D游戏引擎由于和编辑器集成在一起 所以也可以理解为一个制作/开发平台 2. u3d使用javascript C#作为核心脚本语言 来驱动整个游戏引擎 3. 平台可以发布为Exe执行文件或者打包为供...

qq_30279553 ⋅ 04/22 ⋅ 0

iOS 游戏开发之unity5.0(百度贴吧转载收藏)

Unity 发布到IOS的注意事项1.开发环境 MAC环境:Xcode环境 7.2.1 Unity环境:Unity5.3 2.基本说明 首先,我说一下,这是我在对Unity发布到IOS的实际使用中,总结出来的经验!如果你想一次就发...

joyliyan ⋅ 05/25 ⋅ 0

使用TexturePackerGUI打包unity3d图集的方法

在U3d中,UGUI使用Sprite2D格式,NGUI则需要打包成Atlas图集,使用TexturePackerGUI打包Ngui图集,资源占用较少,性能较高。TexturePacker最终将生成2个文件一个图集文件,一个存放图集中图片...

u014024839 ⋅ 05/24 ⋅ 0

关于Unity3D Assets资源目录结构管理

u3d默认目录 ) (插件)不是C#语言写一些插件和库,比如javajsC++,u3d默认目录,u3d是C#编译器,其他语言只有这个目录才能识别 资源,需要动态加载的资源放在这里,打包时在这个文件夹里的所有文件...

lizhenxiqnmlgb ⋅ 05/23 ⋅ 0

Unity 3D 开发《王者荣耀》:Hello World

Unity 安装 Unity 官方网站:https://unity3d.com 点击右上角的 获取Unity 系统要求 OS: Windows 7 SP1+, 8, 10, 64-bit versions only; Mac OS X 10.9+. GPU:有DX9(着色器模型2.0)功能的...

iOSDevLog ⋅ 05/22 ⋅ 0

Vuforia(高通)识别3D物体

先纠正上一篇博客中的一个错误 上一篇中说道Database可以修改,但不能删除,这个是错误的,因为自己也是第一次做,网上也搜了很多资料,有一个说不能删除,只能修改,自己上传的也很少就没有...

weixin_37608784 ⋅ 05/24 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

服务网关过滤器

过滤器作用 我们的微服务应用提供的接口就可以通过统一的API网关入口被客户端访问到了。但是,每个客户端用户请求微服务应用提供的接口时,它们的访问权限往往都需要有一定的限制,系统并不会...

明理萝 ⋅ 15分钟前 ⋅ 1

【2018.06.21学习笔记】【linux高级知识 14.1-14.3】

14.1 NFS介绍 NFS服务全称是NetWork File System:网络文件系统,最早有sun公司开发的,4.0版本由Netapp公司开发,是基于RPC远程过程调用(Remote Procedure Call)协议的服务。 14.2 NFS服务...

lgsxp ⋅ 24分钟前 ⋅ 0

Day18 vim编辑模式、命令模式与练习

编辑模式 命令模式 :nohl 不高亮显示 :x与:wq类似,如果在更改文件之后操作,两者效果一样;如果打开文件,没有任何操作; :wq会更改mtime,但是:x不会。 练习题 扩展 vim的特殊用法 ht...

杉下 ⋅ 28分钟前 ⋅ 0

Enum、EnumMap、EnumSet

1、Enum 不带参数 public enum Car { AUDI { @Override public int getPrice() { return 25000; } }, MERCEDES { ......

职业搬砖20年 ⋅ 28分钟前 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 30分钟前 ⋅ 0

线程组和 ThreadLocal

前言 在上面文章中,我们从源码的角度上解析了一下线程池,并且从其 execute 方法开始把线程池中的相关执行流程过了一遍。那么接下来,我们来看一个新的关于线程的知识点:线程组。 线程组 ...

猴亮屏 ⋅ 31分钟前 ⋅ 0

相对路径和绝对路径

基本概念   文件路径就是文件在电脑中的位置,表示文件路径的方式有两种,相对路径和绝对路径。在网页设计中通过路径可以表示链接,插入图像、Flash、CSS文件的位置。   物理路径:物理路...

临江仙卜算子 ⋅ 35分钟前 ⋅ 0

消息队列属性及常见消息队列介绍

什么是消息队列? 消息队列是在消息的传输过程中保存消息的容器,用于接收消息并以文件的方式存储,一个队列的消息可以同时被多个消息消费者消费。分布式消息服务DMS则是分布式的队列系统,消...

中间件小哥 ⋅ 37分钟前 ⋅ 0

java程序员使用web3j进行以太坊开发详解

如何使用web3j为Java应用或Android App增加以太坊区块链支持,教程内容即涉及以太坊中的核心概念,例如账户管理包括账户的创建、钱包创建、交易转账,交易与状态、智能合约开发与交互、过滤器...

笔阁 ⋅ 37分钟前 ⋅ 0

vim编辑模式、vim命令模式

vim编辑模式 使用vim filename 进入的界面是一般模式,在这个模式下虽然我们能够查看,复制,剪切,粘贴,但是不能编辑新的内容,如何能直接写入东西呢?这就需要进入编辑模式了,从一般模式...

李超小牛子 ⋅ 40分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部