Error building Player: UnityException: Platform assembly not found.

Error building Player: UnityException: Platform assembly not found.

The registry keys Unity is looking for are:

Windows Phone 8.1: H_KEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\WindowsPhoneApp\v8.1\InstallationFolder (points to C:\Program Files (x86)\Windows Phone Kits\8.1\ on my machine). After getting that path, Unity looks for “References\CommonConfiguration\Neutral\Windows.winmd” in that folder.

Windows 10: H_KEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SDKs\Windows\v10.0\InstallationFolder (points to C:\Program Files (x86)\Windows Kits\10\ on my machine). After getting that path, Unity looks for “UnionMetadata\Facade\Windows.winmd”.

from here:
http://forum.unity3d.com/threads/error-building-player-unityexception-platform-assembly-not-found.357568/

Read More

VR沉思录一

这几天尝试接触了一下VR. 现在想到了一个角度可以帮我理解一下这个东西.

底层都是对显示设备操作,再加上采集USB输入的数据.  显示是通过线从PC输出的.

这其实还不是真的一体机的方式. 要用PC.

Google 的玩法是 card board . 只提供设备的开发包. 然后用设备替代那块屏.  再配上眼镜.  跳过了视频输出的问题.

具体体验如何. 还没试过眼镜.不做评论.

还真的有一体机. nibiru android的. 这个最吸引人.  但是效果如何呢.

我估计顶配的PC的 Oculous Rift 方案肯定是最棒的.  但也是最烧钱的.

cardboard 的会比一体机的差一些. 如果一体机做的够好的话.

反正便宜没好货绝对是真的.

75FPS是个指标. 也是个高度. 2K 还是4K 也是拼体验的指标. (似乎算法上 硬件本身上的文章不太多)  如果继续走手机的整合路线, 那就得看芯片商给不给力了.  这玩意应该没办法拼外观设计啥的. 带上去感觉不同最重要 好久是好 不好就是不好啊.

所以得有核心点才行.  当然这块是厂商的问题.

但也和开发者有关系, 就是开发的SDK包的支持程度了. 如果不够完善, 那就门槛很高了,  然后开发者数量就会下降.  所以开始还是得厂商着急,得帮着开发者才行。厂商自己做内容平台的也不少.不管多少,都摆出架子了.就看别人怎么玩了.

硬件是入口.到底有多大量呢.卖PC的其实最开心了  要想体验好 就得烧钱买显卡 2K都不是最好的. 尽管玩游戏已经超富裕了.

这个裂痕会被弥补吗?  长远看, 设备会越来越不值钱, 而内容服务则是长期可收费的.  各个设备之间底层到底区别有多大呢?  在驱动上?   应该会有公版驱动. SDK.  这样兼容性就高了.  玩家会开心.  真是一个混沌的局面啊.

网吧(体验店 等等)可能是最早普及的.

实际上我们就需要解决2个问题, 1个是显示. 1个是控制.

显示是可以通用的. 就是让场景支持双眼模式. 甚至底层驱动可以自己做这件事, 把输出的自动镜像一份. 而不用项目本身做什么调整.

(感觉像Unity 5.3 vr开启的模式就是底层处理双眼)  即便如此,还是要调整Ui来支持空间模式才可以. 这样的话 又不太区分底层处理还是自己处理了. 反正重点是Ui 都要改. 双眼反而不是多复杂. 就是体验好坏了. 驱动有没有更好地处理数据啥的.

操控部分应该类似于 direct input 之类的规范才好. 不然也是坑.  或者逻辑上自己把事件处理封装好. 隔离好. 针对性适配.

如果统一了标准. 似乎厂商自己没啥好处. 也不能占领用户. 其实还是得靠内功, 除了看看片这种需求.  剩下的就得比一比了.  好在价格摆着, 想知道谁好就得买一个试试. 或者去体验店试试. 但是 每个人物理构造(眼睛) 有不同啊. 一个人说好 说坏会有多大的影响力呢?   甚至是开发者自己.  程序写的不好, 机制设计的不好, 也都可能会影响体验是吧.  复杂啊.

 

 

 

Read More

1年零3个月,我今天擦了一下显示器.然后就给擦破了

当时买Macbook时就知道这事, 以为涂层会掉这事是13年时候的工艺问题.

一直也安然无恙.

然后头两天,动手清理了一下. 过年嘛.

然后就杯具了, 左上角有一块涂层貌似掉了. 开始以为是指纹. 擦了两下之后发现 不一样了.

我保证没用什么清洁剂,诸君的本本还好吗?

AppleCare 作用凸显啊

Read More

cocos2d js chat demo 多人聊天系统的实战小结.

最近cocos大招连发啊. 3.10发布, creator发布. (JS方向)

昨天顺手写了一个小的demo. 其实俺真的不怎么会js. 好在cocos2d-x作为后盾, 接口封装的基本是一致的. 用起来思路相同. 比如 Listview都是设置一下 setItemModel 然后 pushDefaultItem 这样.

jschatclient.js 算是核心部分了. 重点是  onmessage的处理.  然后又搭配上了一个 python 的websocket server.

整体就很轻便了. 满足可以直接Run起来看效果的需求了.

这个小demo就是常见的网络聊天的功能了. 用了一下cocos studio自带的美图.

点击Login,点击Send发送聊天. 同时可以看到别人发送的聊天信息. 数据封包用JSON明文字符串.

//登录 建立连接.
jschat_login(“127.0.0.1”,9001);

//发送聊天数据.
jschat_chat( chatTextField.getString() );

//数据包处理逻辑

//core function: msg be handled

//eg:login,logout,check online count, chat to others. private chat.

this.onmessage = function(msg)
{
console.log(“handle some msg here”);
updateDebugInfo(“got msg size=”+ msg.data.length );
var packet = JSON.parse(msg.data);

//第一次登录连接,服务器会返回一个userid.
if( packet[‘type’]==”LoginResp”)
{
console.log(“LoginResult”+ packet[‘result’]);
if( packet[“result”]==”ok”)
g_jsclient.clientId = packet[“userid”];
}else if( packet[‘type’]==”OtherChat” || packet[‘type’]==”chat”)
//客户端收到服务器转发的聊天消息.
{
console.log( “From” + packet[“userid”] + “to” + packet[“msg”]);
updateChatMsgUI( packet[“userid”],packet[“msg”]);
}

}

//chat server

# Called for every client connecting (after handshake)
def new_client(client, server):
print(“New client connected and was given id %d” % client[‘id’])
#server.send_message_to_all(“Hey all, a new client has joined us”)
server.send_message_to_all(‘{“type”:”OtherChat”,”msg”:”%d online” }’%(client[“id”]) )
addClient(client)
server.send_message(client,‘{“type”:”LoginResp”,”result”:”ok”,”userid”:”%d” }’%(client[“id”]))
# Called for every client disconnecting
def client_left(client, server):
print(“Client(%d) disconnected” % client[‘id’])
delClient(client)
# Called when a client sends a message
def message_received(client, server, message):
if len(message) > 200:
message = message[:200]+‘..’
print(“Client(%d) said: %s” % (client[‘id’], message))
#forward to other client.
forwardMsgToOthers(client,message);
users={}
def addClient(client):
_uid = client[‘id’]
users[_uid] = client
def delClient(client):
_uid = client[‘id’]
del users[_uid]
def forwardMsgToOthers(sender,msg):
for id,client in users.iteritems():
if( id == sender[‘id’]):
continue
server.send_message(client,msg);
很简单吧..
 

遇到的几个点.

  1. cocos studio 输出的文件使用.
  2. 绑定ui处理事件.
  3. 使用socketio的注意问题.
  4. 不造轮子的前提下: 用了python. 达到直接可以run起来看效果了.
  5. 插入新的聊天记录时自动滚动到底部.
    这两句话是收获啊.
    chatMsgList.refreshView();
    chatMsgList.jumpToBottom();   鄙视一下看到的demo.聊天怎么能insert到顶部呢.

小结: 还有更多的扩展工作可以做, 私聊, 频道聊天. 聊天带表情符号图片. 颜色字等等.  以及健壮性优化.

网络开发其实最核心的还是定义好业务流程(数据协议) 响应交互(玩家输入,服务器数据反馈. UI更新)

异常处理和优化的重要的环节,  使用正确的开发和调试姿势很重要.

 

 

Read More