📅  最后修改于: 2023-12-03 15:31:00.535000             🧑  作者: Mango
Godot是一个流行的开源游戏引擎,它可以用来创建2D和3D游戏。在Godot中,将鼠标从屏幕坐标转换为世界坐标是非常有用的,这可以用于玩家控制角色的移动以及其他交互。
在这个教程中,我们将使用Go编程语言来实现这个功能。我们将介绍如何使用Godot中的输入系统,如何将鼠标从屏幕坐标转换为世界坐标,以及如何在Godot中使用Go编程语言。
在开始本教程之前,需要完成以下准备工作:
Godot的输入系统非常灵活,可以通过添加输入处理代码或使用Godot的内置输入脚本语言来处理各种输入设备。在这个例子中,我们将使用内置的Node._input()方法来处理鼠标输入。
下面是一个简单的输入处理函数,可以检测鼠标左键是否按下:
func _input(event *godot.InputEvent) {
if event.IsAction("mouse_left") {
if event.IsPressed() {
// 左键按下
} else {
// 左键松开
}
}
}
在这个函数中,我们检测鼠标左键是否按下。如果它是被按下的,我们可以执行其它操作。如果它被释放了,我们可以进行一些其他的操作。我们将在下一节中讨论如何将鼠标坐标从屏幕坐标转换为世界坐标。
在Godot中,屏幕坐标是指用户界面中鼠标的x,y坐标。但是,当我们需要将鼠标坐标转换为3D世界坐标时,我们需要知道一些其他的信息:
有了这些信息,我们可以使用以下代码将屏幕坐标转换为世界坐标:
func screenToRay(screen_position godot.Vector2) godot.Vector3 {
camera := GetNode("Camera") // 获取摄像机节点
viewport_rect := camera.GetViewport().GetVisibleRect() // 获取视口的可见矩形
viewport_size := camera.GetViewport().GetSize() // 获取视口的大小
mouse := screen_position.Clamped(viewport_rect.Position, viewport_rect.Size) // 从屏幕坐标转换到视口百分比坐标
// 将屏幕坐标转换为世界坐标
camera_transform := camera.GetGlobalTransform()
camera_projection := camera.GetCameraProjection()
ray_origin := camera_transform.origin
ray_direction := camera_projection.Unproject(mouse, ray_origin)
return ray_direction
}
在这个函数中,我们从Godot到屏幕百分比坐标中计算了光线。我们使用Viewports和CameraTransforms来将它们从屏幕坐标转换为世界坐标。
因为这个函数将从屏幕坐标转换为CameraProjection空间(这是在摄像机的正前方的空间),我们最终仍然需要将CameraProjection空间转换为WorldSpace坐标。这可以通过在CameraTransform中将所有这些矩阵组合在一起来完成。
现在您已经知道如何将鼠标坐标从屏幕坐标转换为世界坐标,接下来将介绍如何在Godot中使用Go编写代码。
由于Godot使用GDScript作为内置脚本语言,因此本教程中的示例将使用Godot的ProceduralScript,它允许您在Godot中编写Go代码。
在下面的示例中,我们将创建一个新的Node,并将其绑定到2D/3D场景中的MeshInstance上。这将允许我们将Node附加到场景的对象上,并在Godot中检测鼠标输入。
package main
import (
"github.com/ShadowApex/godot-go/godot"
"github.com/ShadowApex/godot-go/godot/demos/common"
)
func init() {
godot.RegisterClass("MouseTo3D", "Node2D", &MouseTo3D{})
}
type MouseTo3D struct {
godot.Node2D
model godot.MeshInstance
}
func (m *MouseTo3D) _Ready() {
m.model = GetNode("/root/Main/Model").(godot.MeshInstance)
}
func (m *MouseTo3D) _Input(event *godot.InputEvent) {
if event.IsAction("mouse_left") && event.IsPressed() {
mouse_position := GetViewport().GetMousePosition()
ray_direction := screenToRay(mouse_position)
mesh_intersection := common.MeshIntersection(m.model, ray_direction)
if mesh_intersection.Collides {
translation := mesh_intersection.Position
translation.Z = 0 // 确保将其置于场景的平面
// 创建新节点
var node godot.Node2D
godot.ClassDB.New("Node2D", &node)
// 将其绑定到我们刚刚的条目
node.SetPosition(translation)
AddChild(&node, true)
}
}
}
在我们的示例中,我们创建了一个新的NodeTo3D类。我们使用godot.RegisterClass注册了该类,并将其绑定到Node2D Base类。
类的_init()函数初始化了我们的实例,我们查找了场景中的Model,并将其绑定到模型属性。在_input()函数中,我们使用我们定义的screenToRay()函数将输入事件转换为射线。
当用户点击左键时,我们使用射线来进行MeshIntersection。如果射线与模型发生碰撞,我们就在场景的交点处创建一个新的Node。
本教程演示了如何使用Go编程语言将鼠标坐标从屏幕坐标转换为世界坐标。我们展示了如何使用Godot的内置输入系统,以及如何使用Godot的ProceduralScript来编写Go代码。
我们还展示了如何将屏幕坐标转换为Go数据类型,并将它们与Godot的摄像机和视图相关联。