最近有个接活的机会,需求是制作一个在地图上展示广告位的应用。于是我决定先做一个简单的demo给对方看看是否符合要求。
我决定使用godot游戏引擎来做,不过我也并不是很熟悉godot。所以让号称编程能力最强的claude ai来帮助我。
godot的是个游戏引擎,使用它还需要很多操作,不是仅仅编码就可以的。claude ai能指导我吗?
下面是我的提示词,特地规定了输出答复的格式中包括“操作步骤”的部分。
# Role
你是godot游戏制作专家。
## profile
专业,思考细腻周全,逻辑严密。
## task
### 任务目标
按用户要求,为使用godot游戏引擎制作游戏提供步骤指导和编写相应的GDscript代码。
### 游戏玩法描述
一个简单的地图展示应用,
- 用3D引擎实现;
- 游戏主体是一个有地图贴图的的正方形平面;
- 在平面上面有若干定位图标,这些图标都是独立的几何体;
- 当点击这些定位图标中的任何一个时,摄像机都会移动将被点击的图标置于画面中心,然后向该图标推近,将它放大;
- 再画面中增加一个平面,正面朝向摄像机,平面的纹理贴图是一个和改图标相对应的jpg照片;
- 屏幕又下有一个“home”按钮,点击它,摄像头将移动到初始位置,展示整个地图和所有定位图标;
### 任务要求
步骤描述里面要给出需要建立哪些节点,进行哪些设置。需要使用GDscript脚本在脚本项目下给出。
### 输出格式
<xxxx>为占位符
"""
### 步骤描述
<步骤描述>
### 所需脚本
<GDscript脚本>
## 任务初始化
按照 <task> 中用户所提游戏玩法描述,完成<task>.<任务目标>,并按<输出格式>输出
下面是claude给我的回复:
我将帮您设计这个3D地图展示应用。让我们按步骤实现这个功能。
步骤描述
场景构建:
创建一个新的3D场景,根节点设为Node3D
添加以下子节点:
MeshInstance3D (命名为"Ground") - 用于显示地图
Camera3D - 用于观察场景
DirectionalLight3D - 提供基础光照
Control - 用于放置UI元素
若干MeshInstance3D作为位置标记(命名为"Marker_1", "Marker_2"等)
Sprite3D (命名为"PhotoPlane") - 用于显示照片
节点设置:
Ground:
设置为PlaneMesh
应用地图贴图材质
适当调整大小
Camera3D:
设置初始位置(0, 10, 10)和俯视角度(-45度)
Marker:
使用CylinderMesh或自定义3D模型
设置合适的缩放和位置
添加碰撞形状(CollisionShape3D)和Area3D组件
PhotoPlane:
初始隐藏
设置为始终面向摄像机
Control:
添加Button子节点,设置为"Home"按钮
放置在屏幕底部中央
交互实现:
为每个Marker添加点击检测
实现摄像机动画过渡
实现照片展示和隐藏
实现Home按钮功能
所需脚本
gdscriptCopy # 主场景脚本 (main.gd)
extends Node3D
var camera: Camera3D
var photo_plane: Sprite3D
var tween: Tween
var initial_camera_pos: Vector3
var initial_camera_rot: Vector3
func _ready():
# 获取节点引用
camera = $Camera3D
photo_plane = $PhotoPlane
# 保存相机初始状态
initial_camera_pos = camera.position
initial_camera_rot = camera.rotation_degrees
# 设置照片平面初始状态
photo_plane.visible = false
# 为所有标记添加信号连接
for marker in get_tree().get_nodes_in_group("markers"):
marker.input_event.connect(_on_marker_clicked.bind(marker))
func _on_marker_clicked(camera: Node, event: InputEvent, position: Vector3, normal: Vector3, shape_idx: int, marker: Area3D):
if event is InputEventMouseButton and event.pressed and event.button_index == MOUSE_BUTTON_LEFT:
move_camera_to_marker(marker)
func move_camera_to_marker(marker: Area3D):
# 停止之前的动画
if tween:
tween.kill()
# 创建新的动画
tween = create_tween()
tween.set_parallel(true)
# 计算目标位置和旋转
var target_pos = marker.global_position + Vector3(0, 2, 3)
var target_rot = Vector3(-20, 0, 0)
# 设置相机动画
tween.tween_property(camera, "position", target_pos, 1.0).set_trans(Tween.TRANS_CUBIC)
tween.tween_property(camera, "rotation_degrees", target_rot, 1.0).set_trans(Tween.TRANS_CUBIC)
# 显示对应照片
tween.tween_callback(func():
photo_plane.texture = load("res://photos/" + marker.name + ".jpg")
photo_plane.global_position = marker.global_position + Vector3(0, 2, 0)
photo_plane.visible = true
)
func _on_home_button_pressed():
if tween:
tween.kill()
tween = create_tween()
tween.set_parallel(true)
# 恢复相机初始状态
tween.tween_property(camera, "position", initial_camera_pos, 1.0).set_trans(Tween.TRANS_CUBIC)
tween.tween_property(camera, "rotation_degrees", initial_camera_rot, 1.0).set_trans(Tween.TRANS_CUBIC)
# 隐藏照片
tween.tween_callback(func():
photo_plane.visible = false
)
# 标记脚本 (marker.gd)
extends Area3D
func _ready():
# 将标记添加到组
add_to_group("markers")
没想到AI真的理解了我的意图,照着它的步骤一步一步的操作,将给出的代码脚本关联到对应的节点上,真的可以正常工作。
Upvoted! Thank you for supporting witness @jswit.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
很详细的教程 good
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit