欢迎学习此 Unity 2D 拖放教程。我将在此处创建一个基本脚本,以便您可以在 Unity 游戏中具有拖放功能。如果您想进行库存管理、超休闲拖放机制等等。
创建拖放式 Unity 空白项目
首先,我们将创建一个空白的 Unity 2D 项目。我们将添加一个基本正方形和一个脚本来实现此拖放机制。因此,我从一个空白的 Unity 项目开始,如下所示。
Unity 拖放教程 – 空白项目
接下来添加一些文件夹,如下所示,我们将添加一个 object 文件夹和一个 scripts 文件夹。
Unity 拖放教程 – 文件夹
在 objects 文件夹中,右键单击并创建一个 sprite-> 方块。
Unity 拖放教程 – 创建方形 Sprite
获得正方形后,您需要向其添加 boxcollider2d。
Unity 拖放教程 – 2D 盒式碰撞体
接下来,在 scripts 文件夹中右键单击并创建一个名为 DragAndDrop 的 c# 脚本。
Unity 拖放教程 – C# 脚本
完成后,将脚本添加到你的方格中,我们几乎可以编写代码了。
Unity 拖放教程 - 附加脚本
为 Unity 项目编写拖放代码
所以只是为了解释我们将要做什么。我们将采用鼠标输入并允许拖动我们的对象。我们将通过从鼠标位置和正方形检查碰撞体来实现此目的,如果我们单击正方形,我们将能够使用我们在代码中设置的状态来拖动它。
现在打开您的 c# 脚本。我们要做的第一件事是声明一些变量。其中一个是 Collider2D,canMove 是一个布尔值,一个名为 draging的变量是一个布尔值。我们首先将 draging和 canMove 变量设置为 false,并将 Collider2D 设置为正方形的碰撞器。为此,请查看下面的代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragAndDrop : MonoBehaviour
{
bool canMove;
bool dragging;
Collider2D collider;
void Start()
{
collider = GetComponent<Collider2D>();
canMove = false;
dragging = false;
}
在此之后,我们需要首先获取鼠标相对于世界的位置。为此,我们需要使用我们的主相机并将 mousePos 变量设置为鼠标位置的 Screentoworldpoint 转换。完成此作后,我们需要检测鼠标按钮按下单击并检查鼠标位置是否与方块的碰撞器重叠。
如果我们点击我们的对象,让我们的方块移动并设置一个拖动标志。然后我们最后需要检查我们的鼠标按钮是否已被抬起,并将我们所有的标志设置为 false。
这是完成这项工作所需的代码。
// Update is called once per frame
void Update()
{
Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (Input.GetMouseButtonDown(0))
{
if (collider == Physics2D.OverlapPoint(mousePos))
{
canMove = true;
}
else
{
canMove = false;
}
if (canMove)
{
dragging = true;
}
}
if (dragging)
{
this.transform.position = mousePos;
}
if (Input.GetMouseButtonUp(0))
{
canMove = false;
dragging = false;
}
}
}
运行我们的代码
返回 Unity 并点击播放按钮,您现在应该可以在场景中拖动方块了。它应该如下所示。
太好了,现在我们已经使用鼠标输入完成了此作,让我们看看如何使用移动输入执行此作。
Unity 移动拖放
现在,让我们使用已有的代码,看看如何使用移动输入来执行拖放作。Unity 使用 getmousebuttondown 原生处理触摸,但我们希望确保这适用于所有设备,因此我们也将使用触摸计数。我们将使用触摸计数来帮助我们和移动输入系统的其他功能。这是完整的代码。我将在下面解释。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DragAndDrop : MonoBehaviour
{
bool canMove;
bool dragging;
Collider2D collider;
void Start()
{
collider = GetComponent<Collider2D>();
canMove = false;
dragging = false;
}
// Update is called once per frame
void Update()
{
Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
if (Input.GetMouseButtonDown(0) || Input.touchCount == 1)
{
if (collider == Physics2D.OverlapPoint(mousePos))
{
canMove = true;
}
else
{
canMove = false;
}
if (canMove)
{
dragging = true;
}
}
if (dragging)
{
this.transform.position = mousePos;
}
if (Input.GetMouseButtonUp(0) || Input.touchCount <= 0)
{
canMove = false;
dragging = false;
}
}
}
因此,为了使拖放功能在移动设备上更好地工作,唯一添加的新内容是触摸计数的检测。这只是帮助我们确保触摸确实发生在移动设备上。因此,您将在 getmousebuttonup 部分中看到,我们现在还检查了小于零的 touchCount,因此基本上,如果没有触摸或出现负触摸计数异常的可能性,我们就会假设这是 mouseup。在按下鼠标部分,我们有 Input.touchCount == 1,它确保我们只检测到一次触摸,而不是多次触摸,以避免任何奇怪的错误,即移动设备无法确定我们触摸的确切位置。
有关 Unity 拖放功能的一些常见问题
如何在 Unity 2d 中拖动对象?
如果要在 Unity 中添加拖放功能,则需要创建一个 c# 脚本,用于处理触摸/单击、拖动和移动的状态,然后在移动设备上释放按钮或触摸的状态。
如何在 Unity 中拖放?
为了在 Unity 中添加拖放功能,您需要添加一个 c# 脚本来处理触摸/单击、拖动和移动,最后在移动设备上释放按钮或触摸的事件。
Unity 有拖放功能吗?
Unity 本身不支持此功能。这意味着您需要实现一些 c# 代码,以便在 Unity 项目中进行拖放工作。
你如何在 Android 上拖动?
要允许移动拖放,您需要在 Unity 中使用移动输入系统。这将需要您跟踪触摸点。
如何在 Unity 中使用触摸移动对象?
如果要使用触摸在 Unity 中移动对象,则需要在 c# 脚本中使用触摸点功能。
文章引自GP