使用Unity3d实现2d游戏,有几种方式

发布网友 发布时间:2022-04-23 22:55

我来回答

6个回答

懂视网 时间:2022-05-04 01:22

在Unity中可能需要在纹理上面绘制文字、图像等。比如游戏中的显示器,手机等等等等等。太多了。 Unity的Textute2D类提供了设置像素的操作, 但是这效率实在不敢恭维。 汉字数量巨大,全部贴在一张图上既耗空间,不方便改变字体样式。 使用FreeType2等CPU计算

在Unity中可能需要在纹理上面绘制文字、图像等。比如游戏中的显示器,手机等等等等等。太多了。

Unity的Textute2D类提供了设置像素的操作,但是这效率实在不敢恭维。


汉字数量巨大,全部贴在一张图上既耗空间,不方便改变字体样式。

使用FreeType2等CPU计算的文字库一帧又画不了多少,毕竟还要提交到显存


于是瞄准了Direct2D,当初学习这图像接口时就被微软说的“能与Direct3D进行完美交互”所吸引。

好在Unity支持DX11了,我们能够在Unity上面使用Direct2D了。所以只能在支持DX11的机器上面运行。


首先得说一下授权许可,毕竟Unity是一款商业软件。

Unity明确指出:Unity Pro才能使用Plug-in,即插件。Unity Free版本是不可以使用的。

但是,它说的是“插件”,而不是“本地代码”。

有童鞋肯定就会说我这是咬文嚼字了。非也非也,“插件”是指遵循当前环境并按照其对接口的相关规定写的代码。


那么,Unity插件有什么规定呢?

需要提供UnitySetGraphicsDevice与UnityRenderEvent

前者获取图形设备信息与图像设备相关事件,后者提供渲染事件。这两个接口是Unity自动调用的(或者也算半自动),

不能显式调用——因为没意义.....


你的本地代码提供了这两个接口就算插件,否则就是普通的本地代码库。

作为本地代码库不能放在plugin文件夹内,不能调用,因为Unity会认为是个插件,而应该直接放在工厂目录下。


再者,假设你写了个插件却放在这个目录下,那么那两个接口不能自动被调用。



好了,就这样可以创建Direct2D了,那个版本的?1.0?1.1?甚至1.2?随意啦!


但是,我建议这样做:

[cpp] view plaincopyprint?

  1. #include "windows.h"
  2. HMODULE WINAPI LoadLibraryWrapA(char* file_name){
  3. return LoadLibraryA(file_name);
  4. }
  5. HMODULE WINAPI LoadLibraryWrapW(wchar_t* file_name){
  6. return LoadLibraryW(file_name);
  7. }
  8. BOOL WINAPI FreeLibraryWrap(HMODULE hLibModule){
  9. return FreeLibrary(hLibModule);
  10. }
  11. FARPROC WINAPI GetProcAddressWrap(HMODULE hModule, char* lpProcName){
  12. return GetProcAddress(hModule, lpProcName);
  13. }

#include "windows.h"

HMODULE WINAPI LoadLibraryWrapA(char* file_name){
 return LoadLibraryA(file_name);
}

HMODULE WINAPI LoadLibraryWrapW(wchar_t* file_name){
 return LoadLibraryW(file_name);
}

BOOL WINAPI FreeLibraryWrap(HMODULE hLibModule){
 return FreeLibrary(hLibModule);
}

FARPROC WINAPI GetProcAddressWrap(HMODULE hModule, char* lpProcName){
 return GetProcAddress(hModule, lpProcName);
}


面的代码封装成dll文件,这样像C++一样显式调用dll文件。

好处如下:

1. 方便: 不知道是不是Unity的原因,反正假设你想一般dll一样使用Unity C#中的DllImport,

使用后除非关闭Unity,否则不能再次修改dll文件。这简直蛋疼,修改一行代码就需要:

关闭Unity -> 复制dll -> 打开Unity

2. 方便调试,在VS Express 2013 for Windows Desktop中,选择


工具——附加到进程,选择Unity进程


就能直接调试dll文件了,很方便。


使用GetProcAddressWrap获取函数指针之后使用C#中的

Marshal.GetDelegateForFunctionPointer

就能将函数指针换成C#中的托管方法。


比如先定义:

[csharp] view plaincopyprint?

  1. // 初始化 D2D 管理器
  2. publicdelegate System.UInt32 D2DManagerInit();
  3. public D2DManagerInit m_D2DManagerInit;

 // 初始化 D2D 管理器
 public delegate System.UInt32 D2DManagerInit();
 public D2DManagerInit m_D2DManagerInit;

使用:

[csharp] view plaincopyprint?

  1. proc = GetProcAddressWrap(m_unityd2ddll, "D2DManagerInit");
  2. m_D2DManagerInit = (D2DManagerInit)Marshal.GetDelegateForFunctionPointer(proc, typeof(D2DManagerInit));

  proc = GetProcAddressWrap(m_unityd2ddll, "D2DManagerInit");
  m_D2DManagerInit = (D2DManagerInit)Marshal.GetDelegateForFunctionPointer(proc, typeof(D2DManagerInit));

之后使用m_D2DManagerInit()就能调用dll文件中的D2DManagerInit函数了。


最后在OnApplicationQuit里面释放即可。




创建 D2D 1.0 的 流程:


首先创建一个公共的 D2D工厂 ,毕竟可能创建多个


Unity中 Texture2D::GetNativeTextureID在DX11环境下就能获取一个ID3D11Texture2D的指针


这个指针能获取 D3D11设备 ,D3D11设备 能获取当前 D3D11设备上下文。


D3D与D2D交互要D3D设备有D3D11_CREATE_DEVICE_BGRA_SUPPORT(D3D11环境下)




D3D11设备 -------> 创建Texture2D,D3D11_TEXTURE2D_DESC参考如下:

[cpp] view plaincopyprint?

  1. sharedTextureDesc.Width = 512;
  2. sharedTextureDesc.Height = 512;
  3. sharedTextureDesc.MipLevels = 1;
  4. sharedTextureDesc.ArraySize = 1;
  5. sharedTextureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  6. sharedTextureDesc.SampleDesc.Count = 1;
  7. sharedTextureDesc.Usage = D3D11_USAGE_DEFAULT;
  8. sharedTextureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;

  sharedTextureDesc.Width = 512;
  sharedTextureDesc.Height = 512;
  sharedTextureDesc.MipLevels = 1;
  sharedTextureDesc.ArraySize = 1;
  sharedTextureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  sharedTextureDesc.SampleDesc.Count = 1;
  sharedTextureDesc.Usage = D3D11_USAGE_DEFAULT;
  sharedTextureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;

必须有D3D11_BIND_RENDER_TARGET,否则不能创建渲染目标呈现器。记得保留这个指针。



然后对 D3D11Textue2D 使用QueryInterface获取 Dxgi表面

使用这个Dxgi表面利用D2D工厂CreateDxgiSurfaceRenderTarget创建RT

就好了,记得释放这个Dxgi表面:



渲染D2D

如同一般那样,不过由于变成了dll,可能一些习惯要改成C语言那样。


呈现D2D

渲染完成后,使用

D3D11设备上下文的CopyResource方法就能拷贝渲染结果到目标纹理了:


DirectWrite简直不错:




稍微写点代码就能模仿某游戏那样的效果:


嗯,看来还不够完善,再加油吧:


话说自带的Sprite着色器很不错,简直赞


热心网友 时间:2022-05-03 22:30

四种方式,分别是:

1、使用本身UGUI,UGUI是Unity官方推出的最新UI系统,UI就是UserInterface。

2、把摄像机的投影改为正交投影,不考虑Z轴.

3、使用Untiy自身的2D模式,在2d模式中,层级视图中只有一个正交摄像机,场景视图选择的是2D模式。

4、使用2D TooKit插件,2D Toolkit是一组与Unity环境无缝集成的工具,提供高效的2D精灵和文本系统。

扩展资料

软件特点:

Unity适用于创建2D和3D游戏。在Unity中创建新项目时,可以选择以2D或3D模式启动。以2D或3D模式开始之间的选择决定了Unity Editor的某些设置,例如图像是否以纹理或精灵的形式导入。

许多2D游戏使用平面图形,有时称为sprites,根本没有三维几何。它们作为平面图像被绘制到屏幕上,游戏的相机没有视角。

相机可以显示侧向滚动视图,并且玩家只能在二维中移动,但是游戏本身仍然使用用于障碍物的3D模型以及相机的3D透视图。对于这些游戏,3D效果可能具有风格而不是功能性的目的。这种类型的游戏有时也被称为“2.5D”。

热心网友 时间:2022-05-03 23:48

使用Unity3d实现2d游戏,有6种方式:

1、使用Unity3d自身的GUI,即在GUI中绘制贴图。

2、可以用Unity3d的3D模式,在不考虑Z轴的前提下,把摄像机的投影改为正交投影再制作。

3、可以使用Untiy自身的2d模式去制作2d游戏。

4、可以使用2dTooKit插件。

5、可以使用Unity3D的2D功能,如2D物理等实现2d游戏。

6、可以使用Unity3d本身的UGUI,在网格面上绘制贴图。

扩展资料

1、关于使用Unity3d本身的GUI,在网格面上绘制贴图的方式:

可以把图片绘制在3D的网格平面中,在制作2D游戏时可以将所有贴图绘制在平面模型对象之上,最后用摄像机以90度垂直的角度照射这些平面即可。

2、关于使用Unity3d本身的GUI,即在GUI中绘制贴图的方式:

GUI可以用来制作简单的游戏2D界面,比如游戏界面中一切其它的高级控件,输入框或者主界面中绘制的游戏名、退出游戏、保存游戏、开始游戏、之类的按钮等等。注意:因为UGUI的渲染效率非常低,所以只能制作简单的图形化界面。

热心网友 时间:2022-05-04 01:23

你可以先去【绘学霸】网站找“游戏特效/unity3D”板块的【免费】视频教程-【点击进入】完整入门到精通视频教程列表: www.huixueba.net/web/AppWebClient/AllCourseAndResourcePage?type=1&tagid=305,306&zdhhr-11y17r-1435747319067822139

想要系统的学习可以考虑报一个网络直播课,推荐CGWANG的网络课。老师讲得细,上完还可以回看,还有同类型录播课可以免费学(赠送终身VIP)。

自制能力相对较弱的话,建议还是去好点的培训机构,实力和规模在国内排名前几的大机构,推荐行业龙头:王氏教育。
王氏教育全国直营校区面授课程试听【复制后面链接在浏览器也可打开】:
www.cgwang.com/course/gecoursemobilecheck/?zdhhr-11y17r-1435747319067822139

在“游戏特效/unity3D”领域的培训机构里,【王氏教育】是国内的老大,且没有加盟分校,都是总部直营的连锁校区。跟很多其它同类型大机构不一样的是:王氏教育每个校区都是实体面授,老师是手把手教,而且有专门的班主任从早盯到晚,爆肝式的学习模式,提升会很快,特别适合基础差的学生。

大家可以先把【绘学霸】APP下载到自己手机,方便碎片时间学习——绘学霸APP下载: www.huixueba.com.cn/Scripts/download.html

热心网友 时间:2022-05-04 03:14

据我所知:
1 单纯地使用Unity3D的2D功能,如2D物理等等实现游戏
2 用的是Unity3D的3D模式,但是摄像机Z轴不动,也可以做出2D游戏的效果来

热心网友 时间:2022-05-04 05:22

2D 为什么要出现立方体。。。不是正方形么??

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com