meta data for this page
📚 技术框架及方案
此文档的内容可能已经过时,目前仅用于参考目的。
注意:这里并非是【常见问题】解答或解决方案,而是有关游戏世界场景等技术性框架解释和方案分析。 如果有兴趣了解有关《沙盘引擎》的开发时的一些小手段,或者某些特殊的场景分析,您可以尝试阅览。
当你可以试着了解一些世界框架的设计和原理时,可能会收获颇丰。
📒 引擎世界概念
《沙盘引擎》的设计初衷是实现一个纯净但积极扩展的世界。
默认的情况下,引擎会内置设计好许多预制部分,剩下的需要开发者使用脚本进行一些简单交互。
举例1:引擎本身已经实现了【载具】功能,开发者并不需要重写类似“单车、汽车、飞机”这些功能,只需要新建一个载具json,修改配置的属性和模型ID,然后就无需编码的组成了一个新的载具,同时也可以使用API代码让某个角色执行上车、下车、AI驾驶等功能。
举例2:引擎内置了【角色】【道具(手持)】这类的功能,开发者同样可以如上一样加入新的道具,也可以直接使用API将某个道具放置到某角色手中(或增删查改),或者让他直接AI使用,当然,很多情况下道具本身并没有功能,这也需要开发者进行代码绑定(部分道具,例如枪还是可以直接使用的,避免开发者重写射线这类相对复杂的操作)。
除此之外,例如世界的时间、天气这些也都内置了非常容易理解的API来使用,同时内置好了许多方便快捷的API和Event事件。
如果你尝试了解过编程相关知识,就会知道在《沙盘引擎》创造一个世界,确实十分方便。
以至于,哪怕有些玩家并不擅长编程,观察脚本也可以进行“照葫芦画瓢”,就像阅读一段文字一样,在尝试中不断进步。
//伪代码,仅供参考 function OnWorldLoad() { SetWeather(1); //如你所见,只需要这行代码,就可以调整天气为1,如果把1改成其他数字,就会有其他天气 SetTime(12, 30); //显而易见,这是调整时间为12:30 }
📒 多层建筑透视分层
注意:此部分内容可能是过时\计划内的,目前仅供参考。
如果细心了解过沙盘引擎,你会发现之所以命名为《沙盘引擎》,其中一个原因便是游戏视角主流是2.5D鸟瞰视角。
正因为这样的一个核心机制(虽然后续可能会支持其他视角),使用沙盘引擎衍生出的游戏大部分都是如此的视角方式,那么通常偶尔会遇到一些特殊类型模型的规范问题。
比如:游戏内添加一些可进入的建筑房屋,但是这样的视角默认由上到下看到的只能是“房顶”,看不到具体内部的布局和情况,这明显是不符合玩家常理的。
沙盘引擎在设计时考虑到了这个问题,所以增加了一种虚拟化的“楼层”方案:
当相机按照鸟瞰视角向下看去的时候,会自动检测当前跟随目标的“所在楼层”,并通过向上射线检测+半透明的方式反馈给玩家视角。
也就是说,如果有一个3层楼的建筑,玩家对象当前走进了第一层,那么相机视角将只能看到第一层内的信息(建筑模型、这一层的载具、对象等),其他的层模型会以半透明或全透明的方式剔除。
如果玩家对象走进了第二层,默认一层和三层都是“遮挡剔除”的(1层不透明,但由于3D遮挡所以默认不可见;2层可见;3层不可见、楼顶半透明)。
第三层原理和第二层差不多,利用3D遮挡本身的机制,无需隐藏1、2层(因为默认被挡在了下面),直接展示第三层即可,同时将第三层的楼顶半透明化。
如上文所述的问题和解决方案理解,目前并不能通过全自动的手段解决这个问题。
也就是说,如果想实现角色进入建筑后存在楼层或进入后半透明的功能,就必须要针对此类【可进入建筑】模型进行一些修改,当然,沙盘引擎内置模型库中的【可进入建筑】已经这样做了,如果开发者在自定义制作一个允许进入内部的建筑房屋模型,那么就需要按照介绍的方法《特殊建模规范》,针对模型进行特殊的修改,以适配“可进入建筑的视角机制”。
📒 世界组成层面
注意:此部分内容可能是过时\计划内的,目前仅供参考。
严格意义上来说,虽然《沙盘引擎》确实是开放世界的设计方式,但在一定程度上,仍然拥有一个基本的世界框架。
例如:《我的世界》虽然看起来是无限制的探索和生存,但下界、末影门、矿洞(地下)等仍然属于世界规范之一。
沙盘引擎世界亦然如此,我们在设计世界框架时(现版本)将它分成了几个部分:
世界组成 | 说明 |
---|---|
地上 | {地表高度} 包含及以上高度时 |
地下 | {地表高度} 以下高度时特点:会激活地表下(如矿洞)的感官效果 |
{地表高度}
应该可以通过API进行提前调整设定,例如有些开发场景并不需要“地表下感官效果”,那么就可以将这个值调的很低,因为高度不符合设定,所以就不会触发这种效果。
当然,多数情况下开发者应该并不需要考虑这个选项,大概总结就是默认地图之上就是地上,地图之下就是地下,这个默认值大概在Y轴-10
左右。
📒 独立世界机制
在实际游戏开发过程中,可能会遇到一些指定给某个玩家特别的设定。
比如很多人都玩过童年游戏《罪恶都市》,我们都大概记得大桥上有一个封锁的路障,只有达到某个目标后才会允许通行(路障消失)。
举一个不太恰当的例子,假设在一个游戏世界中,需要玩家自身等级>=10级才会解锁路障(也就是移除某个模型对象),但是这就可能出现多个玩家的情况下,有人达到等级,有人并没有达到等级,那么这个路障建筑到底如何移除?
这在单机游戏十分容易,甚至不需要有其他考虑,但在多人联机世界该如何处理?
这里就会有一个想象,能不能给不同的玩家设置不同的路障模型?
举一反三,这就需要用到【独立世界机制】。
在CModel.Create
等API使用时,允许传入一个参数World
,这里的本意是类似SAMP\VCMP中的网络同步通道,我们将这个概念尝试引入了《沙盘引擎》。
也就是说,默认玩家加入服务器后都复活在世界ID:0
,这是一个通用世界(大家都能看到),倘若我们将一个玩家角色、载具、模型的世界改为其他ID,那么就相当于创建了一个新的世界,只有当玩家角色的世界也改变到对应世界ID时,才会看到这个世界内所建立的东西,自然而然的,默认ID0下的世界内容将不再可见,直到玩家角色世界再次改为ID0。
通过此机制,可以实现一些有关【独立世界机制】的设定(例如独立的房屋之类等),但回到主题,这似乎并不能解决【独立路障】的问题?
没错,上面只是介绍了World功能的机制,如果想实现“只在某个玩家世界内有效”的独立效果,那么也很简单,只需要将World参数填写为player.UniqueWorld
即可解决这个问题,这个世界ID将表示“只有此玩家可见的私人世界”。
//伪代码 var player = Player.Find(0); //找到ID为0的玩家 CModel.Create(0, 3, Vector(0, 0, 0)); //在世界3创建了一个模型 CModel.Create(0, player.UniqueWorld, Vector(0, 0, 0)); //例如第二个参数是{World},在【这个玩家单独的世界】创建了一个模型,其他玩家不可见
虽然以上的逻辑并没有什么问题,但是也可能会出现“满级玩家带着萌新过桥”的情况,这样实现起来也是不会报错的,因为在满级玩家的世界里确实没有路障,但在萌新玩家的视角就会看到大佬带着自己开车“穿过”路障,这里只是提供一种开发逻辑,具体防止违和的措施需要开发者自行想象。
📒 剧情及RPG设计
此处内容等待补充。