小工具知识网

当前位置: 首页 > 行业知识 > dnf手游版游玩感悟

行业知识

dnf手游版游玩感悟

2026-11-11 07:09:52 来源:互联网转载

      dnf手游于5月21号正式上线,作为一个dnf端游老玩家,并且偶尔上线ppk,自然下载了手游版,且玩了几天。

      不得不说dnf手游的优化做到了极好的程度。

      就玩法系统这块,因为dnf属于城镇+地下城模式,相比现在的开放世界或者半开放世界3d手游,属于比较好优化的一类。

      比如城镇模块的切换进出口,做好加载卸载就能用时间换空间,通过加载进度页面掩盖卸载当前城镇加载下个城镇的目的。城镇中的各个区域的切换就不必考虑加载卸载了,一股脑都在场景里,通过坐标的移动和渐变黑屏的切换手法完成。

      再比如地下成的进入,同样使用加载卸载和进度页面,做到和城镇的互相切换。至于地下城不同房间,也是黑屏渐变切换+坐标移动即可。

      UI界面这块,dnf手游用到了动静分离和分帧加载。因为UI的绘制调用是以Canvas为单位的。所以当UI策划和UI设计师完成UI模块的设计后,UI程序根据实际的UI界面业务功能,将一个UI模块划分为永远不动的静态元素(如各个背景)+一直在动的活动元素(如动态生成的物品),配合UI对象池的使用。特别注意,此时的UI对象池设计上要考虑分帧生成的概念,比如要生成100个装备图标,不要在一帧内生成,此时如果一帧生成一个(或可配置个数)再缓存使用,则大大降低了单帧负载压力,可以让UI界面的响应速度加快。当然已经生成生成好的复杂UI界面,在退出时也可根据UI管理器的调度策略,并不销毁,而是移动坐标到视口外,再次使用则可快速加载。

      当然分帧加载的方案在需要高响应速度的地方都可以使用。

      地下城战斗系统这块,则是我的知识盲区了,虽然我做过卡牌战斗系统,但是和dnf这种手感的格斗游戏比起来,简直小巫见大巫,我一直觉得就手感这一块,没有超越dnf的格斗游戏。

      同时dnf手游有一点让我灵光一闪,很小的一个地方,就是子UI界面弹出,背景虚化这一块,如下:

      我已经好长时间没怎么做UI界面了,在我印象中,做子UI界面弹出的时候,为了怕和背景UI界面产生视觉上的融合,都会给一个黑色半透明背景,如下:

      感觉dnf手游这种高斯模糊挺好,虽然以前都用于3D和UI视觉分离这一块,但是移植到UI与UI之间也挺不错,这里顺便实现一下:

Shader "UIWindowPKG/UIBlurUnlitShader"{    Properties    {        _GaussSize("Guass Size",Range(0,10)) = 1    }    SubShader    {        Tags { "RenderType"="Opaque" }        LOD 100        GrabPass        {            "_GrabTexture"        }        Pass        {            CGPROGRAM            #pragma vertex vert            #pragma fragment frag            #include "UnityCG.cginc"            struct appdata            {                float4 vertex : POSITION;                float2 uv : TEXCOORD0;            };            struct v2f            {                float2 uv[9] : TEXCOORD0;                float4 vertex : SV_POSITION;            };            int _GaussSize;            sampler2D _GrabTexture;            float4 _GrabTexture_TexelSize;            static float gaussMatrix[9] = {0.05854983,0.09653235,0.05854983,0.09653235,0.1591549,0.09653235,0.05854983,0.09653235,0.05854983};            v2f vert (appdata v)            {                v2f o;                o.vertex = UnityObjectToClipPos(v.vertex);                float4 gpos = ComputeGrabScreenPos(o.vertex);                float2 guv = float2(gpos.x/gpos.w,gpos.y/gpos.w);                int c = 1;                for (int x = 0; x 

上一篇:印度服务器销量怎么样?

下一篇:在电脑里面怎么用服务器?