2017-02-04 13:58:38 qq_28153461 阅读数 1049
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

第一次很正式的写csdn博客,很紧张的,也知道自己上升的空间很大,进入一个初创2年的游戏公司快半年了,这半年一直都在忙的是一个unity接入iOS SDK 自己所处的部门是发行部,而不是做游戏的,是替游戏做的SDK以及游戏接入SDK等部分都是我和我的主管完成,我们SDK这边主要完成这几大功能1.登录,2.登出,3.用户中心 4. 支付,5.退出。

1.登录:游戏点击登录 --> SDK登录去服务器获取唯一的token值 --> 登录成功回调给游戏 --> 游戏收到回调给SDK返回角色之类的额外信息(角色ID,角色名,服务器ID,服务器名等等)

其中需要提到的主要关键点:1.1.游戏unity(c#)调用iOS需要一个API接口或者是一个静态库文件,比如:其中的一个登录的接口


1.2当登录成功的时候,回调给游戏,需要用到UnitySendMessage方法

其中第一个参数是objectName是游戏的objName,第二个参数是游戏回调的方法,第三个参数是回调方法的需要传入的参数

1.3设置角色的额外信息 :当游戏收到登录成功的回调后会给SDK发送角色的信息。


1.4 SDK收到游戏发送过来的消息,保存这些角色信息,方便以后支付的时候调用

2.登出:就是一个账号切换。

2.1游戏调用登出接口


2.2 SDK走登出


3.用户中心:用户中心含有用户的信息,以及更换手机号码和更换密码等功能,也没有和游戏有交互。

3.1游戏调用用户中心接口


3.2SDK走用户中心


4.支付:4.1游戏调用支付的API以及传入必要的参数,例如:产品名,产品ID,数量,总金额,回调链接等等


4.2 SDK收到支付请求到服务器去创建订单,再去调用支付接口。


4.3再拿到支付结果回调给游戏

5.退出:退出需要看游戏方有没有退出这个功能,没有的话(此处应该给SDK一个bool值方便判断),SDK要提供一个退出的接口,

5.1 例如提供一个接口说明是否有退出


5.2 退出


2015-04-09 22:04:25 yatyfornetuse 阅读数 1546
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

环境:
Windows 8.1 x64
Eclipse Luna
Unity3D 4.6 / 5.0
MMBilling 3.1.3

2015-04-20

折腾了很久, 实际上仍未解决问题, 直到上周找到高人指点, 才发现没有那么多繁琐的步骤, 步骤如下:

  • 右键点击你的安卓SDK工程, 导出jar文件.
    1

  • 将导出的jar放到Unity工程里面, 路径为\Assets\Plugins\Android\bin

  • 在Unity工程里面, 导出Android Project, 要勾选Google Android Project, 下边的Build按钮才会变成Export
    2

  • 随便选个路径放着, 反正是临时用.

  • 在Eclipse里面导入刚才在Unity下面导出的工程
    3

  • 等Eclipse自动编译好, 直接运行, 大功告成.

几点

  • 要从Unity导出安卓工程, 然后在其它环境下编译
  • 不用手动解包, 复制资源等等
  • 如果有奇怪的BUG, 不妨自己重新开一个新的, 因为笔者在前程序哥的基础上, 无论怎么折腾都不行, 之前我们是安卓工程里面接了一大堆安卓SDK, Unity工程里面接了一大堆Unity SDK, 无论用什么方法, 包括导出工程的方法, 都会遇到奇奇怪怪的问题. 于是笔者在浪费了2天时间之后, 决定把当前项目需要的SDK重新写一遍, 并且一律使用安卓SDK, 目前一起接入的只有MM SDK和Talking Data, 然后问题就这样没了. 虽然之前出错的原因没找到, 但是能确定的是, 问题出在以往接入的某个SDK里面, 我也无心去深究具体原因了, 万一某个SDK已经更新并且没BUG了呢… 这种问题, 只能长叹一口气啊!

以前的错误

1. 创建Handler的问题

在接移动的支付SDK时, 发现有一段代码执行不了

MMBillingHandler iapHandler = new MMBillingHandler(this.context);

我看了一下Handler类的文档, 没有发现它会主动抛出异常, 但是构造方法里面有这样一句话, 说明会抛RuntimeException

Default constructor associates this handler with the Looper for the current thread. If this thread does not have a looper, this handler won’t be able to receive messages so an exception is thrown.

于是尝试着抓一抓, 果然发现有问题, 并且是文档中说的looper的问题.

04-09 21:47:13.551: D/payment(18950): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
04-09 21:47:13.551: D/payment(18950):   at android.os.Handler.<init>(Handler.java:200)
04-09 21:47:13.551: D/payment(18950):   at android.os.Handler.<init>(Handler.java:114)
04-09 21:47:13.551: D/payment(18950):   at app.megagame.api.MMBillingHandler.<init>(MMBillingHandler.java:19)
04-09 21:47:13.551: D/payment(18950):   at app.megagame.api.MMBilling.<init>(MMBilling.java:58)
04-09 21:47:13.551: D/payment(18950):   at app.megagame.api.MainActivity.initMGPlugin(MainActivity.java:206)
04-09 21:47:13.551: D/payment(18950):   at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
04-09 21:47:13.551: D/payment(18950):   at com.unity3d.player.UnityPlayer.a(Unknown Source)
04-09 21:47:13.551: D/payment(18950):   at com.unity3d.player.UnityPlayer$a.run(Unknown Source)

有了异常信息, 接下来的事情就很好办了, 由于我们坚持面向Google编程, 面向Stackoverflow编程的原则, 就找到了如下内容

http://stackoverflow.com/questions/5009816/cant-create-handler-inside-thread-which-has-not-called-looper-prepare

The error is self-explanatory… doInBackground() runs on a background thread which, since it is not intended to loop, is not connected to a Looper.

虽然看起来和我的问题不太一致, 但是至少得出了我在不该创建Handler的地方创建了Handler的结论.

具体原因是我在Unity3D的一个脚本的void Start() { }里面调用了一段安卓代码, 而我在这段代码里面创建了Handler, 虽然不是很确定, 但是可以初步判断如此被调用的安卓代码是在后台线程执行的, 因此无法创建Handler, 最终抛出RuntimeException的异常.

最终我把创建Handler的相关代码直接放在了安卓Activity里面的onCreate方法里面, 问题解决.

2. 无法初始化

错误关键词:

failed to find resource file(CopyrightDeclaration.xml}
failed to find resource file(mmiap.xml}
failed to find resource file(VERSION}

java.lang.NullPointerException
    at org.kxml2.io.KXmlSerializer.writeEscaped(KXmlSerializer.java:96)
    at org.kxml2.io.KXmlSerializer.text(KXmlSerializer.java:536)
    at mm.purchasesdk.core.t.a(Unknown Source)
    at mm.purchasesdk.core.aa.b(Unknown Source)
    at mm.purchasesdk.core.s.loadCopyright(Unknown Source)
    at mm.purchasesdk.core.Purchase.loadCopyright(Unknown Source)
    at mm.purchasesdk.Purchase.createInfo(Unknown Source)
    at mm.purchasesdk.Purchase.init(Unknown Source)
    at app.megagame.api.MMBilling.<init>(MMBilling.java:77)
    at app.megagame.api.MainActivity.onCreate(MainActivity.java:150)
    at android.app.Activity.performCreate(Activity.java:5231)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2169)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2271)
    at android.app.ActivityThread.access$800(ActivityThread.java:144)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1205)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5146)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
    at dalvik.system.NativeStart.main(Native Method)

以上错误是因为Unity3D重新打包之后, MM SDK找不到原先要的文件了, 因此我们需要做如下事情.
安卓和Unity3D的通讯部分略.

  • 使用解压缩软件解压mmbilling.x.x.x.jar, 笔者使用的是3.1.3版本.
  • assets/mmiap目录复制到Unity3D工程的Assets/Plugins/Android/assets里面
  • 使用Unity3D build apk.
  • 因为打出的apk里面缺失文件, 因此会在运行时报错
    • 使用7z打开apk
    • 删掉里面的META-INF解除签名
    • 添加从mmbilling.x.x.x.jar里面解出来的mmiap.xml, CopyrightDeclaration.xml, VERSION3个文件
    • 签名

因为过程繁琐, 十分不利于DEBUG, 因此我写了个脚本, 放在Eclipse里面的External Tools里面, 方便使用

@echo off
echo Unsigning ...
"C:\Program Files\7-Zip\7z.exe" d "D:\Projects\MGPluginUnity\mgplugin.apk" "META-INF" -r
echo OK!
echo Adding MM Billing files ...
"C:\Program Files\7-Zip\7z.exe" u "D:\Projects\MGPluginUnity\mgplugin.apk" "D:\SDK\China Mobile\Keng\*"
echo OK!
echo Signing ...
"C:\Program Files\Java\jdk1.8.0_25\bin\jarsigner.exe" -sigalg SHA1withRSA -digestalg SHA1 -keystore "签名文件路径.???" -storepass 签名密码 -keypass 签名密码 -signedjar "D:\Projects\MGPluginUnity\mgplugin.apk" "D:\Projects\MGPluginUnity\mgplugin.apk" 签名文件的文件名
echo OK!

最后整好的apk包结构
1

  • META-INF是需要你删掉, 然后重新签名生成的.
  • 绿色标记的文件就是之前缺失的

该脚本简单易懂, 请读者自行修改7z.exe, apk文件, 签名文件密码的路径和参数. 如果有好压, 用好压应该也行. (话说好压是笔者的唯一一个在当年使用盗版xp时, 被预装, 没被我卸载, 然后还喜欢上了的软件)

我的签名命令是找同事要的, 具体参数我也不知道怎么配, 如果我给的jarsigner命令不好用, 请读者自行搜索.

参考:
对我有用: http://www.tuicool.com/articles/I73QFb
最早搜到的, 也是网上转载最多的: http://www.j2megame.com/html/xwzx/ty/4164.html
7z API: http://www.dotnetperls.com/7-zip-examples
好压API: http://haozip.2345.com/help/help11-1.htm
Unity3D接入移动MM支付SDK全攻略(后来发现的, 加进来): http://www.bubuko.com/infodetail-252598.html

2015-06-30 16:55:50 qq_16562625 阅读数 1441
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

近来试着接入了微信的SHARE SDK 但是一直都有问题 回调没有响应 或者是在实机运行的时候不能分享第二次 或者返回远程 等等问题...我也不太懂JAVA部分 只能天天和他们的技术人员聊天...最后终于都解决了....于是决定同样困扰的人们分享一下...

那么简单讲一下流程

1.在你项目中导入SHARE SDK (废话)

(这里会有一个问题 那就是Plugins文件夹中 安卓部分会有一个AndroidManifest 安卓的配置文件 如果你使用其它的安卓SDK的话 也可能有这个配置文件....能合并的话..就尽力合并吧)

2.在需要应用的场景里添加SHARESDK.cs(废话)

3.在你的脚本中调用响应的分享方法和回调(APP ID啥先用默认的或者其他人的)

(把Plugins\Android\assets下的ShareSDK.xml 中设置为跳过审核 BypassApproval的值设为 true)

 )

4.先将其打包成APP安装到手机上( 用微信开放平台上提供的程序签名APP(也是安装到手机上)用它在手机上获取你的APP的签名)

5.在微信开放平台上注册你的APP 注意程序的包名和签名 一定要是符合的(这是之后不跳过审核的关键)(APP https://open.weixin.qq.com/)

6.耐心等待通过获取了APP ID

7.把所有的APPID 和APPSECRET都替换成你的 并且不再跳过审核

8最关键一步 在Eclipse中 将三个包中.wxapi后缀的包的前面包名改为你APP的包名 重新打包为demo.jar替换Plugins\Android\libs下的同名文件


如果大家对分享的调用还有问题可以去参考雨松大大以前写的微信分享调用的例子

这样一来微信分享的功能就可以玩完美了(大概) 如果有错误还希望大家指出......和大家交流 

2014-01-13 16:05:55 u013362628 阅读数 4087
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。


  • 先将例程运行起来
    • 下载例程(csdn积分不够上传不了,只能用百度网盘):http://pan.baidu.com/s/1gd7PrxD
    • 打开unity工程mm_pay_unity
    • build apk包至工程目录\Assets\plugin_pay_mm\Tools\AndroidMultitool\Program_Files\app_temp.apk  (注意apk包名字)
    • 运行\Assets\plugin_pay_mm\Tools\AndroidMultitool\Program_Files\目录下的pack.bat
    • 得到最终包 app_signed.apk


  • 嵌入到项目中
    • 将例程(mm_pay_unity)中的Plugins和StreamingAssets目录下所有内容复制到项目
    • 修改Assets\Plugins\AndroidManifest.xml中的pack标识 (com.easygame.paymmSample) 为你项目的。

                               (共三处)

    • 用eclipse打开例程(mm_pay_eclipse)
    • 将包重命名成你项目的pack标识

    • 修改PayWrapper_mm文件中的APPID,APPKEY,LEASE_PAYCODE
    • 导出jar包(同时选中CustomUnityPlayerActivity,PayWrapper_mm)至unity目录

    • 按照例程的方式build,然后执行pack.bat即可


  • 注意事项
    • pack标识很重要,所有地方必须统一。

1)Unity中PlayerSetting中的


2)Unity工程中的Assets\Plugins\AndroidManifest.xml(三个地方,之前提及)

3)引用java类时


4)eclipse工程中的包名


    • unity中使用sample_pay_mm.cs的GameObject名字必须是PayWrapper_mm_Handler,只有这样mm-sdk才可以
回调Handler_PaySucceed,Handler_PayFailed函数。
    • mm-sdk动态链接库的文件必须放入armeabi-v7a(如放入armeabi会出错,官方已证实2.3的bug,注意查看)

    • 游戏资源数不能超过一定数量,技术群中说的是800左右(和大小无关,2.3已知bug)。
    • 本文旨在分享,绝无无任何恶意代码或程序,请放心。


  • 参考并感谢

http://blog.csdn.net/lihandsome/article/details/11919113

2013-09-23 09:46:08 lihandsome 阅读数 7871
  • Unity 值得看的500+ 技术内容列表

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

因为移动MM支付的SDK只提供android版本的,要自己写过一个android项目再打包重新生成一个jar来供Unity3d引擎使用,这一部分我就不写了,网上也提供很多的教程,主要是已经成功调用之后,会发生以下的错误:

1.failed to find resource file(mmiap.xml}

06-28 05:14:09.746: E/d(4709): failed to find resource file(mmiap.xml}
06-28 05:14:09.776: D/AndroidRuntime(4709): Shutting down VM
06-28 05:14:09.776: W/dalvikvm(4709): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
06-28 05:14:09.786: E/AndroidRuntime(4709): FATAL EXCEPTION: main
06-28 05:14:09.786: E/AndroidRuntime(4709): java.lang.NullPointerException
06-28 05:14:09.786: E/AndroidRuntime(4709): 
at mm.purchasesdk.d.a.a(Unknown Source)
06-28 05:14:09.786: E/AndroidRuntime(4709): 
at mm.purchasesdk.f.a(Unknown Source)
06-28 05:14:09.786: E/AndroidRuntime(4709): 
at mm.purchasesdk.Purchase.init(Unknown Source)

这个是因为重新打包过JAR之后,APK程序已经找不到原来的那几个xml文件了,需要把它提到apk外面,但也不能直接简单地解压加进去,一定要使用一定的工具。

工具有:apktool,aapt,jarsigner

但由于xda论坛的人在上几个月已经开发出新的apktool了,叫:AndroidMultitool,这个工具很好用,已经集成了上面所有的功能了,大家可以使用这个工具。好,废话不多说。


大概的流程是:

1,反编译APK

2,重新编译成APK

3,用aapt工具把CopyrightDeclaration.xml,mmiap.xml,VERSION这三个文件加到APK的根目录下面

4,把APK重新签名,成功!


下面就是对应的步骤:



至于第三步,就是在AndroidMultitool文件夹下面的Program_Files下面的aapt程序:



红色的就是我自己加进去的文件,要把他们加到run0.apk这个程序里面


其他的三个步骤我就不多说了,主要说一下第3个步骤:aapt工具的使用。

我们主要用到两个命令行(其他命令大家自己网上找吧,很强大的):

aapt.exe l run0.apk(这个命令是列出APK里面的资源文件目录)

aapt.exe a run0.apk mmiap.xml(这个命令是把mmiap.xml文件加入到run0.apk中)

当然,我们要加三个文件到里面,各个命令行就不详写了,大家自己写也行了。


搞定后就可以重新签名就成功了!




AndroidMultitool工具的下载,给一个链接给大家吧:http://forum.xda-developers.com/showthread.php?t=2326604

由于有人说在那个英文网站下载不了,补个CSDN的下载吧~不用积分~

http://download.csdn.net/detail/lihandsome/6582863


另外,也可以直接使用我自己写的批处理(懂的用就用批处理比较快):

del newtemp.apk
java -jar "apktool.jar" d -s -f temp.apk tmpAndroid
java -jar "apktool.jar"  b -f tmpAndroid run1.apk
rd /s /q tmpAndroid
aapt.exe a run1.apk mmiap.xml CopyrightDeclaration.xml VERSION
java -jar signapk.jar testkey.x509.pem testkey.pk8 run1.apk run_signed.apk
del run1.apk
zipalign.exe -v 4 run_signed.apk newtemp.apk
del run_signed.apk



另外:有人说发现了另外一个错误,就是读取不了MM扣费JAR包里面的图片资源,这个问题是因为Unity对APK打包的时候,把JAR包里面的资源封在里面了,解决办法是:

1,先解压JAR包,把里面的资源文件夹(mmiap这个文件夹)拿出来

2,在Unity项目的Assets文件夹的根目录下面新建一个StreamingAssets文件夹

3,把mmiap这个文件夹复制到StreamingAssets文件夹下面就可以了。

目录最后变成:\Assets\StreamingAssets\mmiap\image\vertical\下面的图片



转载请注明出处,谢谢。http://blog.csdn.net/lihandsome/article/details/11919113

没有更多推荐了,返回首页