实战 Unity3d 导出 Windows 10 UAP(WAS)

说在最前

我可是程序员,不能光写软文,不写技术相关的东西,对吧?最近花了一个星期的时间将远古大陆移植到Windows 10上面,其实之前就一直想,可是没有办法,因为游戏引擎Unity有大量的底层接口不兼容,如果移植,需要改写大量的程序代码,并且需要花费大量的精力管理,我还发过相关的帖子问Unity的技术人员,得到回答是,“我们也搞不定哇 ”。

你懂得,Unity现在扛起了全民游戏引擎的大旗,怎么可能就这样罢休。就在上个星期发布的Unity 5.3.3之中,突然他们发布了一个可以使用IL2CPP的中间件的方法导出到Windows 10平台上。之前只能使用.Net 框架。关于这一点,我其实早就在那个帖子中给他们建议不要用Windows自带的.Net 环境,直接用一个中间件来做这个事情。现在他们已经做了,原因很简单,丫的微软变得太快,兼容不过来,而且维护多个平台,实在有些吃不消,为何不统一到C++的IL2CPP里面来呢?我们不是为了一点点C#的高版本的语言特性,而是为了只写一遍代码,很轻松导出并维护多个平台下面的程序,对吧?

关于IL2CPP,有Unity在他们的官方博客介绍,还有中文介绍,还有在Unity参考手册中的关于Windows10导出的介绍,毫无疑问,这个才是Unity脚本引擎发展的未来。 继续阅读

不作死就不会死

图片来自互联网

图片来自互联网

我说的是我自己。

短短的半个月内,我的各个服务器遭受崩溃,网络问题,甚至直接整个崩溃,搞得自己是夜不能寐、神魂颠倒,有时候心想苍天啊、大地呀,blabla……真是“不作死就不会死”。于是写篇日记,记录一下这个过程,顺便吐槽和点赞几个的服务商。

1月10日

那天一大早起来就和老婆外出了,因为之前老婆身体不舒服,说好今天陪她去医院看看的。北京的医院,你懂得,得早起。到医院没多久,电话响了,一看是策划小伙伴的,他平时很少给电话,心想不好,果然,他说游戏服务器变得非常非常慢,不知道什么回事。我开始以为是网络问题,用手机上了一下游戏,发现进入游戏、打开公会界面(大量读取数据库),都慢的出奇,平时2秒钟响应,现在竟然几十秒,甚至有些时候直接触发超时断开网络。当时,我大脑立刻进入思维强烈运转模式,找寻解决办法,不过从外表看,我表情呆滞,心不在焉,行动缓慢,老婆还以为我魂丢了呢,陪她上医院,反倒是我生病了。

继续阅读

永远年轻,永远热泪盈眶

感谢您关注一个普通的软件、游戏制作人的随想与感悟,每周一篇文章,分享给你我所经历、所感悟到的一切。

qrcode_for_gh_3503891d10d4_258游戏开发是我孩提时的梦想。没错,我是一只80后。我们这代人恐怕和前辈们最不同的地方就是,在有梦想的年纪遇到了新兴的电子游戏。那个时候,我们穿梭在不同电子游戏室,电脑室,还有后来的网吧。我们攀比着各种不同电子游戏的技术水平,玩得好有人羡慕、追捧、求教,无论其成绩,长相或是家庭背景。

继续阅读

语盒项目的开源模式

好久没有更新微博,实在没有精力写了,自从换了工作,时间就不够用了。这个主题我很早就想写,不过写了点草稿,丢弃了……

约莫在6、7月的时候,一位《程序员》杂志的编辑线上找到我,说我是否能够写一篇关于语盒相关的技术文章,我当时很”受宠若惊“——你知道吧?就像一个人整天骂美帝,说TA如何霸道,如何嚣张,这也不好,那也不行,然而突然有一天,你收到一封邮件,说”Can You Work for USA?“——就这个心情。当然,自己有几斤几两还是知道,语盒从技术水平上来说,就是将如何”将大象装入冰箱“的高度,于是我很小心的说了这个高度,需要”很小心“,你想啊,自己不是曾经说过很多山姆大叔的坏话么?

于是我就先起了一个草稿,答应他两天之内写一个提纲,给他看看,然后由他斟酌,毕竟那是人家的地盘,又不是我这里的一亩三分地,想种啥种啥。结果大家也预感到了,以我的风格,如果《程序员》收了我的文章,我如果不把那期买它两三个报刊亭断货,然后送给亲朋好友,再到语盒主页、语盒微博啥的疯狂宣传,还有天理么?那篇”残破“的文章在这里,我还没有删除,有猎奇心理的朋友也可以雅俗共赏一下。

继续阅读

Weibo的API封装

语盒在推送邮件之后,就在其他莓友的帮助下使用了新浪微博进行宣传,和用户的交流。后来发现,使用已有的长连接通道,可以推送任何信息,那么为何不进行一下微博的推送呢?当然,在1.0版本之后就进行了微博推送的开发。那时语盒还叫 yuchberry

在经过这么就的开发过程之后,接触了有新浪微博、腾讯微博、推特微博(邪恶的也叫它微博),实在忍不住想从技术上说些东西,然后做一个比较。因为做技术的人,总是想拿什么东西比较一下,才无私无畏地觉得自己“博大精深”,“贯通史今”,以便抚慰被众多bug打击的快不行了的幼小软弱的心灵。

申请授权

地球人都知道,天下微博源自推,而推的开放API以及API访问的方法OAuth,国内大多数微博也都照瓢画葫芦的弄了过来。具体技术不想多讲了,说说一般流程,首先你得申请一个应用,新浪和腾讯微博差不多,他们都有开放平台([1],[2]),基本上都能使用一个普通的微博号,然后申请应用。不同的是,推特申请后,直接全功能,不需要啥审核,直接就上,新浪需要你设置测试账号,供你测试,然后和腾讯一样需要人工审核,当然是审核你的应用链接地址,确认不是一个很黄很暴力的应用。

这个很让我纠结,推特所谓的API是什么目的呢?我经常看到有人发推——来自“春天里”,来自“奶瓶嘴”,来自“火星”,搞得我云里雾里的,或许,推特就是让人们用很多的API来表达自己的态度。相反,国内的微博API使用则更多是基于商业目的,使用API来派生出更多的商业模式,大家把满足用户需求把所谓蛋糕做大——一起吃,而用户只要点点就行了,猜个星座,搞个竞拍,转发有奖啥的。那如果搞起基来,肯定相当具有杀伤力,于是人工审查,就成了必须的一道小门槛。 继续阅读

增加支付方法和网站提速

之前一直在忙于工作上面的事情,没有时间空出来写语盒相关的东西,前几天正好有两天空,准备加一下语盒的功能。

增加支付方法:

有位国外的朋友不知道从何处听说了语盒,给我发了一邮件,问我是不是有英文版的网页,我心里窃喜——就是那种很坏的笑,心想,小样儿,中文的验证码通不过了吧?正准备帮他手动激活一下,谁知道这哥哥用Google Translate 捣鼓了半个多小时搞定了验证码,这着实让我汗颜了一把,后来他也一直询问我如何付费的的问题。

说到“国外”,非洲也算国外吧?埃及属于非洲的吧?这哥哥就是来自埃及的非洲朋友,不过好像不是黑哥们儿,GMail 的头像上面看到,小伙儿还挺帅。

我说,你赞助我吧,我帮你加时间就行了。问题就出来了,传说中的支付宝国际版貌似个人无法注册,是B2B的;另外,竟然在 Paypal 长长的下拉列表的支持名单中找不到Egypt——还真不支持,于是我只能用我ugly的英文+Google Translate 回复说,先给你免费加些时间,能告诉我你们常用的支付方法有什么,我回头开发加入一下。他回复说,是否能支持Google Checkout——他这个可能对我方便一些,毕竟Google 在世界范围都是巨头,后来他还说,在他们那里(新闻传说中最乱的地区Middle East)最常用的是一个CashU

继续阅读

关于黑莓开发中的local i18n的冲突问题

昨天早上醒来,有人邮件我说,客户端报一个 错误 Uncaught Exception:java.lang.Error

我想,又是什么黑莓的问题吧,所以就草草的回复了这个事情,后来发现,报告的人挺多的,而且都是安装了新浪微博的最新的黑莓客户端导致的,这下紧张了,记得看《创业家》里面有一句话,”永远不要和(新浪)微博竞争“,这回不但竞争了,还TMD冲突了,这下玩完儿了。

火速解决这个问题!首先是在模拟器上测试,立刻发现是

import net.rim.device.api.i18n.ResourceBundle;
...
public static ResourceBundle sm_local = ResourceBundle.getBundle(localResource.BUNDLE_ID, localResource.BUNDLE_NAME);
public static final String[] fsm_apnListString =
{
	sm_local.getString(yblocalResource.APN_LIST_NULL),
	sm_local.getString(yblocalResource.APN_LIST_CMNET) 	+ " cmnet",
	sm_local.getString(yblocalResource.APN_LIST_UNINET) 	+ " uninet",
	sm_local.getString(yblocalResource.APN_LIST_3GNET) 	+ " 3gnet",
	sm_local.getString(yblocalResource.APN_LIST_CTNET) 	+ " ctnet",
};

其中运行到第一个就不行了,调试的时候直接代码中断到这一行,继续运行,就抛出所谓的 java.lang.Error 异常了。我第一感觉就是,和新浪客户端的ID重复了,只是一种感觉,没有依据,就找到 localResource.java 这个文件:

public interface localResource {
    // Hash of: "local.local".
    long BUNDLE_ID = 0xxxxxxxxxxxxxxxxL;
    String BUNDLE_NAME = "local.local";
...

把这个值告诉了开发新浪微博黑莓客户端技术人员,因为我没有看到那个 // Hash of: “local.local”. 的提示,认为RIM会把把包的资源路径加入进来参与生成的,比如什么com.yuchting.yuchberry.client 等等字符串标示。

但是惊人的是,在新浪技术人员的查看下,发现咱两的ID是一致的,当时我就蒙了——怎么可能?后来想到的原因,很可能是他们新加入的模块的开发工程师和我看了同一套教程,都命名为 local.local 那么这个字符串的标示的hash不就一样了么?

于是吧local.local 换成了 local.yblocal 就OK了,大量的替换,svn的版本处理迎面扑来。

RIM 的RUNTIME 没有android context 的概念,完全都是JVM大环境下的操作,读取另一个已经注册的资源的不存在的符号,当然会over。不管怎么样,这个事情在我积极的更改、发布之后就告一段落了,虚惊一场,虽然最后在晚上10点发布完毕之后还出了点小插曲,总归于要结束了,可以好好睡一觉了……

第二天……

可是事情还没有完,早上起来,发现微博粉丝多了40个,下午到了60个,注册用户两天上升100多个,同步数稳步上升,好现象!很happy,准备把安卓版本的上传附件功能写完了。

随手打开GAE,靠!发送邮件的 quota 又到限制了,刚刚才把GAE的Billing关闭(不然每周$2.1,实在受不了),总不能让我又开开吧,昨天才研究了php怎么发送邮件,今天就要赶上自己写一个?为啥都在我刚刚研究的时候就出问题了呢?谁给我测试时间?

急急忙忙的吧php的发送邮件功能添加上,前两天才研究的BlueHost 邮件系统,开了一个邮件帐户 noreply@yuchs.com ,php发送邮件代码,立刻派上用场,直接上!

<?php
	if(!isset($_GET['to']) ){
		echo "<H1>403 FORBIDDEN</H1> ";
		exit;
	}
	
	$to		= $_GET['to'];
	
	if(!preg_match('/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/', $to)){
		echo '\'' . $_GET['to'] . '\' is not mail address form.';
		exit;
	}
	
	$from	= "noreply@yuchs.com";
	$reply	= "yuchberry@gmail.com";
	
	$messageID = '<' . rand() . '-' . date("Y_m_d_H_i_s") . '@yuchs.com>';
		
	$headers  = 'MIME-Version: 1.0' . "\r\n".
				'Content-type: text/plain; charset=utf-8' . "\r\n".
				'From: '. $from . "\r\n".
				'Reply-To: '. $reply . "\r\n".
				'Message-Id: '. $messageID . "\r\n";
				
	$subject = "=?UTF-8?B?".base64_encode("语盒官方服务提醒")."?=";
 
	$content = '你的语盒使用时间已经快到了,稍等一段时间后服务器会暂停服务。'."\r\n".
				'你可以登录官方网站 http://www.yuchs.com/ 进行时间的充值,继续使用,或者查看FAQ,进行自架服务器使用。' . "\r\n".
				'感谢你对语盒的关注和支持!' . "\r\n".
				"\r\n".
				'语盒开发者敬上!';

    $result = mail($to, $subject, $content, $headers);  
	
	if($result){
		echo 'OK';
	}else{
		echo 'Failed';
	}
	
?> 

这段代码是不是要求在自己的web主机上开启一个邮件帐户,我现在还是不知道,反正我是在web主机上加了一个邮件帐户 noreply@yuchs.com ,总之能解决问题就行。乒乓五四又一天过去了,终于,帐户邮件又能发送了。

哎,一天的劳命哪~