dotNet开发游戏微端
需求分析
功能要求
当玩家使用不支持 unity webplayer 的浏览器进入游戏时,让玩家通过微端玩游戏。
确保微端的功能和页游戏功能一致。
大体功能就是为unity web game开发微端,注:本文的微端做法也可适用于其它引擎的游戏项目。
运行环境
操作系统:Windows XP/7/8/10 x86/x64 (windows all) ,Mac和Linux用户可使用网页进入游戏
开发工具:Visual Studio 12/13/15 ,Unity3D 4.x 5.x
附加条件:已安装.NetFramework 2.0 及以上版本
流程图

文件说明
- wdSetup:微端安装程序
- fileUpdate:微端更新程序
- xxLauncher:微端启动器
- uninst:微端卸载程序
开发过程
version log
v0.1 原本老微端是使用C++编写登录器,主要技术是嵌入网页的方法,年代已久加上人员变动,没有交接到源码……
v0.2 由于种种某因,C++那边觉得.Net做这块可以快速出成品,所以技术上改用C#
v0.2 在2015年底,.NetCore正式还未发布,doNet的跨平台方案选择上mono较成熟,故考虑mono的GTK
v0.3 计划突然提前,mono gtk技术还没摸热,运营就要微端版本了,故改用windows 平台的doNet
v0.4 按照运营计划,完成开发并投入使用(使用wpf开发)
v0.5 0.4版本中使用的wpf技术需要.net framework3.5及以上版本,运营过程中发现玩家电脑并非都有安装,故考虑winform(仅需.net framework2.0)
v0.6 winform版本做法也是登录器+嵌入网页的实现方式,但运营觉得体验不够好(尤其在windows10下),同样需要玩家安装unity webplayer插件。
v0.7 改进做法:登录器 + 导出unity PC,MAC && Linux Standalone 工程(可执行程序)
已知问题
删除某个重要文件,无法启动。
roadmap
- 刷新和清除缓存功能
- 区分内网和外网版本
- 登录器能否调用用户的默认浏览器,而非IE?
- 提出好的方法标识文件版本,而非通过txt标记?
- 业务功能抽成dll,方便热更新主程序。
- 与运维平台整合,全自动化流程包括打包,签名,发布。
相关知识
system.diagnostics.process
https://msdn.microsoft.com/zh-cn/library/system.diagnostics.process%28v=vs.110%29.aspx
winform MSDN资料
https://msdn.microsoft.com/zh-cn/library/dd30h2yb(v=vs.110).aspx
WPF MSDN资料
https://msdn.microsoft.com/zh-cn/library/ms742119(v=vs.110).aspx
为Windows平台构建Unity插件
C# Call Windows API Messagebox
WIN32 API:C# calling a DLL API, in this case, MessageBox in user32.dll:http://snipplr.com/view/17634/
using System;
using System.Runtime.InteropServices; class Example
{
// Use DllImport to import the Win32 MessageBox function.
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type); static void Main()
{
// Call the MessageBox function using platform invoke.
MessageBox(new IntPtr(), "Hello World!", "Hello Dialog", );
}
}
Unity调用doNet的dll
以winform的dll为例
1. 找到System.Windows.Forms.dll,并导入System.Windows.Forms到Unity工程的Pulgins目录
2. 修改player settings中api compatibillity Level 为 .NET2.0
3. 在Unity代码中调用winform的api
示例代码:https://github.com/zhaoqingqing/blog_samplecode/blob/master/Sample_Unity_WinForm.cs

窗体和控件的透明
窗体透明
1. 在Picturebox中放置背景图片,并至于底层。
2. using the Form.TransparencyKey property(设置Form透明)
3. 确保Form的TransparentKey和BackColor一致,并设置From的Border为None
4. 运行,就可以看到背景图多余的白边没有了。(PS:winform原生不支持alpha透明通道,需要美术调整图像)
//this.BackColor = Color.Black;//设置边角的颜色
//this.BackColor= new Color();
this.TransparencyKey = BackColor;//!imporant确保此属性和BackColor一致
this.FormBorderStyle = FormBorderStyle.None;
Form透明
stackoverflow:How to make winform window transparent and picture Visible?
另一个Demo:Transparent Borderless Forms in C#
图片和控件透明(GDI+)
codeproject:How to Use Transparent Images and Labels in Windows Forms

按钮图片透明
美术计划在Unity中制作Button一样,底图+图片文字描述,但是实际开发过程中,使用winform的button组件制作这个效果费时,还达不到理想效果,比如文字是图片的话,图片位置还调出满意的位置,下图是winform原生的button背景图和图片的属性


最后是使用两个PictureBox叠加在一起来达到效果的。
动画部分
How to show and hide form using sliding effect of AnimateWindow function using c#?
Picturebox.Image.Name无法获取
public void MouseEvent(object sender, EventArgs eventArgs, int animType, bool enter)
{
if (sender is PictureBox)
{
//FIX PictureBox无法获得图片的Name
var pictureBox = sender as PictureBox;
var hoverPicName = enter ? "pic_enter" : "pic_normal";
var obj = Resources.ResourceManager.GetObject(hoverPicName);
if (obj != null)
{
pictureBox.Image = obj as Image;
}
}
}
鼠标滑过更换图片/动画
winform原生button没有NGUI的button那样提供交互动画,这个还是要靠自己的动手。
PictureBox交互动画示例:https://github.com/zhaoqingqing/blog_samplecode/blob/master/LauncherForm_Snippet.cs
把图片合进Exe
1、选中项目,右键 - 属性 - 资源 ,点击下拉列表,选择图像。

2、多选需要的图片,拖动到资源中

3、在需要图片的控件中从 项目资源文件中选择,图片size模式为:AutoSize
4、注意:图片被替换之后,要重新选择一次图片,才会刷新。(PS.这是我遇到的问题)
代码调用图片
xx.Image = Resources.你的图片名 as Image
this.Icon = Resources.icon;
自动化Visual Studio流程
自动化visual studio编译 exe或dll 的过程,整合进运维平台流程,解放双手。
devenv 命令行参数:https://msdn.microsoft.com/zh-cn/library/xee0c8y7.aspx
遇到问题:参数错误
未能完成操作。参数错误。 用法:
devenv [解决方案文件 | 项目文件 | 任意文件.扩展名] [开关] devenv 的第一个参数通常是一个解决方案文件或项目文件。
如果您希望在编辑器中自动打开文件,
也可以使用任何其他文件作为第一个参数。当您输入项目文件时,IDE
会在项目文件的父目录中查找与该项目文件具有相同
基名称的 .sln 文件。如果不存在这样的 .sln 文件,
IDE 将查找引用该项目的单个 .sln 文件。如果不存在这样的单个
.sln 文件,则 IDE 将创建一个具有默认 .sln 文件名的未保存
的解决方案,其基名称与项目文件的基名称相同。 命令行生成:
devenv 解决方案文件.sln /build [ 解决方案配置 ] [ /project 项目名称或文件 [ /projectconfig 名称 ] ]
可用的命令行开关:
问题的原因是这样的:我创建的csproj文件和vs的sln目录同级,在指定路径时,出现了问题

vs给出的错误提示中指出:可以使用项目项目文件或解决方案文件,所以改成csproj文件就OK了。
cd %~dp0 set log_file=%~dp0\logs\buildlog.log
set save_path=%~dp0\release_files\
rem this project don't create sln,use csproj
set launcher_sln=%~dp0\Lanucher_WinForm\Lanucher_WinForm.csproj
set launcher_files=%~dp0\Lanucher_WinForm\bin\Release\YlLaunch.exe rem note path
devenv %launcher_sln% /build Release /project "Lanucher_WinForm.csproj" /projectconfig Release /Out %log_file%
copy %launcher_files% %save_path%\Launch_test.exe
示例脚本:https://github.com/zhaoqingqing/blog_samplecode/blob/master/build_vsproject.bat
注意事项:bat语法中 =号两边没有空格,我遇到有空格视为语法错误
set log_file="c:\buildlog.log"
set log_file = "c:\buildlog.log"
dll和其它文件合并到一个exe
ILMerge
下载:https://www.microsoft.com/en-us/download/details.aspx?id=17630
C#中用ILMerge将所有引用的DLL和exe文件打成一个exe文件
踩过的坑
- WebBrowser在窗口大小改变闪动
- WinForm图片替换了还要重新浏览才会刷新
dotNet开发游戏微端的更多相关文章
- 2D客户端+微端技术总结
本人于2013年9月23号加入一个页游项目组, 并作为项目组的客户端小组的主程, 带领一个4个人(峰值)的前端小组, 进行微端的开发.微端项目于2014年8月底大体完成, 历时11个月.9月份之后微端 ...
- Unity下的开发框架--适应web和微端游戏异步资源请求的框架
一. 内容简介: 1. 框架对Web与微端游戏特性的支持: Web和微端游戏最重要的特性是,资源是持续从服务器上即时下载下来的.而保证体验流畅的关键就是保证资源下载分散到持续的体验过程中,并保 ...
- 微端游戏启动器launcher的制作(序篇)
公司要做一个游戏接入腾讯QQ游戏大厅,腾讯要求制作一个launcher,公司之前并没有接入过腾讯,所以大家其实都不懂,而我又是新人,所以刚拿到这个任务的时候整个人就是一个大写的懵逼.在网上查找了不少的 ...
- 转: 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端
from: http://ybak.iteye.com/blog/1853335 基于netty+ protobuf +spring + hibernate + jgroups开发的游戏服务端 游戏服 ...
- go语言游戏服务端开发(三)——服务机制
五邑隐侠,本名关健昌,12年游戏生涯. 本教程以Go语言为例. P2P网络为服务进程间.服务进程与客户端间通信提供了便利,在这个基础上可以搭建服务. 在服务层,通信包可以通过定义协议号来确定该包怎 ...
- 微端 代码project as air 分享
分享 ^_^ 1. 使用 air , as . 2. 微端下载和更新技术 成功上线棋牌游戏.它可用于传统的游戏开发. 地址: http://download.csdn.net/detail/stone ...
- spring cloud+dotnet core搭建微服务架构:配置中心续(五)
前言 上一章最后讲了,更新配置以后需要重启客户端才能生效,这在实际的场景中是不可取的.由于目前Steeltoe配置的重载只能由客户端发起,没有实现处理程序侦听服务器更改事件,所以还没办法实现彻底实现这 ...
- Egret微端 创建项目(一)
开发环境: window7 egret engine:5.0.14 egret wing:4.1.0 微端:v0.0.14 官方教程:http://developer.egret.com/cn/git ...
- GJM : 各大开发游戏引擎
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
随机推荐
- cell重用的几种方式
1.使用xib重用 //ios6 之后推荐大家使用的重用方式 //动态的使用self获得当前类名,来作为唯一的标示 NSString * identifier = NSStringFromClass( ...
- H5移动端页面设计心得分享
去年JDC出了不少优秀的武媚娘…不,H5呢,大家都很拼,同时当然也积累了一些经验和教训,今天结合咱们的实战案例,从字体,排版,动效,音效,适配性,想法这几个方面好好聊一聊关于H5的设计,希望对同学们有 ...
- 《The Linux Command Line》 读书笔记03 ls命令与长格式输出解释 文件权限
ls命令与长格式输出解释 文件权限 ls命令 ls 命令用于列出目录内容,不带参数时列出当前工作目录的内容,也可以指定目标目录(可以指定多个),列出目标目录下的内容. ls命令的参数 ls -l 长格 ...
- Android ThreadUtil 线程公共类,判断是否在主线程/ 子线程执行 相关操作
前言:通常,我们写的公共的模块给别人用,但是这个模块又必须在特定的线程中执行. 比如,一个加载网络图片的的方法,需要在子线程中执行. /** * 加载网络图片 */ private void load ...
- 自定义View之onMeasure()
1.自定义View之onMeasure() 2.onMeasure实例分析
- PagerTabStrip在ViewPager的页面中添加标题显示
package com.qf.day18_viewpager_demo_05; import java.util.ArrayList; import java.util.List; import an ...
- iOS带动画的环形进度条(进度条和数字同步)
本篇写的是实现环形进度条,并带动画效果,要实现这些,仅能通过自己画一个 方法直接看代码 为了方便多次调用,用继承UIView的方式 .m文件 #import <UIKit/UIKit.h> ...
- 【问题排查记录】Field 'id' doesn't have a default value;
错误信息: org.springframework.dao.DataIntegrityViolationException: StatementCallback; SQL [delete from t ...
- ThinkPHP的RBAC原理分析
转载 http://jingyan.baidu.com/article/a948d65151a4810a2ccd2e60.html 方法/步骤 多用户对节点的操作的权限控制,这句话,经过反复扩展功能, ...
- 心理控制方法——阅读Notes
1.自助式情感手术 祛除自我意象中的伤疤的要点 2. 你制造错误,但是错误不应造就你 你身上的缺点不是你的错 3. 不仅要原谅别人,也要原谅自己 4. 怨恨是一条通向失败的道路 5. 注意来 ...