一、登录易接官网下载安卓sdk
1、下载后对文件进行解压,YiJieSDKV2.7\网游\demo\u3d\game\Android的文件导入到unity
2、新建脚本文件YijieHelper.cs
using UnityEngine; using System.Collections; using System.Text; using System.Threading; using System.Runtime.InteropServices; using System; using System.IO; using System.Net; using Common; using System.Globalization; using InterSource; public class YijieHelper : MonoBehaviour { public static YijieHelper Instance; private AndroidJavaObject curActivity; #if zs public static string LoginUrl = "http://center.tlly.yx285.com/iface/yijiesdk/sdklogin.php"; public static string CP_PAY_SYNC_URL = "http://center.tlly.yx285.com/iface/yijiesdk/pay.php"; #else public static string LoginUrl = "http://112.73.72.23/iface/yijiesdk/sdklogin.php"; public static string CP_PAY_SYNC_URL = "http://112.73.72.23/iface/yijiesdk/pay.php"; #endif //自建服务器 测服 // public static string CP_LOGIN_CHECK_URL = "http://testomsdk.xiaobalei.com:5555/cp/user/paylog/checkLoginZijian"; //自建服务器 正服 // public static string CP_LOGIN_CHECK_URL = "http://testomsdk.xiaobalei.com:5555/cp/user/paylog/checkLoginZijianP"; //test //public static string CP_LOGIN_CHECK_URL = "http://testomsdk.xiaobalei.com:5555/cp/user/paylog/checkLogin"; //release public static string CP_LOGIN_CHECK_URL = "http://testomsdk.xiaobalei.com:5555/cp/user/paylog/checkLoginP"; public static string CP_PAY_CHECK_URL = "http://testomsdk.xiaobalei.com:5555/cp/user/paylog/get?orderId="; public static string PAYTYPE_PAY = "pay"; public static string PAYTYPE_CHARGE = "charge"; public static string PAYTYPE_PAY_EXTEND = "payextend"; public static string PAYTYPE_ROLE = "setData"; string goodName = ""; string keyName = ""; int money = 0; string desc = ""; string paytype = ""; string setDataType = ""; Rect windowRect = new Rect (20, 20, 400, 600); string str = "MainCamera"; public SFOnlineUser user; public static Boolean bLogined = false; public Boolean isQuerying = false; public Boolean isDebug = false; public Boolean isPause = false; public Boolean isFocus = false; public ArrayList orderIds = new ArrayList (); struct OderId { public int retry; public string orderId; } public GUISkin guiSkin; /** * exit接口用于系统全局退出 * @param context 上下文Activity * @param gameObject 游戏场景中的对象 * @param listener 退出的监听函数,隶属于gameObject对象的运行时脚本的方法名称,该方法会在收到退出通知后触发 * */ [DllImport("gangaOnlineUnityHelper")] private static extern void exit (IntPtr context, string gameObject, string listener); /** * onCreate_listener接口用于初始化回调 * @param context 上下文Activity * @param gameObject 游戏场景中的对象 * @param listener 退出的监听函数,隶属于gameObject对象的运行时脚本的方法名称,该方法会在收到退出通知后触发 * */ [DllImport("gangaOnlineUnityHelper")] private static extern void onCreate_listener (IntPtr context, string gameObject, string listener); /** * login接口用于SDK登陆 * @param context 上下文Activity * @param customParams 自定义参数 * */ [DllImport("gangaOnlineUnityHelper")] private static extern void login (IntPtr context, string customParams); /** * logout接口用于SDK登出 * @param context 上下文Activity * @param customParams 自定义参数 * */ [DllImport("gangaOnlineUnityHelper")] private static extern void logout (IntPtr context, string customParams); /** * charge接口用于用户触发非定额计费 * @param context 上下文Activity * @param gameObject 游戏场景中的对象 * @param itemName 虚拟货币名称 * @param unitPrice 游戏道具单位价格,单位-分 * @param count 商品或道具数量 * @param callBackInfo 由游戏开发者定义传入的字符串,会与支付结果一同发送给游戏服务器, * 游戏服务器可通过该字段判断交易的详细内容(金额角色等) * @param callBackUrl 将支付结果通知给游戏服务器时的通知地址url,交易结束后, * 系统会向该url发送http请求,通知交易的结果金额callbackInfo等信息 * @param payResultListener 支付监听接口,隶属于gameObject对象的运行时脚本的方法名称,该方法会在收到通知后触发 * */ [DllImport("gangaOnlineUnityHelper")] private static extern void charge (IntPtr context, string gameObject, string itemName, int unitPrice, int count, string callBackInfo, string callBackUrl, string payResultListener); /** * pay接口用于用户触发定额计费 * @param context 上下文Activity * @param gameObject 游戏场景中的对象 * @param unitPrice 游戏道具单位价格,单位-分 * @param unitName 虚拟货币名称 * @param count 商品或道具数量 * @param callBackInfo 由游戏开发者定义传入的字符串,会与支付结果一同发送给游戏服务器, * 游戏服务器可通过该字段判断交易的详细内容(金额角色等) * @param callBackUrl 将支付结果通知给游戏服务器时的通知地址url,交易结束后, * 系统会向该url发送http请求,通知交易的结果金额callbackInfo等信息 * @param payResultListener 支付监听接口,隶属于gameObject对象的运行时脚本的方法名称,该方法会在收到通知后触发 * */ [DllImport("gangaOnlineUnityHelper")] private static extern void pay (IntPtr context, string gameObject, int unitPrice, string unitName, int count, string callBackInfo, string callBackUrl, string payResultListener); /** * payExtend接口用于用户触发定额计费 * @param context 上下文Activity * @param gameObject 游戏场景中的对象 * @param unitPrice 游戏道具单位价格,单位-分 * @param unitName 虚拟货币名称 * @param itemCode 商品ID * @param remain 商品自定义参数 * @param count 商品或道具数量 * @param callBackInfo 由游戏开发者定义传入的字符串,会与支付结果一同发送给游戏服务器, * 游戏服务器可通过该字段判断交易的详细内容(金额角色等) * @param callBackUrl 将支付结果通知给游戏服务器时的通知地址url,交易结束后, * 系统会向该url发送http请求,通知交易的结果金额callbackInfo等信息 * @param payResultListener 支付监听接口,隶属于gameObject对象的运行时脚本的方法名称,该方法会在收到通知后触发 * */ [DllImport("gangaOnlineUnityHelper")] private static extern void payExtend (IntPtr context, string gameObject, int unitPrice, string unitName, string itemCode, string remain, int count, string callBackInfo, string callBackUrl, string payResultListener); /** * 部分渠道如UC渠道,要对游戏人物数据进行统计,而且为接入规范,调用时间:在游戏角色登录成功后调用 * public static void setRoleData(Context context, String roleId, * String roleName, String roleLevel, String zoneId, String zoneName) * * @param context 上下文Activity * @param roleId 角色唯一标识 * @param roleName 角色名 * @param roleLevel 角色等级 * @param zoneId 区域唯一标识 * @param zoneName 区域名称 * */ //setRoleData接口用于部分渠道如UC渠道,要对游戏人物数据进行统计,接入规范:在游戏角色登录成功后 [DllImport("gangaOnlineUnityHelper")] private static extern void setRoleData (IntPtr context, string roleId, string roleName, string roleLevel, string zoneId, string zoneName); //备用接口 [DllImport("gangaOnlineUnityHelper")] private static extern void setData (IntPtr context, string key, string value); /** * setLoginListener方法用于设置登陆监听 * 初始化SDK * @param context 上下文Activity * @param gameObject 游戏场景中的对象,SDK内部完成计费逻辑后, * 并把计费结果通过Unity的 * API(com.unity3d.player.UnityPlayer.UnitySendMessage(String gameObject, * StringruntimeScriptMethod,Stringargs) * 通知到Unity,故游戏开发者需要指定一个游戏对象和该对象的运行脚本,用于侦听SDK的计费结果 * @param listener 登录的监听函数,隶属于gameObject对象的运行时脚本的方法名称,该方法会在收到通知后触发 */ [DllImport("gangaOnlineUnityHelper")] private static extern void setLoginListener (IntPtr context, string gameObject, string listener); /** * extend扩展接口 * 扩展接口 * @param context 上下文Activity * @param data data * @param gameObject 游戏场景中的对象, * @param listener 扩展的监听函数,隶属于gameObject对象的运行时脚本的方法名称,该方法会在收到通知后触发 */ [DllImport("gangaOnlineUnityHelper")] private static extern void extend (IntPtr context, string data,string gameObject, string listener); /** * isMusicEnabled方法用于判断SDK是否需要打开游戏声音,目前只有移动基地需要此接口, * 游戏开发者需要根据该返回值,设定游戏背景音乐是否开启 * * @param context 上下文Activity */ [DllImport("gangaOnlineUnityHelper")] private static extern Boolean isMusicEnabled (IntPtr context); GUI.WindowFunction windowFunction; void OnGUI () { if (guiSkin) { GUI.skin = guiSkin; } //windowRect = GUI.Window (0, windowRect, DoMyWindow, str); } string createQueryURL (string orderId) { if (user == null) { return null; } StringBuilder builder = new StringBuilder (); builder.Append (CP_PAY_CHECK_URL); builder.Append ("?orderId="); builder.Append (orderId); return builder.ToString (); } //bool startcheck; // Use this for initialization void Start () { using( AndroidJavaClass unityPlayer = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) { Debug.Log( "onstart" ); using( AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>( "currentActivity" ) ) { onCreate_listener( curActivity.GetRawObject(), "U8SDKhelper", "InitResult" ); Debug.Log( "onstart完毕" ); } } Debug.Log( "22222222222222222222" ); } // Update is called once per frame void Update () { if(Input.GetKey(KeyCode.Backspace) || Input.GetKey(KeyCode.Escape)){ // Application.Quit(); using (AndroidJavaClass unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { using (AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { exit(curActivity.GetRawObject (), "U8SDKhelper", "ExitResult"); } } } } void extendCallback(string result){ Debug.Log ("扩展回调:"+result); } void callback1(string result){ Debug.Log ("------------callback1=" + result); SFJSONObject sfjson = new SFJSONObject (result); string tag = (string)sfjson.get ("tag"); string value = (string)sfjson.get ("value"); Debug.Log ("tag:" + tag + " value:" + value); if (tag.Equals ("success")) { Debug.Log ("成功"); } else { Debug.Log ("失败"); } } //初始化回调 void InitResult(string result){ if(result.Equals ("success")) { Debug.Log ("成功"); }else { Debug.Log ("失败"); } } void callback2(string result){ Debug.Log ("------------callback2=" + result); SFJSONObject sfjson = new SFJSONObject (result); string tag = (string)sfjson.get ("tag"); string value = (string)sfjson.get ("value"); Debug.Log ("tag:" + tag + " value:" + value); if (tag.Equals ("success")) { Debug.Log ("成功"); } else { Debug.Log ("失败"); } } //易接登录接口 public void YijieLogin() { Debug.Log( "login 0" ); using( AndroidJavaClass unityPlayer = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) { Debug.Log( "login 1" ); using( AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>( "currentActivity" ) ) { setLoginListener( curActivity.GetRawObject(), "U8SDKhelper", "LoginResult" ); Debug.Log( "setloginlistener" ); login( curActivity.GetRawObject(), "Login" ); Debug.Log( "login 2" ); } } Debug.Log( "易接登录接口调用完毕" ); } // 登陆监听函数 public string userinfos; void LoginResult (string result) { userinfos = result; Debug.Log ("------------loginResult=" + result); SFJSONObject sfjson = new SFJSONObject (result); string type = (string)sfjson.get ("result"); string customParams = (string)sfjson.get ("customParams"); if (APaymentHelper.LoginResult.LOGOUT == type) { str = "login result = logout" + customParams; onLogout(); user = null; if (!isDebug) { bLogined = false; } //Invoke("doLogin", 0.2f); } else if (APaymentHelper.LoginResult.LOGIN_SUCCESS == type) { SFJSONObject userinfo = (SFJSONObject)sfjson.get ("userinfo"); if (userinfo != null) { long id = long.Parse ((string)userinfo.get ("id")); string channelId = (string)userinfo.get ("channelid"); string ChannelUserId = (string)userinfo.get ("channeluserid"); string UserName = (string)userinfo.get ("username"); string Token = (string)userinfo.get ("token"); string ProductCode = (string)userinfo.get ("productcode"); DisplayMap.mPid = channelId; Debug.Log ("## id:" + id + " channelId:" + channelId + " ChannelUserId:" + ChannelUserId + " UserName:" + UserName + " Token:" + Token + " ProductCode:" + ProductCode); } StartCoroutine( _DoSdkLogin( DisplayMap.mPid, userinfos ) ); str = "login result = login success" + customParams; //LoginCheck (); } else if (APaymentHelper.LoginResult.LOGIN_FAILED == type) { str = "login result = login failed" + customParams; } } //登录验证接口 public string YijiesdkUserID; public string userName; public IEnumerator _DoSdkLogin( string mPid, string msg ) { var formdata = new WWWForm(); formdata.AddField( "pid", mPid ); formdata.AddField( "yijiedata", msg ); var www = new WWW( LoginUrl, formdata ); Debug.Log( "访问地址:" + www.url ); while( !www.isDone ) { yield return null; } if( www.error == null ) { JsonData jsonData = JsonMapper.ToObject( www.text ); Debug.Log( "data" + jsonData ); string reuslt = jsonData["r"].ToString(); string username = jsonData["prefix"].ToString(); YijiesdkUserID = jsonData["sdkUserID"].ToString(); Debug.Log( "sdkuserid" + YijiesdkUserID ); if( reuslt == "fail" ) { Global.Alert( "验证失败,请确认您的账号!" ); } else if( reuslt == "success" ) { Debug.Log( "返回成功!" ); userName = username + "_" + YijiesdkUserID; UIMsgReceive.instance.XiguSDKAndroidLoginButton(); //游戏登录接口 } } } //易接Androidsdk EnterGame接口 /*IntPtr context, string roleId,string roleName, string roleLevel, string zoneId, string zoneName*/ public void onEnterGame() { SFJSONObject gameinfo = new SFJSONObject(); gameinfo.put( "roleId", YijiesdkUserID ); //当前登录的玩家角色ID,必须为数字 gameinfo.put( "roleName", DisplayMap.playername ); //当前登录的玩家角色名,不能为空,不能为null gameinfo.put( "roleLevel", "1" ); //当前登录的玩家角色等级,必须为数字,且不能为0,若无,传入1 gameinfo.put( "zoneId", DisplayMap.mServerId ); //当前登录的游戏区服ID,必须为数字,且不能为0,若无,传入1 gameinfo.put( "zoneName", DisplayMap.mServerName ); //当前登录的游戏区服名称,不能为空,不能为null gameinfo.put( "balance", Global.mInterClient.mMainCharacter.mVCoin.ToString() ); //用户游戏币余额,必须为数字,若无,传入0 gameinfo.put( "vip", "1" ); //当前用户VIP等级,必须为数字,若无,传入1 gameinfo.put( "partyName", "无帮派" );//当前角色所属帮派,不能为空,不能为null,若无,传入“无帮派” gameinfo.put( "roleCTime", DisplayMap.createtime ); //单位为秒,创建角色的时间 Debug.Log( "创建角色时间" + DisplayMap.createtime ); gameinfo.put( "roleLevelMTime", DisplayMap.servertime ); //单位为秒,角色等级变化时间 using( AndroidJavaClass unityPlayer = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) { Debug.Log( "onterGame" ); using( AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>( "currentActivity" ) ) { setRoleData( curActivity.GetRawObject(), YijiesdkUserID, DisplayMap.playername, "1", DisplayMap.mServerId, DisplayMap.mServerName ); Debug.Log( "setRoleData接口调用完毕" ); setData( curActivity.GetRawObject(), "enterServer", gameinfo.toString() ); Debug.Log( "enterGame接口调用完毕" ); } } } //易接角色升级接口 public void onUpdateGame(string updadelevel) { SFJSONObject gameinfo = new SFJSONObject(); gameinfo.put( "roleId", YijiesdkUserID ); //当前登录的玩家角色ID,必须为数字 gameinfo.put( "roleName", DisplayMap.playername ); //当前登录的玩家角色名,不能为空,不能为null gameinfo.put( "roleLevel", updadelevel ); //当前登录的玩家角色等级,必须为数字,且不能为0,若无,传入1 gameinfo.put( "zoneId", DisplayMap.mServerId ); //当前登录的游戏区服ID,必须为数字,且不能为0,若无,传入1 gameinfo.put( "zoneName", DisplayMap.mServerName ); //当前登录的游戏区服名称,不能为空,不能为null gameinfo.put( "balance", Global.mInterClient.mMainCharacter.mVCoin.ToString() ); //用户游戏币余额,必须为数字,若无,传入0 gameinfo.put( "vip", "1" ); //当前用户VIP等级,必须为数字,若无,传入1 gameinfo.put( "partyName", "无帮派" );//当前角色所属帮派,不能为空,不能为null,若无,传入“无帮派” gameinfo.put( "roleCTime", DisplayMap.createtime ); //单位为秒,创建角色的时间 Debug.Log( "创建角色时间" + DisplayMap.createtime ); gameinfo.put( "roleLevelMTime", DisplayMap.servertime ); //单位为秒,角色等级变化时间 using( AndroidJavaClass unityPlayer = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) { Debug.Log( "onupdateGame" ); using( AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>( "currentActivity" ) ) { setData( curActivity.GetRawObject(), "levelup", gameinfo.toString() ); Debug.Log( "update接口调用完毕" ); } } } //易接支付接口 public void Pay(int unitPrice,int count,string callBackInfo ) { using( AndroidJavaClass unityPlayer = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) { Debug.Log( "paypppppppppppppp" ); using( AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>( "currentActivity" ) ) { pay( curActivity.GetRawObject(), "U8SDKhelper", unitPrice, "元宝", count, callBackInfo, CP_PAY_SYNC_URL, "PayResult" ); Debug.Log( "易接支付接口调用完毕" ); } } } // 支付监听函数 void PayResult( string result ) { Debug.Log( "------------PayResult=" + result ); SFJSONObject sfjson = new SFJSONObject( result ); string type = (string)sfjson.get( "result" ); string data = (string)sfjson.get( "data" ); if( APaymentHelper.PayResult.PAY_SUCCESS == type ) { str = "pay result = pay success " + data; Global.Alert( "支付成功!" ); } else if( APaymentHelper.PayResult.PAY_FAILURE == type ) { str = "pay result = pay failure" + data; Global.Alert( "支付失败!" ); } else if( APaymentHelper.PayResult.PAY_ORDER_NO == type ) { str = "pay result = pay order No" + data; } } //ExitResult 退出监听函数 void ExitResult (string result) { Debug.Log ("------------ExitResult=" + result); SFJSONObject sfjson = new SFJSONObject (result); string type = (string)sfjson.get ("result"); string data = (string)sfjson.get ("data"); if (APaymentHelper.ExitResult.SDKEXIT == type) { //SDK退出 if(data.Equals("true")) { Application.Quit(); } else if(data.Equals("false")) { } } else if (APaymentHelper.ExitResult.SDKEXIT_NO_PROVIDE == type) { //游戏自带退出界面 Application.Quit(); } } /*切换账号回调*/ void onLogout() { Debug.Log( "调用onLogout" ); Msgparam msg = new Msgparam(); msg.msgType = UIMsgType.BACKLOGIN; Global.uiMsgReceive.uiToui( msg ); DisplayMap.mIsAutoLogin = false; YijieLogin(); } /*onLoginSuccess*/ void onLoginSuccess( string result ) { Debug.Log( "调用onLoginSuccess" ); Msgparam msg = new Msgparam(); msg.msgType = UIMsgType.BACKLOGIN; Global.uiMsgReceive.uiToui( msg ); DisplayMap.mIsAutoLogin = false; LoginResult( result ); Debug.Log( "onLoginSuccess切换账号调用完毕" ); } void Awake () { Debug.Log( "1111111111111111111111111" ); Instance = this; Debug.Log( "login 00000" ); using( AndroidJavaClass unityPlayer = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" ) ) { Debug.Log( "login 111111" ); using( AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>( "currentActivity" ) ) { setLoginListener( curActivity.GetRawObject(), "U8SDKhelper", "LoginResult" ); Debug.Log( "setloginlistener" ); } } #region 111111111 goodName = PlayerPrefs.GetString ("goodName", ""); money = PlayerPrefs.GetInt ("money", 0); string itemCode = PlayerPrefs.GetString ("goodid", ""); string remain = PlayerPrefs.GetString ("remain", ""); Debug.Log ("itemCode=" +itemCode+" remain="+remain); bLogined = PlayerPrefs.GetInt ("login", 0) == 0 ? false : true; keyName = PlayerPrefs.GetString ("keyName",""); if(goodName.Equals("") || money == 0) { desc = ""; paytype = ""; } else { desc = PlayerPrefs.GetString ("desc", ""); paytype = PlayerPrefs.GetString ("paytype", ""); } if(keyName.Equals("")){ setDataType = ""; }else{ setDataType= PlayerPrefs.GetString ("setDataType", ""); } PlayerPrefs.DeleteAll(); if (Application.platform == RuntimePlatform.Android) { using (AndroidJavaClass unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { using (AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { //setLoginListener(curActivity.GetRawObject (), "U8SDKhelper", "LoginResult"); Debug.Log ("Awake setDataType:" + setDataType); if (bLogined == true) { Debug.Log ("Alogin result = login success" ); str = "login result = login success"; if (paytype.Equals (PAYTYPE_PAY)) { str = "PAYTYPE_PAY"; pay (curActivity.GetRawObject (), "U8SDKhelper", money, goodName, 1, desc, CP_PAY_SYNC_URL, "PayResult"); } else if (paytype.Equals (PAYTYPE_CHARGE)) { str = "PAYTYPE_CHARGE"; charge (curActivity.GetRawObject (), "U8SDKhelper", goodName, money, 1, desc, CP_PAY_SYNC_URL, "PayResult"); } else if(paytype.Equals (PAYTYPE_PAY_EXTEND)){ str = "PAYTYPE_PAY_EXTEND"; payExtend (curActivity.GetRawObject (), "U8SDKhelper", money, goodName, itemCode, remain, 1, desc, CP_PAY_SYNC_URL, "PayResult"); }else if(setDataType.Equals(PAYTYPE_ROLE)){ str = "PAYTYPE_ROLE"; SFJSONObject gameinfo = new SFJSONObject(); gameinfo.put("roleId", "1");//当前登录的玩家角色ID,必须为数字 gameinfo.put("roleName", "猎人");//当前登录的玩家角色名,不能为空,不能为null gameinfo.put("roleLevel", "100");//当前登录的玩家角色等级,必须为数字,且不能为0,若无,传入1 gameinfo.put("zoneId", "1");//当前登录的游戏区服ID,必须为数字,且不能为0,若无,传入1 gameinfo.put("zoneName", "阿狸一区");//当前登录的游戏区服名称,不能为空,不能为null gameinfo.put("balance", "0"); //用户游戏币余额,必须为数字,若无,传入0 gameinfo.put("vip", "1"); //当前用户VIP等级,必须为数字,若无,传入1 gameinfo.put("partyName", "无帮派");//当前角色所属帮派,不能为空,不能为null,若无,传入“无帮派” gameinfo.put("roleCTime", "21322222"); //单位为秒,创建角色的时间 gameinfo.put("roleLevelMTime", "54456556"); //单位为秒,角色等级变化时间,如果没有就传-1 setData(curActivity.GetRawObject (),keyName,gameinfo.toString());//创建新角色时调用,必接接口 } } Debug.Log ("user had payed str:" + str); } } } isPause = false; isFocus = false; Debug.Log( "pay11111111111111111111111111111" ); #endregion } void LoginCheck () { if (isDebug == true) { bLogined = true; return; } string url = createLoginURL (); Debug.Log ("LoginCheck url:" + url); if (url == null) return; string result = executeHttpGet (url); Debug.Log ("LoginCheck result:" + result); if (result == null || !(result == "SUCCESS")) { bLogined = false; } else { bLogined = true; using (AndroidJavaClass unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { using (AndroidJavaObject curActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity")) { setRoleData (curActivity.GetRawObject (), "1", "hunter", "30", "1", "1"); SFJSONObject gameinfo = new SFJSONObject(); gameinfo.put("roleId", "1");//当前登录的玩家角色ID,必须为数字 gameinfo.put("roleName", "猎人");//当前登录的玩家角色名,不能为空,不能为null gameinfo.put("roleLevel", "100");//当前登录的玩家角色等级,必须为数字,且不能为0,若无,传入1 gameinfo.put("zoneId", "1");//当前登录的游戏区服ID,必须为数字,且不能为0,若无,传入1 gameinfo.put("zoneName", "阿狸一区");//当前登录的游戏区服名称,不能为空,不能为null gameinfo.put("balance", "0"); //用户游戏币余额,必须为数字,若无,传入0 gameinfo.put("vip", "1"); //当前用户VIP等级,必须为数字,若无,传入1 gameinfo.put("partyName", "无帮派");//当前角色所属帮派,不能为空,不能为null,若无,传入“无帮派” gameinfo.put("roleCTime", "21322222"); //单位为秒,创建角色的时间 gameinfo.put("roleLevelMTime", "54456556"); //单位为秒,角色等级变化时间,如果没有就传-1 setData(curActivity.GetRawObject (),"createrole",gameinfo.toString());//创建新角色时调用,必接接口 setData(curActivity.GetRawObject (),"levelup",gameinfo.toString());//玩家升级角色时调用,必接接口 setData(curActivity.GetRawObject(),"enterServer",gameinfo.toString());//选择服务器进入时调用,必接接口 setData(curActivity.GetRawObject(),"loginGameRole",gameinfo.toString());////这个接口只有接uc的时候才会用到和setRoleData一样的功能,但是两个放在一起不会出现冲突,必接接口 } } } } private string createLoginURL () { if (user == null) { return null; } StringBuilder builder = new StringBuilder (); builder.Append (CP_LOGIN_CHECK_URL); builder.Append ("?app="); builder.Append (ToUrlEncode (user.getProductCode ()));//(Base64.EncodeBase64(user.getProductCode())); builder.Append ("&sdk="); builder.Append (ToUrlEncode (user.getChannelId ()));//(Base64.EncodeBase64(user.getChannelId())); builder.Append ("&uin="); builder.Append (ToUrlEncode (user.getChannelUserId ()));//(Base64.EncodeBase64(user.getChannelUserId())); builder.Append ("&sess="); builder.Append (ToUrlEncode (user.getToken ()));//(Base64.EncodeBase64(user.getToken())); return builder.ToString (); } public void addOrderId (string orderId) { if (isDebug) { return; } OderId id = new OderId (); id.retry = 0; id.orderId = orderId; orderIds.Add (id); if (isQuerying) return; query (); } public void query () { doQuery (); } public void doQuery () { if (orderIds != null) {//orderIds != null OderId oderId = (OderId)orderIds [0]; if ((object)oderId != null) { if (oderId.retry > 10) { orderIds.RemoveAt (0); } oderId = (OderId)orderIds [0]; if (oderId.Equals (null)) return; oderId.retry++; String str = createQueryURL (oderId.orderId); if (str == null) { String result = "SUCCESS";//executeHttpGet(str); if (result == null || !(result == "SUCCESS")) { } else { orderIds.RemoveAt (0); Debug.Log ("user had payed oderId:" + oderId.orderId); } } if (orderIds.Count != 0) { query (); } } } } public static string executeHttpGet (string str) { WebClient myWebClient = new WebClient (); //myWebClient.Headers.Add("Content-Type", "multipart/form-data; "); byte[] b = myWebClient.DownloadData (str); return (Encoding.UTF8.GetString (b)); } public string HexToStr (string mHex) // 返回十六进制代表的字符串 { mHex = mHex.Replace (" ", ""); if (mHex.Length <= 0) return ""; byte[] vBytes = new byte[mHex.Length / 2]; for (int i = 0; i < mHex.Length; i += 2) if (!byte.TryParse (mHex.Substring (i, 2), NumberStyles.HexNumber, null, out vBytes [i / 2])) vBytes [i / 2] = 0; return ASCIIEncoding.Default.GetString (vBytes); } /* HexToStr */ public string StrToHex (string mStr) //返回处理后的十六进制字符串 { return BitConverter.ToString (ASCIIEncoding.Default.GetBytes (mStr)).Replace ("-", ""); } public static string ToUrlEncode (string strCode) { StringBuilder sb = new StringBuilder (); byte[] byStr = System.Text.Encoding.UTF8.GetBytes (strCode); //默认是System.Text.Encoding.Default.GetBytes(str) System.Text.RegularExpressions.Regex regKey = new System.Text.RegularExpressions.Regex ("^[A-Za-z0-9]+$"); for (int i = 0; i < byStr.Length; i++) { string strBy = Convert.ToChar (byStr [i]).ToString (); if (regKey.IsMatch (strBy)) { //是字母或者数字则不进行转换 sb.Append (strBy); } else { sb.Append (@"%" + Convert.ToString (byStr [i], 16)); } } return (sb.ToString ()); } }
3、游戏对接以上接口,打包安卓工程导入到eclipse,并添加易接sdk相关文件
注意:需将libs原来的armeabi-v7a删除,用易接的
4、在安卓工程的unityPlayerActivity.java添加代码
import com.snowfish.cn.ganga.helper.SFOnlineHelper; @Override protected void onStop() { super.onStop(); SFOnlineHelper.onStop(this); } // Quit Unity @Override protected void onDestroy () { mUnityPlayer.quit(); super.onDestroy(); SFOnlineHelper.onDestroy(this); } // Pause Unity @Override protected void onPause() { super.onPause(); mUnityPlayer.pause(); SFOnlineHelper.onPause(this); } // Resume Unity @Override protected void onResume() { super.onResume(); mUnityPlayer.resume(); SFOnlineHelper.onResume(UnityPlayerActivity.this); } @Override protected void onRestart() { super.onRestart(); SFOnlineHelper.onRestart(this); }
示例工程代码
package com.youxihui.lxsc; import com.snowfish.cn.ganga.helper.SFOnlineHelper; import com.unity3d.player.*; import android.app.Activity; import android.content.res.Configuration; import android.graphics.PixelFormat; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.Window; import android.view.WindowManager; public class UnityPlayerActivity extends Activity { protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code // Setup activity layout @Override protected void onCreate (Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); //SFOnlineHelper.onCreate(this); getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy mUnityPlayer = new UnityPlayer(this); setContentView(mUnityPlayer); mUnityPlayer.requestFocus(); } @Override protected void onStop() { super.onStop(); SFOnlineHelper.onStop(this); } // Quit Unity @Override protected void onDestroy () { mUnityPlayer.quit(); super.onDestroy(); SFOnlineHelper.onDestroy(this); } // Pause Unity @Override protected void onPause() { super.onPause(); mUnityPlayer.pause(); SFOnlineHelper.onPause(this); } // Resume Unity @Override protected void onResume() { super.onResume(); mUnityPlayer.resume(); SFOnlineHelper.onResume(UnityPlayerActivity.this); } @Override protected void onRestart() { super.onRestart(); SFOnlineHelper.onRestart(this); } // This ensures the layout will be correct. @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mUnityPlayer.configurationChanged(newConfig); } // Notify Unity of the focus change. @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); mUnityPlayer.windowFocusChanged(hasFocus); } // For some reason the multiple keyevent type is not supported by the ndk. // Force event injection by overriding dispatchKeyEvent(). @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_MULTIPLE) return mUnityPlayer.injectEvent(event); return super.dispatchKeyEvent(event); } // Pass any events not handled by (unfocused) views straight to UnityPlayer @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return mUnityPlayer.injectEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } /*API12*/ public boolean onGenericMotionEvent(MotionEvent event) { return mUnityPlayer.injectEvent(event); } }
5、在安卓工程中找到目录下:res/values/string.xm l文件 修改为
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">烈血沙城</string> <string name="zy_class_name">com.youxihui.lxsc.UnityPlayerActivity</string> </resources>
6、修改安卓工程中的 AndroidManifest.xml 文件
6 .1、在AndroidManifest.xml 文件中添加如下配置
扫描二维码关注公众号,回复:
1047761 查看本文章
android:name="com.snowfish.cn.ganga.helper.SFOnlineApplication" <activity android:name="com.youxihui.lxsc.SplashActivity" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.MAIN" /> /**/ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <service android:name="com.snowfish.a.a.s.ABGSvc" android:enabled="true" android:process="com.snowfish.a.a.bg" > <intent-filter> <action android:name="com.snowfish.a.a.s.ABGSvc" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <meta-data android:name="com.snowfish.appid" android:value="{63C665D8-4BAA3096}" > </meta-data> <meta-data android:name="com.snowfish.channelid" android:value="{4ff036a1-3254eafe}" > </meta-data> <meta-data android:name="com.snowfish.customer" android:value="SNOWFISH" > </meta-data> <meta-data android:name="com.snowfish.channel" android:value="SNOWFISH" > </meta-data> <meta-data android:name="com.snowfish.sdk.version" android:value="1" > </meta-data>
6.2、添加后的示例AndroidManifest.xml 文件
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.youxihui.lxsc" android:installLocation="auto" android:versionCode="3" android:versionName="1.1.1" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="22" /> <application android:allowBackup="true" android:debuggable="false" android:icon="@drawable/app_icon" android:isGame="true" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:name="com.snowfish.cn.ganga.helper.SFOnlineApplication" > <activity android:name="com.youxihui.lxsc.SplashActivity" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.MAIN" /> /**/ <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <activity android:name="com.youxihui.lxsc.UnityPlayerActivity" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale" android:label="@string/app_name" android:launchMode="singleTask" android:screenOrientation="landscape" > <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> <!-- RendererLoader --> <activity android:name="com.aifeng.library.RendererLoader" android:theme="@android:style/Theme.Translucent" /> <!-- Polling Service --> <service android:name="com.ryantang.rtpollingdemo.PollingService" > <intent-filter> <action android:name="com.ryantang.service.PollingService" /> </intent-filter> </service> <service android:name="com.snowfish.a.a.s.ABGSvc" android:enabled="true" android:process="com.snowfish.a.a.bg" > <intent-filter> <action android:name="com.snowfish.a.a.s.ABGSvc" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </service> <meta-data android:name="com.snowfish.appid" android:value="{63C665D8-4BAA3096}" > </meta-data> <meta-data android:name="com.snowfish.channelid" android:value="{4ff036a1-3254eafe}" > </meta-data> <meta-data android:name="com.snowfish.customer" android:value="SNOWFISH" > </meta-data> <meta-data android:name="com.snowfish.channel" android:value="SNOWFISH" > </meta-data> <meta-data android:name="com.snowfish.sdk.version" android:value="1" > </meta-data> </application> <uses-feature android:glEsVersion="0x00020000" /> <uses-feature android:name="android.hardware.gamepad" android:required="false" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> </manifest>
7、完成以上操作后,安卓工程的可能会有一些红色报错现象,此时左键选中我们的工程后,左键点击Project下的clean。
8、完成以上操作开始打易接母包
9、打包完成后,可以在安卓工程目录:bin文件下找到易接母包,拿到易接母包后用易接的打包工具进行打渠道包。