预计开发一个模拟经营公寓的游戏!装修房子,租房子给人外小姐姐们!
【一】
【开发记录】
视图采用固定的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,这个将在后面讨论。