发布网友 发布时间: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?
#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?
// 初始化 D2D 管理器 public delegate System.UInt32 D2DManagerInit(); public D2DManagerInit m_D2DManagerInit;
[csharp] view plaincopyprint?
proc = GetProcAddressWrap(m_unityd2ddll, "D2DManagerInit"); m_D2DManagerInit = (D2DManagerInit)Marshal.GetDelegateForFunctionPointer(proc, typeof(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?
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;
然后对 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 为什么要出现立方体。。。不是正方形么??