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 及以上版本

流程图

image

文件说明

  1. wdSetup:微端安装程序
  2. fileUpdate:微端更新程序
  3. xxLauncher:微端启动器
  4. 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(0), "Hello World!", "Hello Dialog", 0);
    }
}
复制代码

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

image

 

窗体和控件的透明

窗体透明

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

image

按钮图片透明

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

imageimage

最后是使用两个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、选中项目,右键 - 属性 - 资源 ,点击下拉列表,选择图像。

image

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

image

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目录同级,在指定路径时,出现了问题

image

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文件

Winform 集成零散dll进exe的方法

 

踩过的坑

  1. WebBrowser在窗口大小改变闪动
  2. WinForm图片替换了还要重新浏览才会刷新

本文转自赵青青博客园博客,原文链接:http://www.cnblogs.com/zhaoqingqing/p/5671398.html ,如需转载请自行联系原作者
相关文章
|
1月前
|
JSON JavaScript 前端开发
开发桌面程序-Electron入门
【10月更文挑战第16天】Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用的框架,嵌入了 Chromium 和 Node.js。本文介绍了如何搭建 Electron 开发环境,包括安装 Node.js、创建项目、配置 main.js 和打包应用。通过简单的步骤,你可以快速创建并运行一个基本的 Electron 应用程序。
开发桌面程序-Electron入门
|
编译器 网络虚拟化 C语言
2023年最全 Windows + VSCode 配置 OpenCV C++ 一站式开发调试环境教程
2023年最全 Windows + VSCode 配置 OpenCV C++ 一站式开发调试环境教程
2825 0
|
7月前
|
IDE Java 开发工具
【开发工具】Windows环境下 IDEA 开发工具安装&配置(无错完整)
【1月更文挑战第20天】【开发工具】Windows环境下 IDEA 开发工具安装&配置(无错完整)
|
Dart Android开发
Flutter | vscode运行Flutter疑难杂症
本来今天更新Stable Diffusion最后一个教程的,但是今天在开发中遇到了一个问题。
180 0
|
Dart 编译器 开发工具
Flutter | windows使用vscode创建并使用夜神模拟器运行flutter
开发Flutter如果使用Android studio并运行,编译器加上虚拟机基本上直接占用2个多G内存,对于16G内存的电脑来说,压力还是有点大的。所以如果使用vscode开发是不是好很多,而且还用的顺手。
327 0
|
机器人 图形学 Ruby
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
252 0
【Unity开发实战】—— 2D项目1 - Ruby‘s Adventure 游戏中动画制作(4-1)
|
Dart 开发工具 Android开发
Flutter环境搭建、运行gallary项目
Flutter环境搭建、运行gallary项目
|
前端开发 编译器 API
Flutter 启动及环境配置
Flutter 启动及环境配置
846 0
Flutter 启动及环境配置
|
区块链
(win环境)使用Electron打造一个桌面应用翻译小工具
(win环境)使用Electron打造一个桌面应用翻译小工具
(win环境)使用Electron打造一个桌面应用翻译小工具