[Unity3D]自制UnityForAndroid二维码扫描插件
一周左右最终将二维码生成和扫描功能给实现了,最终能舒缓一口气了,从一開始的疑惑为啥不同的扫码client为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想要的有效信息,然后分析出来事实上二维码无非就是记录了一个简单的信息,通常是URL,然后自己在URL上面做文章!得知了需求之后然后開始着手做二维码的生成,用了开源框架QRCode,然后解析ZXing,都是站在前人的肩膀上继续做下去,我就没有深入研究二维码的深层次方面的东西,大概仅仅知道生成是依据一个二维Bool数组然后绘制像素点形參一个方形的图片,当中三个角跟中间一块是不包括信息的三个角是三个小矩形,是为了定位位置,正中间有一个方形区域没有信息是为了放置Logo用的,相比大家也比較清楚,都见过,如今餐厅,地铁上基本都有扫一扫的标志,呵呵,二维码已经成为一个通用的宣传手段!然后我接到这个任务之后就要一步一步的分析问题到解决这个问题,从生成一张二维码图片開始,到批量生成再到批量生成页面,而且每一个页面中要嵌套与之相应的二维码,然后再到学习Android,由于之前没怎么接触过Java方向的东西,然后简单的看了两天Android,对Android开发有了一个大体的认识和了解,然后再到学习Android和Unity的交互,再到做出Android插件等过程,截止今晚最终将功能实现,没有什么解决不了的问题,仅仅要动手,动脑,一切都OK!
接下来我就分享一下制作过程,关于生成二维码的我当时写了一个教程,结果还被抨击了,说.net程序猿就你这水平...对于这个网友,我的确非常羞愧,我的水平有限,写的内容的确比較浅显,无法满足你求高深技术的法眼,但我写出来是为了更过广大刚開始学习的人,希望能给他们一点入门的帮助!我想说的人外有人,不要认为自己厉害就看不起新手或者没你水平高的人,说不定将来他就有可能技术比你厉害!总而言之,也许对大牛而言,这个二维码的生成和解析非常easy,但我还是坚持下下来,一来也是对自己这一周多时间的一个小结,二来还是前面那句话,希望和广大刚開始学习的人一起学习和进步,一起交流!
二维码生成和交互能够看我之前写的文章:二维码生成 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:
using UnityEngine;
using System.Collections;
public class NewBehaviourScript : MonoBehaviour {
private AndroidJavaObject activity;
private string result="http://blog.csdn.net/dingxiaowei2013"; //result用于接收二维码的返回值
void Start()
{
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity = jc.GetStatic<AndroidJavaObject>("currentActivity");
}
void OnGUI()
{
//点击扫码调用Android方法
if (GUI.Button(new Rect(Screen.width / 2 - 50, 20, 100, 50), "点击扫码"))
{
activity.Call("Show");
}
GUI.Label(new Rect(Screen.width / 2 - 100, 120, 300, 20), result);
}
//这个是Android调用的方法
void GetString(string str)
{
result = str;
}
}
Android:
package com.example.qr_codescan;
import android.content.Intent;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
public class MainActivity extends UnityPlayerActivity {
private final static int SCANNIN_GREQUEST_CODE = 1;
/**
* 显示扫描结果
*/
private TextView mTextView ;
/**
* 显示扫描拍的图片
*/
private ImageView mImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
// mTextView = (TextView) findViewById(R.id.result);
// mImageView = (ImageView) findViewById(R.id.qrcode_bitmap);
//
// //点击按钮跳转到二维码扫描界面,这里用的是startActivityForResult跳转
// //扫描完了之后调到该界面
// Button mButton = (Button) findViewById(R.id.button1);
// mButton.setOnClickListener(new OnClickListener() {
//
// @Override
// public void onClick(View v) {
// Intent intent = new Intent();
// intent.setClass(MainActivity.this, MipcaActivityCapture.class);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
// }
// });
}
public void Show()
{
Intent intent = new Intent();
intent.setClass(MainActivity.this, MipcaActivityCapture.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(intent, SCANNIN_GREQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case SCANNIN_GREQUEST_CODE:
if(resultCode == RESULT_OK){
Bundle bundle = data.getExtras();
//显示扫描到的内容
//mTextView.setText(bundle.getString("result"));
//显示
//mImageView.setImageBitmap((Bitmap) data.getParcelableExtra("bitmap"));
UnityPlayer.UnitySendMessage("Cube","GetString",bundle.getString("result"));
}
break;
}
}
}