记知易行难的一件事:我在InfoQ翻译的第一篇文章

所谓知易行难,这不仅仅是一个口语,而是源自切切实实生活的体验。 就在昨天,就在昨天,在IT业内赫赫有名的InfoQ网站发了我的第一篇译作: 《Google的员工如何使用其20%时间》。 clip_image002  记知易行难的一件事:我在InfoQ翻译的第一篇文章 clip image002 thumb   话说激动了好几个小时。 而激动之后,更多是思考!!! 俗话说,台上一分钟,台下十年功。短短2000字的翻译文字背后,沉浸了无数编辑的心血,如马国耀对全文的审校就多达四次: 从语法结构、中文措辞,甚至标点符号、的得地的用法……。 而在昨天早晨,在好译者QQ群里,又先后有多位编辑热心给予修订建议:感谢臧秀涛康锦龙李彬。 当你阅读一篇InfoQ文章时,通常这篇文章是InfoQ整个编辑团队的协力产物。 我接触InfoQ的源: 前年,我从北京回到西安后,苦于没有类似北京的IT圈子。偶然间找到QClub西安,随即就成了忠实的粉丝。组织者胡键每次来, 都会扛着QClub西安易拉宝大旗,无论寒冬腊月、还是酷暑夏天。刚开始,我很奇怪。 why?  于是乎,我顺着易拉宝上面的网址开始阅读InfoQ的文章,第一感觉是其编辑们很用心。大约过了1年,突然有一天,热血沸腾的鼓起勇气给InfoQ写了一封兼职编辑的自荐信,而后杨赛进行了考试:邮件试译。 而后就开始翻译了。 刚开始,觉得翻译不难,毕竟这么几年的电信行业编程经验,看过的.net英文资料、3GPP英文规范,加起来也得过百万了吧。 故,给自己初始定的目标是每周翻译2篇。 万万没有想到,仅仅翻译一篇就“晕”的吐血:1000字原文,翻译了24天—-8月23号认领,9月16号发布。 1. 看过文章 2. 看懂文章 3. 翻译文章 4. 让编辑校验你的文章 5. 让读者理解你的文章 这几个翻译的视角是非常不一样的,一个比一个要求高。可能,自己以前理解的“翻译”仅建立在业余读者的视角:没有人审阅、很少人阅读、基本无人反馈。而在InfoQ,你不仅仅是把文字翻译出来,要把原文作者的思想带出来;还要符合InfoQ的核心价值观。 我很高兴,在2013年秋天,能够认识InfoQ的一群尽心尽职的、用心用脑的编辑们。他(她)们教会我很多东西:写给别人看的东西,一定要慎之又慎、严谨,因为这里是InfoQ! ———————————————————————————————————————–

如果你要给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

[译] 开发者角度,王道之论:Android 与 Windows Phone

前几天,在codeproject搜索Silverlight资料,偶然看到这篇文章,耐心读了2遍,非常不错:文章通过访谈聊天形式叙述,2位主角目前在《斯法克斯国家工程学院》软件学院上学。

周五晚上,我给作者Houssem Dellai发gmail,咨询能否授权我翻译为中文,并发布。 3个小时后,他很爽快的回邮件说没有问题,给我一个原文链接就行。

英文原文地址: Android vs Windows Phone

———————————————————————————————————————————

作者目前在突尼斯,属于非洲北部一个小国家,人口1000万左右,约西安市人口的规模。

自我介绍

大家好,我是Houssem Dellai: 一名Windows Phone 开发者(译:他曾多次参加突尼斯Windows Phone编程挑战赛并屡屡获奖,且已获得微软Windows 8认证)。我身边的这位是我的同学Zied Jaballah: 他是Android 开发者 (译: 他已有3年Android开发经验).

我们一起曾在droidcon conference in tunis中做了一个session分享:从开发者的视角分别就Android和Windows Phone移动终端开发平台的几个方面问答。

Android和Windows Phone PK:

首先,我们通过应用商店,即一个移动终端开发者如何挣钱这个话题展开讨论;紧接着又讨论了手机终端支持情况。 然后,对IDE集成开发环境进行了分析: Visual Studio和Eclipse. 再然后,讨论了开发者最关注的模拟器。最后,我们又讨论了Google和微软对UI设计的规范要求。 结尾部分,又聊了一下平板电脑的话题。

1 – 应用商店

Houssem: 首先,让我们从应用商店开始讨论吧,看看Google为开发者做了些什么?

Zied: Google的应用商店叫 Google Play, 目前包含了近百万的app应用, 全球下载次数超过250亿次以上。那么,Houssem, 微软应用商店的情况如何?

Houssem: Windows Phone 应用商店目前有超过13万应用app. 虽然在数量远远不如Android商店的庞大, 但是,你可以找到你需要的所有应用app程序。

Zied: 开发者如要在google商店发布Android应用, 首先需要拥有一个 Google Play账号,申请注册费用为25刀。 那么,开发者申请一个微软的商店账号,需要多少钱?

Houssem: 在微软商店发布应用,有2类不同账号:开发者账号,需要49刀;还有一个是企业账号,需要99刀的费用。

Zied: 为了在Googe Play商店发布你的应用,你必须要通过Google的验证审核,这个过程很快,大约需要15到30分钟。 那么, 微软的应用审核策略呢?

Houssem: 微软商店的审核大约需要5天时间。 如果你的app被拒绝,你同样会受到一个审核错误报告,微软会告之你如何改进。 Zied! 我注意到你的PPT中提到了’恶意软件’ ?!!

Zied: 是的, 这不是笔误。Google play商店良莠不齐,有很多恶意软件, 这个可能是因为审核过程过快,且 Android开发者群体数量庞大导致的。 事实上,google已经认识到这个问题的严重性,并且出了一个新政策,它参考了微软和苹果的做法,即通过应用的使用反馈情况来代替审核制度,如:Google允许你发布你的应用app, 然后它会扫描app是否属于恶意软件。 在今年2月,Google创记录的从应用商店下架了6万款应用程序。

Houssem: 感谢上帝,在Windows Phone商店,你不会受到恶意软件侵扰,她值得信赖。

2 – 手机终端

Zied: Ok, 我们现在讨论手机终端吧。你知道Android阵营拥有数量庞大的终端吗? 这些是为数众多的手机厂商生产的,如我们耳熟能详的三星、LG、摩托罗拉等。(译:还包括HTC和华为、中兴) 这些手机终端,纵横了低端、中端、高端市场的不同的用户需求。那么Windows Phone手机的情况如何?

Houssem: 拥抱Windows Phone的手机厂商有诺基亚、三星、HTC、LG等等(译:还包括华为、中兴)。微软出于想给消费者以最佳体验品质,故对硬件比较挑剔, 所以,目前市场上的终端的售价都较高。

3 – 集成开发环境(IDE)

Houssem: 截止现在,我们讨论应用商店和手机终端, 下面接着讨论一下集成开发环境(IDE)吧。为了开发Windows Phone 8程序,你需要安装Visual Studio 2012,如免费的Express版。 那么Zied, 谈谈Eclipse吧?

Zied: Eclipse是Android程序员使用最多的IDE,免费且开源。呵呵,最重要的是,它没有太多的需求。( Zied望着Houssem乐了一下 :P ).

Houssem: 对于要通过VS 2012来开发WP8应用程序,确实对运行环境比较挑剔,或者说稍微有点困难吧。如,VS 2012要求操作系统和硬件必须达到最低配置:硬件需要支持能够安装虚拟环境; 操作系统的要求是Win 8 专业版或者企业版,Basic版本不支持,更重要的是,要求Win8操作系统是64位的。

Zied: 那么对你来说,能够满足WP8开发的必备条件, 你算是很幸运了。 但是, 对于Eclipse 来说,则更幸运:压根就不挑剔操作系统和硬件环境。 如,你只需要安装JVM虚拟机即可。事实上,只要能够安装JVM虚拟机,程序员可以在Windows、Mac、Linux等任何操作系统下用Eclipse开发Android应用程序。

Houssem: 众所周知,Visual Studio给程序员非常爽的体验,如:调试源码很容易、高效的编程能力、定位错方便误、修复问题非常快等等优势。

Zied: Houssem,在调试源码这一点上你获胜了, Visual Studio的的确确在调试上把Eclipse远远甩在后面。 但是,我更喜欢Ecipse数量众多的插件,通过这些插件的配合,你可以做得更出色。那么,VS有插件吗?

Houssem: 插件,Visual Studio当然有啦! VS也有大量的插件,且这些插件大部分开源。 你可以通过VS来搜索不同的插件,安装或升级来扩展Visual Studio的IDE。

4 – 模拟器

Houssem: Ok, 我们接着讨论下一个开发者关注的话题:模拟器.

Zied: Android 模拟器运行的不够快,我周围的很多开发者都饱受其害。但是,Google 对一些新机器,通过类似快照技术加速,目前看效果还不错。 如,这里还有一个模拟器开源项目Android x80, 其运行效率非常高,或许是Google模拟器的可选方案之一吧。让我们看看,微软为开发者在模拟器方面做了些什么?

Houssem: Windows Phone 模拟器运行效率非常高。她采用了hyper-v作为虚拟化环境,所以响应很及时。

5 – UI设计

Zied: Ok, 对比WP8的模拟器,Android确实显得力不从心。那么,微软的UI设计方面的支持情况如何呢?

Houssem: 呵呵, 我很欣赏你的坦率。Windows8采用了一种叫做现代UI设计的新的图形风格。它基于“内容胜过形式”的思路,这也意味着,编程开发者只需要把心思放在编码逻辑上,而不用太多注意主题、颜色、外形等。 这种UI设计有其严格的设计规范,但也有一些可复用的模板和控件,故UI可以被做的很漂亮。 如,作为WP8的程序员或者美工,你将会通过微软的expression Blend设计工具的做出最佳视觉效果。 Blend是一个IDE,专门为美工而生,即美工不用安装VS 这种程序员专属的IDE。 当程序员熟悉这些规则后,他将在一开始的时候不用美工。等程序demo成型后,在考虑美工介入提升UI设计、美化等。

Zied: 在Android这一侧,设计是程序员较头痛的一件事情。 你不得不写大量的XML去调整UI,拖拽的方式调试UI元素效果往往不好。 但是,一旦你精通XML的设计模式,则会爽翻天。Google也有自己的设计规范,只是没有微软这么严格罢了。

截止目前,我们讨论应用商店、IDE、设计规范、手机终端。 下面讨论一下平台电脑情况吧。

6 – 平板电脑

Houssem: Windows tablet平台没有运行WP的操作系统,它运行的是Windows RT,这是一种轻量级的Windows 8操作系统,专为平板电脑设计: 不能运行.exe程序, 仅只能运行Windows商店里面应用程序。但是,另外一种叫做Surface Pro平板可以运行
windows 8操作系统和.exe程序。

我猜测WP8有80%的API和Windows8 API相同。故,你可以很容易的在WP8和Windows 8之间共享代码。

Zied: Android操作系统不仅可运行在手机终端,也可以运行在平板电脑。从Android 3.0开始, Google新增了专门为大尺寸屏幕设计的API,故你可以开发专门适用于平板电脑的应用。其平板应用程序使用起来效果非常好。

总结

一般而言,这种讨论无法一决雌雄。某些方面,Windows Phone占据优势, 另外一方面说,Android获得胜利。至于谁是王者,这取决于你选择采用哪个平台,选择权在你。

[译] Unity3D游戏和facebook绑定(7.1 使用faceBook官方的PHP SDK)

原文链接:Using official Facebook PHP SDK

这篇文章通过facebook的PHP SDK登录unity3D游戏,进行facebook消息发布列子。

获得PHP的SDK,配置facebook的一个测试环境

如果你还没有下载最新SDK代码,可通过https://github.com/facebook/facebook-php-sdk下载。要运行下面的例子代码,你还需要配置正确的Application ID和密码。然后创建一个fb-skd-test.php的文件,在主文件目录下,拷贝如下的代码。确保appID和密码正确。

 'YOUR_APP_ID',
    'secret' => 'YOUR_APP_SECRET'
));

// delete session upon logout redirection
if (isset($_GET['logout']) && $_GET['logout'] == 'true') {
    session_destroy();                      // clears session cookie
    header('Location: ' . $self_url);       // redirects back to the same page
}

// get facebook user
$user = $facebook->getUser();

if ($user) {
    try {
        // try to access Facebook Graph to get user info
        $user_profile = $facebook->api('/me');
    } catch (FacebookApiException $e) {
        error_log($e);
        $user = null;
    }
}

if ($user) {
    // set custom logout url if user is logged in
    $logoutUrl = $facebook->getLogoutUrl(array(
        'next'=> $self_url . '?logout=true'
    ));
} else {
    // get log in url if user is NOT logged in
    $loginUrl = $facebook->getLoginUrl();
}
?>




';" >

';" >

这里不需多说,注释已经非常详细了。 这段代码可以让用户通过facebook账号登录、登出。

修改php文件结合前面JavaScript SDK的例子的那个

这部分涉及内容需要你了解Authorising user with Facebook JS SKD  (client-side) and Integration JavaScript and Unity3d code。 先前的例子,我们创建了文件名:fb-sdk-test.html文件,现在,我们动手把他通过使用file_get_contents()函数整合到PHP脚本中。 编辑fb-sdk-test.php文件修改如下代码






';" >

';" >

 

 

 

打开fb-sdk-test.html 文件,定位到如下代码:

 input type="button" id="fb-login" class="hidden" value="Log in with Facebook"/>

<input type=”button” id=”fb-login” class=”hidden” value=”Log in with Facebook”/>

替换为如下代码:

 input type="button" id="fb-login" class="hidden" value="Log in with Facebook (JS)"/>

<input type=”button” id=”fb-login” class=”hidden” value=”Log in with Facebook (JS)”/>

如果你现在要测试程序,第一次登陆截图如下:

unity-facebook-login-screen-2  [译] Unity3D游戏和facebook绑定(7.1 使用faceBook官方的PHP SDK) unity facebook login screen 2

通过PHP登录按钮出现了。 但是点击通过JS登录按钮,你被重定向到如下认证页面。即PHP登录按钮还在页面。 刷新页面,原因是英文先前JavaScript的PHP保存了用户信息在Session。 一般来说,你也不需要2个按钮同时出现,我们目前是测试。

unity-facebook-login-screen-2-error  [译] Unity3D游戏和facebook绑定(7.1 使用faceBook官方的PHP SDK) unity facebook login screen 2 error

获得faceBook账号的朋友列表和访问令牌access_token

通常情况下,可以获得默认facebook账号的基本用户信息,以及该用户的朋友列表信息。 为了实现这个目标,请打开fb-sdk-test.php文件,添加如下代码:

 if ($user) { try { // try to access Facebook Graph to get user friend list $user_friends = $facebook->api('/me/friends'); } catch (FacebookApiException $e) { error_log($e); } }

if ($user) {

try {

// try to access Facebook Graph to get user friend list

$user_friends = $facebook->api(‘/me/friends’);

} catch (FacebookApiException $e) {

error_log($e);

}

}

你或许需要获得访问令牌来实现更复杂的请求:

if ($user) { $access_token = $facebook->getAccessToken(); }

if ($user) {

$access_token = $facebook->getAccessToken();

}

请求当前用户更多的信息

需要获得当前用户更多信息,如email地址你需要询问而获得更多权限,另外如果你想通过游戏系统发布facebook的blog同样需要更多的权限。你需要花费点时间来了解一下权限的东西。有2种办法可以获得权限,你可在登录的时候获得全部权限,或者仅仅获得需要的权限。 这种体验相对较好。从用户视角出发这种方式简化操作步骤,并减少入侵危险。试着想象一下,一个陌生人询问你email地址而没有告诉你他要干什么,你会多么不爽。显然,你能通过网页读取一些隐私条保护条款会感觉舒服很多。这个采用在登录的时候获得更多的权限方式。打开你的fb-sdk-test.php文件,找到$loginUrl = $facebook->getLoginUrl()  替换为如下代码片段:

// get login url with permissions scope if user is NOT logged in $loginUrl = $facebook->getLoginUrl(array( ‘scope’ => ‘read_stream, email, read_stream, publish_actions’ ));

// get login url with permissions scope if user is NOT logged in

$loginUrl = $facebook->getLoginUrl(array(

‘scope’ => ‘read_stream, email, read_stream, publish_actions’

));

测试一下:首先在facebook权限里面删除之,然后再次刷新游戏登陆页面的URL,这时你会看到系统要求用户赋予更多权限。这个例子展示了访问用户的email邮箱,并发布一些信息到用户的首页。更多关于权限的参考facebook文档页面

通过facebook的SDK发布信息到用户首页

这一节说明如何发布样例信息到facebook上。 打开fb-sdk-test.php文件,找到$user=$facebook->getuser(); 粘贴下面的代码,一旦用户登录系统,则自动发布如下的样本信息了。

// check if user just logged in
if (isset($_GET['login']) && $_GET['login'] == 'true') {
    $attachment = array
    (
        //'link'=> 'http://developers.facebook.com/docs/reference/dialogs/',
        'message' => 'I have logged into MagicStones game by BevelGames.com',
        'picture'=> "http://www.bevelgames.com/games/magicstones/magicstones-icon.png",
        'name'=>"MagicStones",
        'link' => "http://bevelgames.com/games/magicstones/",
        'caption'=>"Only game you ever need to relax",
        'description'=> "Relax and unwind by moving stones and collecting points. Compete with friends and share your score.",
        'actions' => json_encode(array(
            'link'=> "http://bevelgames.com/games/magicstones/",
            'name' => 'Play MagicStones'
        ))
    );

    $result = $facebook->api('/me/feed/','post',$attachment);
}

 

让这个代码起作用,你需要确保仅仅是用户通过facebook账号第一次登陆游戏也没, 或者用户自己撤销房屋游戏页面后再次继续玩游戏。 这yeshiva为什么我们监测if预计判断”login”参数。 替换如下代码:

// get login url with permissions scope if user is NOT logged in
$loginUrl = $facebook->getLoginUrl(array(
    'scope' => 'read_stream, email, read_stream, publish_actions',
    'redirect_uri' => $self_url . '?login=true'
));

测试一下:首先在facebook权限里面删除之,然后再次刷新游戏登陆页面的URL,这时你会看到系统要求用户赋予更多权限。一旦你登录游戏,游戏系统会自动发布信息到你的facebook页面,信息参考如下图:

facebook-wall-first-post  [译] Unity3D游戏和facebook绑定(7.1 使用faceBook官方的PHP SDK) facebook wall first post效果还行吧。这是第一步一个简单的例子开始让你了解facebook API函数能力,当然API函数功能非常强大,远远不止发布消息这么简单。如果你想了解更多facebook的API信息,还需要自己去查找,因为API是一个比较宽泛的话题了。

[译] Unity3D游戏和facebook绑定(7 服务器端的Unit3D和PHP交互开发)

原文链接:Unity3d and PHP in action (server-side)

一些观点认为收集用户信息越来越重要,故服务器端的开发尤其重要。 本教程介绍一下简单的通过Unit3D和PHP交互开发,其基于facebook提供的PHP SDK。

Unity3D和JavaScript

你可调用javaScript的方法,通过Appliction.ExternalCall( “MethodName”, “ValueString” ); MethodName是全局范围的。 这个课通过Console测试。

另外,JavaScrpit也可以返回数据给Unity Web Player程序,使用 (Unity Object).SendMessage(). 例如调用u.getUnity().SendMessage(“ObjectName”, “MethodName”, “MessageString”) ,通过JavaScript侧触发了ObjectName对象的MethodName方法(public属性)。

故JavaScript脚本和Unit3D结合的相当不错。
Unit3D和PHP

这里有2个方法能够实现服务器侧脚本通信: 通过WWW对象或者WWWForm对象。 WWW对象采用的是在Unity 模块内使用,可获得指定URL的内容。WWWForm是比较有用的使用推送、获得、解析数据,如他可用于提交游戏得分情况和发布游戏消息给服务器。而获得数据需要通过C#的IEnumerator类来迭代循环实现。

using UnityEngine; using System.Collections; public class example : MonoBehaviour { public string url = "http://link.to.your.texture.com"; IEnumerator Start() { WWW www = new WWW(url); yield return www; renderer.material.mainTexture = www.texture; } }

Facebook PHP SKD and JavaScript

虽然你可在unity内通过HTTP请求工作,但是确不能触发PHP的任何方法。

你可通过使用Facebook PHP SDK在你的网站实现facebook登陆功能,这个是下一章要说的内容。Facebook鉴权流程图Logging user to Unity3d Game with Facebook account 基于URL重定向,展示了服务器侧鉴权过程,并通过HTTP GET方法返回访问令牌。

服务器端脚本是什么意思?

服务器脚本意味着可以有更多的控制。它给予你不仅能够使得facebook账号登陆游戏页面,同时也可以获得更多facebok的内容。(本文假设登陆页面游戏账号)

但是,如果你想要通过内部方法来确认用户是否登录?

在这种情况下,页面需要预先生成。然后通过程序的HTTP发起请求查询PHP脚本,判断用户是否登陆。PHP脚本调用facebok的API函数,通过SKD提供的方法,最后依据facebook服务器的响应结果返回给游戏终端用户。另外,你可要在调用前生成游戏页面,并把数据存储在Session,这样后台就需要请求一次facebook的PHP脚本,然后获得结果。

其他可选的办法?

最后一个选择是可以使用JavaScript作为一个通信沟通的桥梁。代替调用PHP脚步,你需要触发JavaScript方法,通过使用FaceBook

JavaScript SDK控制API函数。然后当你获得facebook的回掉函数,这个时候你触发一个Unity3D的内部函数,并实现异步调用服务器侧。

两者有什么不同?

facebook宣称其JavaScript的SDK可以和PHPSDK关联调用。 什么?(1)减少请求次数 (2)减少获得用户的交互信息次数。

简而言之:基于服务器侧脚本,采用JavaScript的办法获得最佳结果。

[译] Unity3D游戏和facebook绑定(6.3 本机模式、联机服务器模式下的部署和工作)

原文链接:Deployment and working with local and live environment

页面在开放调试环境下运行不错。让我们开始把他移植到原创服务器环境下吧。即,我们不得不考虑两类服务器运行环境:本地服务器、远程服务器。本章教程一一解释。

加入你的测试环境URL为http://dev. 或http://local,显然你需要修改facebook应用程序配置,以便更新到上线后的URL去。 那么怎么才能更好的维护呢?

环境准备

每次的升级发布,难道你需要每次都变更facebook配置应用URL吗,这显然不方便的很。

facebook-apps-environments  [译] Unity3D游戏和facebook绑定(6.3 本机模式、联机服务器模式下的部署和工作) facebook apps environments答案是你需要不同的运行环境,即你可通过facebook注册2个应用:开发调试应用、上线商用的应用,并通过添加dev、local来区分2者。这样不需要来回通过配置facebook切换2个不同环境了,仅仅需要修改本地代码,保持同步即可。

 

获得代码准备开发

准备好环境就开始吧。需要修改一点代码。JavaScript代码不修改,Unity3D代码也不用动。我们需要添加一点函数不需要URL重置在你发布的时候。注意看下面代码的高亮行3、10、28行。

window.fbAsyncInit = function() { var appIdLive = '472554539474881', appIdDev = '400706626694940', locationHref = encodeURI(location.href), appId = /^(http:\/\/local)(.)*$/.test(encodeURI(location.href)) ? appIdDev : appIdLive; // init the FB JS SDK FB.init({ appId : appId, status : true, // check login status cookie : true, // enable cookies xfbml : false // don't parse XFBML }); //Get the current login status. FB.getLoginStatus(function(loginStatusResponse) { if(loginStatusResponse.authResponse)
  { toggleLoginButton(false); toggleInfoContainer(true); getUserInfo(); initiateUnityPlugin(); } else { toggleLoginButton(true); toggleInfoContainer(false); $('#fb-login').click(function() { window.location = encodeURI("https://www.facebook.com/dialog/oauth?" + "client_id=" + appId + "&redirect_uri=" + locationHref + "&response_type=token"); }); } }); function toggleLoginButton(visible) { visible = (visible==true); $('#fb-login').toggleClass('hidden', !visible); } function toggleInfoContainer(visible) { visible = (visible==true); $('#fb-user-info').toggleClass('hidden', !visible); } function initiateUnityPlugin() { u.initPlugin(jQuery("#unityPlayer")[0], "magicstones.unity3d"); $('#unityPlayer').toggleClass('hidden', false); } // access graph to get user info function getUserInfo() { FB.api('/me', function(obj) { $('#fb-user-info span').text(obj.first_name); var fDataObj = obj.id + "," + obj.first_name; u.getUnity().SendMessage("FacebookProxy", "ParseUserInfo", fDataObj); }); } window.getUserInfo = getUserInfo; function getGameObject() { return unityObject.getObjectById("unityPlayer"); } };

 

我们做了一点修改,通过appid来实现开发调试版和上线发布版的切换,其他地方不用动。appID作为变量传人进来,然后被封装通过JavaScript SDK访问facebook。

好,facebook和unity3D游戏链接的任务完工。

下一章说说通过PHP脚本和Unity3D连接方式(服务器端),则没有弹出式对话框了。

[译] Unity3D游戏和facebook绑定(6.2 整合javaScript脚本和Unity3D源码)

原文链接:Integration JavaScript and Unity3d code 上一个例子,我们聚焦如何通过JS SDK和facebook继承unit3D工程。这篇文章继续完善之。 集成第一步:代码 我们再次聚焦通过javaScript脚本和facebook传递数据的流程上,从facebook发起,页面的unit3D处理完毕,再把数据返回给facebook。首先限制了游戏必须鉴权。前面的html文件在加载游戏过程中,结合unity页面需要修改2处。请看如下的JavaScript代码修改。 下面的代码柔和了通过Unity3D页面工程生产的和前面教程的HTML文件,你不需要这个。请通过unity工程新建一个index.html文件,把下面的代码粘贴一下。

—————————- 本章的请看原文,主要是图和代码。    我翻译后排版了几次,效果非常差。  

[译] Unity3D游戏和facebook绑定(6.1 通过facebook客户端的SDK-JS脚本进行用户认证)

原文链接:Authorising user with Facebook JS SKD  (client-side)

第一次使用JavaScript脚本实现facebook登陆不是很难,下面我们手把手示范一下:

完成你的一个页面游戏

首先你要做的事情是把你的游戏发布到一个URL地址。并确保游戏可以通过互联网访问。

准备本地环境

使用XAMPP或WAMP搭建本地服务器,并测试你的新URL是否可用。

注意:思考你的URL地址远期定位。如果你的游戏URL为这样的www.yourgame.com  ,你或许想同时搭建一个local.yourgame.com作为开发调试环境, 然后,当游戏发布上线后,再通过facebook 应用配置修改新的在线URL地址。我想说的是,这么做没什么不好,只是有点乱:尤其是你频繁的修改、升级、上线。另外一种办法是在facebook里面等级2个URL,一个是开发调试URL部署环境,令一个是上线部署URL环境。 我们下面说,先用本地调试环境测试通过再考虑上线的。

Facebook登陆测试

首先在你游戏的服务器下面创建一个fb-skd-test.html 文件,并粘贴下面代码。

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<!---- FB CODE ---->
<div id="fb-root"></div>
<script>
window.fbAsyncInit = function() {
// init the FB JS SDK
FB.init({
appId      : 'YOUR_APP_ID',
status     : true, // check login status
cookie     : true, // enable cookies
xfbml      : false // don't parse XFBML
})

//Get the current login status.
FB.getLoginStatus(function(loginStatusResponse) {
if(loginStatusResponse.authResponse) {
// code (1) if already logged in
} else {
FB.login(function(loginResponse) {
if(loginResponse.authRespsonse) {
// code (2) if logged in ok
}
});
}
});
};

(function(d, debug){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {return;}
js = d.createElement('script'); js.id = id; js.async = true;
js.src = "//connect.facebook.net/en_US/all" + (debug ? "/debug" : "") + ".js";
ref.parentNode.insertBefore(js, ref);
}(document, /*debug*/ false));
</script>
<!---- FB CODE END. ---->
</body>
</html>

 

替换“YOUR_APP_ID”为你登记的,可通过你的facebook应用程序配置页面查找。你也可以通过Facebook JavaScript SDK 官方参考页面 获得更详细信息。     这个时候运行,浏览器可能会弹出登陆facebook页面,先点击取消按钮,我们稍后再细说。

用户触发的弹出窗口

在我经验中,当你运行FaceBook代码加载Unity3D游戏,弹出窗口实际上在背景模式下运行,即用户看不到它。当然,这个和浏览器设置有关,很多浏览器阻止了自动弹出页面故而导致这个功能失效。这个当然问题很大,尤其是当玩家想登陆游戏系统开始玩,但是却无法登陆。浏览器这么做无可厚非,但是你应该瞄准你的目标,即你要通过社交范畴,故不用太多关心这个。因为用户通过facebook登陆的一个很重要目的是分享游戏的快感、炫耀游戏的得分情况的,故不得不通过facebook登陆。 如果弹出登陆页面被阻止了,那么这些都做不了。我们先假设用户能够弹出并能登陆。

修改head标签,通过CDN加载JQuery代码,再添加一些样式,代码如下。

<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<style type="text/css">
.hidden { display: none; }
</style>
</head>

 

在body结束标签前,创建一个按钮并添加一个div容器-用于显示一些提示用户的信息。

<input type="button" id="fb-login" class="hidden" value="Log in with Facebook"/>
<div id="fb-user-info" class="hidden">You are logged in as: <span></span></div>

 

添加一些JS函数,并修改FB.getLoginStatus() call. 替换FB.getLoginStatus() 为如下代码

//Get the current login status.
FB.getLoginStatus(function(loginStatusResponse) {
if(loginStatusResponse.authResponse) {
toggleLoginButton(false);
toggleInfoContainer(true);
getUserInfo();
} else {

toggleLoginButton(true);
toggleInfoContainer(false);

$('#fb-login').click(function() {
FB.login(function(loginResponse) {
location.reload(); // reload page when done
});
});

}
});

function toggleLoginButton(visible) {
visible = (visible==true);
$('#fb-login').toggleClass('hidden', !visible);
}

function toggleInfoContainer(visible) {
visible = (visible==true);
$('#fb-user-info').toggleClass('hidden', !visible);
}

// access graph to get user info
function getUserInfo()
{
FB.api('/me', function(meResponse)
{
$('#fb-user-info span').text(meResponse.first_name);
});
}

 

这时,我们可以测试页面了。如果用户第一次访问页面,则会出现“Log in with Facebook”按钮。如果用户已经登陆成功,则显示用户名。点击“log in”按钮,这时弹出窗体,用户可以选择确认、却笑,页面重新加载,会再次检测用户状态。

不弹出窗体验证用户权限

或许有用户对弹出窗体非常反感,下面我们可以试试不弹出的方式。

FB.login(function(loginResponse) {
location.reload(); // reload page when done
});

替换为:

window.location = encodeURI("https://www.facebook.com/dialog/oauth?"
+ "client_id=YOUR_APP_ID"
+ "&redirect_uri=" + encodeURI(location.href)
+ "&response_type=token");

注意,体会你的“YOUR_APP_ID”,测试。(首先在facebook开发者应用程序中心确认APP_ID可用)。

下一章预告:

我们的目标是通过faceBook打通用户之间墙壁,下一章详细介绍如何把facebook API整合到unity3D游戏中去。

[译] Unity3D游戏和facebook绑定(6 通过facebook登录到你的Unity3D游戏系统)

原文链接:Logging user to Unity3d Game with facebook account

有3种通过facebook账号登陆游戏系统的办法,他们之间各有优点、缺点,尤其当把Unit3D添加进来的时候,还稍微有点复杂。 取决于不同的游戏系统实现机制,每种方法之间非常不一样。但是有一个共同点那就是这3个方法都遵从OAuth 2.0协议。你也可以通过FB access token(facebook 访问令牌)来查找具体步骤,下面我们一一阐述说明。

客户端JavaScript SDK方法

这是三个方法中最最简单的。 Unity3D游戏首选这种方法作为在线网页游戏链接facebook,同样的类似Flash也采用了很多类似这样的案例。

client-side-diagram  [译] Unity3D游戏和facebook绑定(6 通过facebook登录到你的Unity3D游戏系统) client side diagram

原生设备登陆facebook

针对原生设备的这种方法,稍微有点复杂; 但如果你有IOS、Android的编程经验,则相对容易。他既然基于各自平台API函数(IOS、Android),采用了OAuth 2.0协议。这种方法对于在移动设备上发布游戏的Unity3D团队来说非常常用、也同样非常重要。

坏消息是Unity3D 4.0版本目前还没有实现这种链接方法。好消息是你能够找到几款第三方插件实现他。虽然这些插件是免费的,但是你也可以再花钱把这些免费的插件扩展的更加商业化,如经过更为高质量的测试验证,这样其他开发者也会从中受益的。

native-diagram  [译] Unity3D游戏和facebook绑定(6 通过facebook登录到你的Unity3D游戏系统) native diagram

 

服务端登陆facebook

相对前面的方法,第三种方法稍微复杂了一线。你需要编程通过前端、后台协同工作才能完成facebook登陆过程。当然,如果你有前端、后台的编程经验,也许会发现这也不很难。 当然,你也可以直接选择第一种方法作为你在线网页游戏的认证。我的个人建议是使用服务器端坊俺又很多优点。当然或许是我的BevelGames服务器环境的一些限制因素,这个,我在后面再一一阐述。

server-side-diagram  [译] Unity3D游戏和facebook绑定(6 通过facebook登录到你的Unity3D游戏系统) server side diagram

 

上面的3个图片来自Facebook开发中心.

[译] Unity3D游戏和facebook绑定(5.3 在facebook开发者中心登记你的应用程序)

原文链接:Registration of Facebook app

在facebook开发者中心登记你的产品,并授权是非常重要的。同时这个步骤又非常简单。

facebook登记应用程序

导航到developers.facebook.com页面,在菜单栏点击“应用程序”,然后点击“创建新的应用程序”

下一步你需要输入应用程序名称和你的应用程序URL. 你可自己决定使用免费的Heroku主机托管或者是你自己的服务器托管。

应用程序配置

在这一步你需要绝对用户是否能够访问你的游戏。如果你想用户通过facebook账号登陆,选择(1) 通过facebook登陆页面游戏 (2) 把游戏潜入到facebook页面内 (3) 可以动的facebook页面书签应用。 或者你选择手机应用,则选择 (4) 原生的IOS应用 或者 (5) 原生的Android应用 通过facebook发布移动应用程序 或者你可要通过自定义tab页面使用(6) 页面选项构建.

我的目标是创建基于我自己的主机的页面游戏,填写URL地址。I希望玩家能够在facebook上分享心得,所以我选择了1:通过facebook登陆页面游戏。

测试并部署

部署依赖你应用的配置、设备类型、选择的平台。在这给教程中,我们首选聚焦默认的配置项,因此使用了我们自己的服务器去部署应用。无论自己的服务器还是托管的服务器,在上传代码前都应在本地环境下测试通过。如PHP程序我们可以使用apache、NGinx部署,万一远程服务器没有按照XAMPP、WAMPP呢! 理想情况下,你应当在本地测试同,并乐于对远程服务器的任何改变适应。

怎么配置web服务器已经超过本教程范围,网上很很多教程可参考,现在我跳过这些。 万事俱备、只欠东风。下一章开始用facebook账号登陆Unity3D游戏系统吧。

[译] Unity3D游戏和facebook绑定(5.2 申请成为faceBook开发者)

原文链接:Facebook developer registration

注册成为facebook的开发者非常容易。如果如果你还没有注册,那么赶紧注册吧。然后把你的游戏和facebook关联掐里,这样facebok强大的人际交互能力将会增强你的游戏传播的机会。

通过如下步骤注册成功一个facebook开发者:
  1. 登陆你的facebook账号
  2. 导航到这个站址http://developers.facebook.com
  3. 点击“现在注册”按钮
  4. 完成下面3个注册表单
    • 接受facebook服务条款
    • 验证你的账号Verify your account
    • 填写一些其他的信息
  5. 学习、使用、享受其中的乐趣

为什么要注册为facebook的开发者?

如果你还未认识到facebook开发者的注册对你的游戏推广带来的契机,请再回头看看这篇文章:2 游戏和社交媒体(SNS)的深度分析