前言:现在负责新开的SLG项目,趁现在还没有完全立案忙里偷闲讲一些SLG地图相关的开发经验与心得。这篇文章主要目的是分享我在项目中遇到的一些问题,温故知新,同时也算是抛砖引玉,希望能跟各路大佬一起优化方案。
现在这篇主要是讲大地图相关的一些方案和经验。PS:现在项目处于立案阶段,以下所说方案不一定能够满足项目的所有需求
分析:
地图分两块:一、表现,二、数据
数据分两种:一、本地,二、网络
地图上的表现主要分三种:
一、建筑、NPC等
二、 地表、山体、水、各种地形
三、特效相关(天气系统,各种特效)
地图上的数据主要分两种:
一、配置在网格上
二、配置在配表上
(当然以上两种可以配合使用)
重点:
表现和数据分层
策划的表现及数据配置
美术的表现及数据配置
数据之间的分层
相关的性能
开发软件:Unity2019.4
一、表现
一、建筑、npc相关
分析:u3d自带的网格系统功能已经比较齐全,获取网格以及坐标转换或者说网格整体的配置等功能有开放的接口及配置,能够满足大多需求。同时unity有自带Tile Pattle(网格画板系统) 用于网格的可视化操作。此系统主要是用于地图表现及数据的配置,原生的系统以及基本满足策划与美术的配置需求减少开发时间,同时该系统也开发不少接口,能够让开发人员重写画笔方法以及瓦片编辑相关的操作。
方案:参考现在市面上的slg游戏,基本有建筑和npc等物体。基本可以使用unity上面的Tilemap(网格系统) 进行制作。
注意点:
支持正方形和菱形瓦片的创建。
支持瓦片旋转,配合摄像机产生透视效果
Tile Pattle的一些基础的接口
画笔菜单
一些重写接口
二、 地表、山体、水、各种地形
分析:这部分比较杂可以有各种各样的实现方案,主要还是要按需求进行制作,比如说可以编辑的网格水,流动和河流,3D的山体,以及一些地形,地表。
方案:如果是水流、河流的话可能就是 Particle System(粒子系统) ,如果是可以编辑的范围的水流的话可能就要重写下GridBrush(画笔),或者说使用Shader去制作。如果是3D物体的话可能就要用到Terrain(地形系统),使用DDC(数字内容制作)相关软件(Maya、3DMax、Blender、Substance全家桶等等...)。
注意点:最好不要用太多3D物体,大地图是slg的一个核心系统,同时大地图的性能优化一直是个问题。而且如果为了节省性能使用低模的3D模型,在拉近时的表现有时会低于2D的(这里是参考了海外有上线的某SLG游戏)。
最后说一下地表,分开说是因为这部分大概会比较固定。
方案1:网格拼凑
方案2:图片(精灵)地表
分析:使用方案1网格的话,不太利于表现和美术资源的制作.首先只能一块块拼接,在交界处肯定会不太和谐(地表肯定是重复的),而且美术制作的时候还需要把原图出来后再分成一张张网格状图片,制作成本加大。后续替换地表时也是个问题,只能一张张替换。可能就地表比较简单时使用。
综合以上这边使用的是方案2。理由上面说:符合传统美术资源制作流程和方便后续迭代。然后这里面的平铺方案有两个,一个是使用利用无缝滚动实现地表绘制。
二是Sprite配合Shader进行平铺。先把Sprite的WarpMode中的Repeat,这样对超出的uv值进行重复采样。然后再使用一个可以普通采样的shader在属性面板上加上参数配置再进行即可(这里给出个简单的shader)
Shader "Custom/Scroll" {
Properties{
_MainTex("Texture", 2D) = "white" {}
_Color("Color", Color) = (1,1,1,1)
_Scroll("Scroll", Vector) = (0,0,0,0)
}
SubShader{
Tags { "RenderType"="Opaque" }
LOD 100
Lighting Off
Pass {
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert
#pragma fragment frag
#pragma target 2.0
float2 _Scroll;
sampler2D _MainTex;
float4 _MainTex_ST;
half4 _Color;
struct a2v
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
float2 texcoord : TEXCOORD0;
};
v2f vert(a2v v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
o.texcoord.x += _Scroll.x;
o.texcoord.y += _Scroll.y;
return o;
}
half4 frag(v2f i) : SV_Target
{
half4 col = tex2D(_MainTex,i.texcoord);
return col * _Color;
}
ENDCG
}
}
}
通过调整scroll参数进行位移,这个优点是只有一张图个人觉得是最好的方案了。但是要计算它的滚动速度,这里给出一个我个人用的公式。
X轴速度 = ((1 / 地表宽度) * 100 )+ 摄像机的x位移
y轴同理,这里的100是unity的默认设置
三、特效相关(天气系统,各种特效)
分析:特效相关的基本就是一个怪物的动效,主城的防护罩之类的特效,然后还有就是天气系统。 前者需要逻辑触发所以基本不需要配置。后者也是需要逻辑配合,制作的话是使用Particle System(粒子系统),后面我会写一篇关于天气系统的分享。
二、数据
一、本地
分析:这里本地基本指的是策划在大地图上绘制的数据位置,然后配合配表中的数据项使用。
方案:基本流程就是策划在Tile Pattle(网格画板系统)使用画笔Brush(可自定义),在Tile上面点出数据,然后开发人员给个转换选项,把配置转为数据。(这边使用的json)
注意点:这里的数据配置是跟表现是分层的,同时数据之间也要分层。主要两点,可以保证数据之间区分,同时也能分开导出数据。以后如果有某一种数据废弃那就直接不导出不使用即可。
二、网络
分析:如果是地图随机生成之类的话不需要配置,但通常有禁止行走,禁止迁城等关乎数据的格子是需要前端配置的。
方案:导出数据共享给后端即可,这里使用json也是因为前后端好解析数据。
三、结语
这一次主要是分析了一下大地图表现以及数据配置的一些大体方案,其中很多细节都没有提及(主要是性能优化相关),下一篇打算说一下大地图的一些业务框架以及实现时的一些细节。