找回密码
 立即注册
查看: 777|回复: 8

Unity怎么制作让玩家建造房屋的功能呢?

[复制链接]
发表于 2021-2-18 09:24 | 显示全部楼层 |阅读模式
我自己在开发一个游戏,想做一个开放搭建的功能。搭建的墙体、地板都是做好的,但是怎么做一个让玩家自己搭建的功能呢?
发表于 2021-2-18 09:32 | 显示全部楼层
建造房屋是个挺综合的功能。
让玩家简单将墙体、地板摆出来,拼在一起,可以大致分解为以下几个功能点:
1、选择某个物体,比如一块地板、一块墙体。
2、点击屏幕的某个位置。点击屏幕的典型做法是用Unity的射线检测,获取坐标点。
3、在指定位置创建物体即可。
4、创建的物体以特定朝向摆放(可以做成横平竖直的),位置也要按网格固定(随意指定位置就对不齐了)。这是个小难点。
以上就是大致的制作思路。
我们做游戏的时候总会遇到这样的综合问题。解决思路是先把问题清晰地描述出来,想清楚具体需求;然后再把问题分解为一个个能够解决的小步骤,即所谓的还原法。
发表于 2021-2-18 09:33 | 显示全部楼层
作为一个用方块造船的游戏的开发者,我觉得这个问题我还能答。先留个提纲,之后有人看了补齐
我这边做的时候用了两种实现方式。第一种是把prefab实际化放置。这个详细的另外一个答主提到了
另外一种实现方式是直接生成mesh。这种能带来更大的自由度,但是开发难度也更大

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-2-18 09:35 | 显示全部楼层
谢邀
稍微想了一下,答案可能不严谨,仅供参考。
这个功能模块说简单也简单,说复杂也复杂。
说它简单是因为核心功能就是 从AB包实例化GameObject到指定位置 而已。
说它复杂是因为真正做起来要考虑很多额外的因素。
下面从简单到困难依次列举 我的世界 中的建造功能。
众所周知,我的世界建造的是一个个方块,可以垒成任何自己想要的形状,房屋的建造就更不在话下了。这种建造系统是最简单,最原始的,设定好位置,实例化GameObject即可。
进阶点的,地狱之门的建造,需要十个黑曜石建造和一个打火石启动。
我们知道,平时我们乱扔黑曜石并不会有什么异样,只有在把他们排成固定的形状之后才会触发相应的条件。就像下面那样
使用打火石启动后就变成了这样了
如果让我来做,我会这样处理
每释放一个方块,就监测它相邻的方块是否能够构成一个完整的建筑,如果可以,就执行相关代码,把一个完整的建筑展现在玩家面前。(当然对于这个地狱之门来说不需要那么麻烦,只需要在用打火石的时候检测一次就行了,更加通用的就是我说的这种。)
具体的做法是如何呢?

先假设游戏世界除了引擎给的那一套坐标(即GameObject.Transform.Position),还有一套自定义的坐标系,他们全是整数坐标,也就是(0,0,0)这种形式的,并使用笛卡尔右手坐标系。
我们先提前用Excel表配置好规则,假设黑曜石索引为10001,打火石索引为20001。
这里的地狱之门就是
在Excel表用本地坐标表示就可以配置成:(0,0),(0,1),(0,2),(0,3),(1,0),(1,3),(2,0),(2,3),(3,0),(3,3),(4,0),(4,1),(4,2),(4,3)。然后在设置一个启动条件,即打火石的20001索引号。这里使用二维坐标的理由是,在我们自定义的坐标系下所搭建成的地狱之门一定是与x轴/z轴平行的,所以可以忽略一个维度。
具体的逻辑该怎么写呢?

首先定位难点,最大的难点就是如何检测目标是否匹配我们预先配置好的建筑规则
在地狱之门的例子里,需要先把一定范围的所有相邻的黑曜石都搜集起来(相邻体现在任意两个相邻的黑曜石,他们一定是在x/y/z轴的其中一个上的坐标是相等。)具体做法就是随机选定一个黑曜石,沿着x,y,z三个轴坐标+1/-1(需要保证其余两个轴坐标不变)进行搜寻,如果找到就加入一个临时数组。全部搜集完毕就开始进行下一步的排序工作,即以一个轴为基准(提前判定好当前地狱之门以哪个坐标轴为方向进行延伸的)进行二维排序,把得到的数组元素做一下位置修改(修改成以左上角为原点,x正向向右,y正向向下)得到本地坐标,与Excel表中的规则进行对比,即可得知是否符合条件。
总结

这里只举了我的世界中一个简单的小例子,还有很多更加复杂的情况,但是万变不离其宗,就算你是堡垒之夜那种类型的游戏,一样可以这样处理。
总结一下就是选定自定义坐标系,Excel配表,实时获取游戏物体坐标并对其进行二次处理,把得到的数组与Excel表中的数据进行对比,来最后评判是否达成条件。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2021-2-18 09:40 | 显示全部楼层
啊,刚好最近研究了一个unity插件
ALS Ritter:Unity建造系统插件(BuildSystem)使用说明这个应该是你说的那个吧
发表于 2021-2-18 09:46 | 显示全部楼层
你是模拟城市 还是 我的世界
我的世界,纯体素盒子搭建,需要处理光照渲染和chunk batch 问题
小规模可以不考虑性能问题
模拟城市,一种是单独的摆放家具
一种可拼接循环 tile元素
这种最好参考模拟城市的系统
发表于 2021-2-18 09:50 | 显示全部楼层
容易想到的思路,要么是上帝视角(单独用一个观察视角,可以俯瞰全局),要么是玩家拖着组件去搭建(类似辐射4的建造系统)。
基础思路就是相机正中发出射线(有最大长度,可选是否被其他物体拦截),当前选中的零件就放在那个射线远端,预计算当前选中的零件和周围物体的干涉关系(比如两个墙要相互衔接上,那么现在预计摆放的墙就要适应当前已经在旁边的墙的位置和旋转角,屋顶和地板类似),确定位置后再摆放,就生成一个实体放在计算好的位置再赋予计算好的旋转角。
发表于 2021-2-18 09:53 | 显示全部楼层
《龙族幻想》家园系统
发表于 2021-2-18 10:02 | 显示全部楼层
类似我的世界那样的吧
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-23 18:48 , Processed in 0.094665 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表