ゲームに指紋認証を組み込んだものって見ないなぁと思ったので、そのベースとなる指紋認証を組み込めるプラグインをAndroidのみですが作成しました。
本当は、iOSプラグインを作って両プラットフォーム対応にしたかったのですが、何せiOS端末を持っていないということで実機検証不可…oh…
このプラグインの制作にあたって、様々な記事を参考にさせていただいたのですが…主にここのブログと、もうひとつ参考になったブログがあったのですが…見失いました…
http://redfreshet.com/2015/08/18/unity_android_link_1/
まずは、プラグインを使用してるUnityのソースから
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace FingerAuth {
public class FingerManager : MonoBehaviour {
private const string JAVA_CLASS_NAME = "com.example.fingerauthunity.lib.FingerAuth";
//Androidプラグインからコールバックを受け取るため
private const string OBJECT_NAME = "FingerManager";
private FingerAuthState _state;
public FingerAuthState State { get { return _state; } }
// Use this for initialization
void Start () {
_state = FingerAuthState.INIT;
gameObject.name = OBJECT_NAME;
FingerAuthStart();
}
// Update is called once per frame
void Update () {
}
public void FingerAuthStart() {
using (AndroidJavaClass plugin = new AndroidJavaClass(JAVA_CLASS_NAME)) {
plugin.CallStatic("AuthStart");
}
}
//CallBackで処理結果が返ってくる
public void FingerAuthResult(string message) {
_state = (FingerAuthState)int.Parse(message);
}
}
public enum FingerAuthState {
INIT = -1,
WAIT = 0,
SUCCESS = 1,
FAILD = 2
}
}
… #if を追加するの忘れていたので、必要であらば追加してください。
そして、Androidでの指紋認証を行うソースはこちら
package com.example.fingerauthunity.lib;
import android.annotation.TargetApi;
import android.app.Activity;
import android.hardware.fingerprint.FingerprintManager;
import android.os.Build;
import android.os.CancellationSignal;
import android.os.Handler;
import android.util.Log;
import com.unity3d.player.UnityPlayer;
import static android.content.Context.FINGERPRINT_SERVICE;
public class FingerAuth {
private static CancellationSignal cancel;
@TargetApi(Build.VERSION_CODES.M)
public static void AuthStart() {
UnityPlayer.UnitySendMessage("FingerManager", "FingerAuthResult", "0");
final Activity activity = UnityPlayer.currentActivity;
FingerprintManager fingerprintManager = (FingerprintManager) activity.getSystemService(FINGERPRINT_SERVICE);
cancel = new CancellationSignal();
fingerprintManager.authenticate(null, cancel, 0, new FingerprintManager.AuthenticationCallback() {
@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
UnityPlayer.UnitySendMessage("FingerManager", "FingerAuthResult", "1");
cancel.cancel();
Log.i("", "auth success");
}
@Override
public void onAuthenticationFailed() {
UnityPlayer.UnitySendMessage("FingerManager", "FingerAuthResult", "2");
cancel.cancel();
Log.e("", "failed");
}
/*
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
UnityPlayer.UnitySendMessage("FingerManager", "FingerAuthResult", "3");
cancel.cancel();
Log.e("", "error " + errorCode + " " + errString);
}
*/
}, new Handler());
}
}
これで、端末に登録してある指紋との一致不一致をUnityにコールバックしてUnity側でよしなにする…という流れですね
指紋認証でモンスター召喚とかしたい!と思って作成したものの、指紋が人差し指か中指かわかるのかと思いきや、登録してるしてないでしか判断できないとは……
さらに言うと登録のAPIがないらしいので、アプリ側からは登録できないのかぁ…と残念な感じに…
せめて、指紋がどの指とかわかればなぁ…
リポジトリは、サクッとテキトーに作ったものなのでご容赦を
Plugin用AndroidProject
GitHub Android Project
UnitySampleProject
GitHub Unity Project