跳到主要内容

辅助功能

经过以上操作基本的功能都实现了,作为一个小项目来说可能有点单一了,于是我们继续对功能进行一些补充以求做出内容更丰富一些的项目。在这个案例中我们决定给车辆添加带有自身定位的小地图功能;除了可以拥有驾驶的乐趣还添加了一个第三人称相机,其中包含一个人物子节点,可以利用他与车辆进行简单的交互,也可以直接借助人物完成场景的漫游;由于没有给人物定位建立地图,于是使用了寻路指引的插件进行人到车辆的导航。下面就是具体的实现过程

小地图功能

小地图可以看到整个城市场景的俯视图,标识出车辆自身在场景中的位置。完整的介绍如下

场景搭建

首先,新建一个纹理图,命名成小地图用于将视口的画面绘制到屏幕上,实现小地图的画面;

其次,在小地图的纹理图下再创建一个纹理图节点,命名成自身位置三角图标用作小地图上显示车辆位置的小三角图标;

最后,新建一个视口节点,在这个视口下创建一个空相机,命名为”地图相机“,视口将通过这个相机渲染画面。

其中各节点的层级关系如图所示

将地图相机画面显示到小地图

首先可以对视口的大小进行设置,图中绿色方框所示,调整为500×500,这表示视口渲染的分辨率大小,其他设置保持默认。

其次选中小地图节点,点击属性面板中纹理里面的箭头所指图标,在弹出的栏中选择绿框圈起的ViewportTexture。此时纹理图就会显示视口中相机的画面。

地图相机设置

首先在主窗口中将视图置为顶视图,便于观察相机视角笼罩范围。

其次选中地图相机节点,对照主窗口的顶视图调整相机位置。查看属性面板,更改投影方式为正交,调整大小到正好框住所要显示在小地图之中的画面。地图相机的属性面板如图所示

此时对应主窗口视图如下,能看到一个紫色实线构成的方框恰好圈住了我们要在小地图上显示的范围就OK了。

最后主窗口切换到前视图,调整相机高度,超过场景中最高的节点高度。

自身位置三角图标设置

根据三角图标原始图片形状大小对其大小和中心点参数进行调节,最后达到与小地图本身大小成一个比较和谐的比例。具体参数参考如图

注意观察箭头方向是否和车头一致,小地图摆放是否和场景模型一致,如果翻转了,都可以启用垂直翻转按钮进行调整。

脚本实现

在小地图的纹理图节点上创建脚本。在脚本中主要需要实现将车辆模型在三维坐标系的位置和小地图上的二维坐标系的位置映射

export var character_path:NodePath #可以在属性栏调整的节点路径
onready var character = get_node(character_path) #节点路径对应的节点

func _physics_process(_delta):
if character == null:
return
#将三维中的X、Z坐标转换为二维中的X、Y坐标
var viewport_size = get_node("../视口/地图相机").size
var position_2d_x = character.global_transform.origin.x + viewport_size / 2+8 #调试箭头图标与车辆模型在小地图中X轴向上的位置
var position_2d_y = character.global_transform.origin.z + viewport_size / 12 #调试箭头图标与车辆模型在小地图中Z轴向上的位置
var position_2d_normalized = Vector2(position_2d_x, position_2d_y) / viewport_size #单位归一化完成等比例的坐标映射
var position_2d = position_2d_normalized * rect_size
var rotation_2d = -character.rotation_degrees.y
$自身位置三角图标.rect_position = position_2d #同步小地图中三角图标与车辆模型的旋转方向变化
$自身位置三角图标.rect_rotation = rotation_2dche

至此小地图功能添加完毕!

上车过程及交互

想要实现这个功能我们需要车辆模型能够检测到人物角色的靠近,进而通过会话框进行反馈交互。交互过程中是两个对象之间完成的,对象1我们已经有了,就是车辆模型。

首先我们需要在根节点下建立一个第三人称相机节点。

其次在车辆模型上挂载一个触发区域,一个确认会话框作为子节点完成车辆区域范围内的检测,交互。

具体节点之间层级结构如下

最后打开车身刚体(VehicleBody)节点上挂载的脚本完成逻辑串联,脚本实现如下。

func Third_Charactor_Entered(body):  #建立车辆触发区域检测到第三人称相机节点后事件
print(body)
if body == $"../../第三人称相机" :
$确认对话框.popup_centered(Vector2(0,0)) #确认对话框弹出

func _on_确认对话框_confirmed():
$"../../第三人称相机".get_parent().remove_child($"../../第三人称相机")
$"../../寻路指引".hide()
enable_drive = !enable_drive #可以开动汽车
set_camera("驾驶视角") #切换到第一人称驾驶视角

路径导航

为了第三人称相机下人物节点在寻找车辆模型的时候不至于迷失方向并且增添一些科技感,可以使用资源库中寻路指引的插件。跟之前使用的地形插件一样都需要进行下载,然后使用快速创建完成寻路指引节点的创建,再建立导航节点。

各节点层级如下所示

选择最主要的Meshinstance类型地面节点(占地面积最大的),然后点击主界面中的网格。在下图所示界面中选择创建导航网格。

最后选择寻路指引节点指定属性面板中需要的节点,模式选择Navigation Path如图所示。

这样整个项目所有功能就都完成了,想要导出项目的话可以参考项目发布指南