/=\存图地点

游戏开发日志4月3日

预计开发一个模拟经营公寓的游戏!装修房子,租房子给人外小姐姐们!


【一】

【开发记录】

视图采用固定的x45正交相机,需要其中的物体-30度旋转,则创建的坐标体系相对于世界的坐标系需要-30度,在下面会说明

已经做了一个基本的坐标系统,单个坐标使用MapPosition保存

MapGrid中有一些【基本类】

  • MapPosition

  • 地板x,y,floor,pos(转-30度,提供一个回到正交的方法)

  • 可见,在地图中,X为横坐标,Y为纵坐标,对应x和z,floor为所在层,对应y

  • 每一个地图中的基本物体都应该包含有这个坐标

  • MapGrid

  • 地板的砖块,包括GameObject mesh(内含预制的MapGrid),一个地图坐标(和mesh保持一致),是否是可以通过(iswall),以及一些用于A*寻路的参数

  • 遗留问题:房间的墙和门!

  • 在A*寻路中,通过遍历周围的砖块来构造通路,然而在建造Room时,该砖块将因为Room的墙不可通向其某个相邻点。应当对这一点进行额外的处理

对于地图的层级管理

【Map层】

  • 由MapManager对地图进行管理。MapManager下属若干的Floor,当收到交互指令时,分发给对应的Floor进行操作

  • 同时因为正交的伪2D视角,底层的Floor的会被上层的Floor遮挡,在这里每次只允许一个Floor相应交互。通过Q和E来切换当前交互层,对当前层高亮,通过LayerMask来只接受到当前层的点击交互

  • 因此,在创建层时,需要对各Floor单独设置Layer

  • 通过tag来决定交互执行的内容,记得设置tag

  • 交互包括输入的交互指令,和AI的交互指令。对于输入的交互指令,通过鼠标射线检测,区分fixupdate和update,后者将在timeScale=0时依然工作。对于AI的指令,提供范用的接口。

  • 同时需要设置对交互接受者(即Player)的监听,确保他们完成一项指令,可以打断当前指令进行下一指令。

  • 遗留问题:怎么到院子里去!

【Floor层】

  • 创建一个Floor层,初始化改层的所有内容。该层内物体包括地板、墙(左右后)、一个电梯来达到其它层、一些障碍物(障碍物需要被分类以产生不同的交互)、一些装饰(在墙上的,不占用地板)、一些房间、一些公共场地(特殊的房间)

  • 地板层:GroundMap

  • 生成一个MapGrid的二维数组作为地板的坐标体系。

  • 提供一个生成在该Map上的两点之间的路径的方法。

  • 遗留问题:如何使用电梯!

  • 目前固定层电梯的位置,给出电梯出口和入口的位置

  • MapGridProperty:挂载在作为Grid的Mesh上的脚本,可以给Floor自己的位置,并判断自己身上是否有物体(即该地图格不可通过)

  • 障碍物:ObestaclManager

【一些想法】

主角应该有一些成长的属性,比如速度(影响走路),建造(放置物品,建造新房间等),创作(更多的装饰品),亲切(更容易获得好感),学习(获得技能点更快)


【二】

【开发记录】



首先去掉了MapGrid类!改成了挂载在预制MapGrid上的脚本MapGridProperty。Floor中存储的内容变为MapGridProperty类。

  • 在该类中除了原有的Grid类的内容,新增加了一个thing的物体。用来记录该格上是否有障碍物。

  • 将障碍物的mesh置于gird之下,通过grid的update方法发射射线,来检测该格此时是否被一些物体占用。

  • 在这里之所以置于grid之下,是因为如果置于其上,对于使用射线的鼠标点击,将不再能点击到grid,这是我们不希望看到的。

  • 另外,因为障碍物的mesh被放置在grid之下,我们想要和障碍物交互时,实际点击的将变成grid,但是对于伪2D的视角下,很多时候我们将无法点击到希望的grid。对于障碍物,我们将其分为两部分:即mesh和一个cube,cube同时也将用于渲染障碍物的具体图像。同样给cube添加collider,但是我们将cube置于一个单独的layer。这样,在必要点击地板的时候,检测floor的layer,而在希望交互时,我们将点击障碍物的layer。

  • 那么对于该layer,在mapmanager进行判断时,应该优先被考虑。即优先考虑用户希望进行的交互是对具体的障碍物(这里NPC同样适用)而非地板。

ObestaclManager类现在变成了ObestacleProperty类

  • 主要处理放置物体,点击交互(后续)

  • 对于放置物体,给该物体一个MapGridProperty的二维数组,大小由障碍物的体积决定,指向GroundManager中对应位置的等大小数组。

  • 对该数组遍历,如果已经是墙,物体变红。如果全不是墙,则可以放置。

  • 另外:总把物体放在某个grid上,而不是两个grid间。

  • 另外对于一些可以被使用的物体,需要标注它的使用区域,人物和物体交互实际是让人物到达使用位置后进行动作。类中的grid数组应该包含这个区域,并被特别标注。

  • 这样电梯就可以作为该类的派生类,即给电梯设定出口和入口。

【一些想法】

https://www.bilibili.com/video/av6459538 建筑模拟

在大楼左侧每一层设置一个车站口,一楼可以放置两个。电梯在最左边,一个门向外,一个门向大楼内。这个车站口的位置为一个额外的grid,即作为每一层的出口。

同时一楼将有一个额外的院子。意味着一楼将有另一张goundmap,这个将在后面讨论。


评论

© 植物园 | Powered by LOFTER