在 Unity 2D 中拖动对象

2024-04-03

我正在寻找 Unity 2D 的对象拖动脚本。我在网上找到了一个很好的方法,但它似乎只能在Unity 3D中工作。这对我来说不好,因为我正在制作 2D 游戏,而且它不会以这种方式与“墙”发生碰撞。

我尝试将其重写为 2D,但使用向量时遇到了错误。

如果您能帮我将其重写为 2D,我将非常高兴。

以下是在 3D 中运行的代码:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(BoxCollider))]

public class Drag : MonoBehaviour {
    private Vector3 screenPoint;
    private Vector3 offset;

void OnMouseDown() {

    offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
}

void OnMouseDrag()
{
    Vector3 curScreenPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
    Vector3 curPosition = Camera.main.ScreenToWorldPoint(curScreenPoint) + offset;
    transform.position = curPosition;
}
}

对于使用此代码时遇到问题的人,我使用 ScreenPointToRay 来使用代数光线投射(快速)来确定对象应距离相机多远。这适用于正交相机和透视相机

此外,该对象可以使用Collider能够被拖来拖去。所以没有必要使用[RequireComponent(typeof(BoxCollider2D))].

对我来说效果很好的最终代码是:

using UnityEngine;
using System.Collections;

public class DragDrop : MonoBehaviour {
    // The plane the object is currently being dragged on
    private Plane dragPlane;

    // The difference between where the mouse is on the drag plane and 
    // where the origin of the object is on the drag plane
    private Vector3 offset;

    private Camera myMainCamera; 

    void Start()
    {
        myMainCamera = Camera.main; // Camera.main is expensive ; cache it here
    }

    void OnMouseDown()
    {
        dragPlane = new Plane(myMainCamera.transform.forward, transform.position); 
        Ray camRay = myMainCamera.ScreenPointToRay(Input.mousePosition); 

        float planeDist;
        dragPlane.Raycast(camRay, out planeDist); 
        offset = transform.position - camRay.GetPoint(planeDist);
    }

    void OnMouseDrag()
    {   
        Ray camRay = myMainCamera.ScreenPointToRay(Input.mousePosition); 

        float planeDist;
        dragPlane.Raycast(camRay, out planeDist);
        transform.position = camRay.GetPoint(planeDist) + offset;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Unity 2D 中拖动对象 的相关文章

  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • IEnumerable 的 String.Join(string, string[]) 的类似物

    class String包含非常有用的方法 String Join string string 它从数组创建一个字符串 用给定的符号分隔数组的每个元素 但一般来说 它不会在最后一个元素之后添加分隔符 我将它用于 ASP NET 编码 以用
  • 锁定 ASP.NET 应用程序变量

    我在 ASP NET 应用程序中使用第三方 Web 服务 对第 3 方 Web 服务的调用必须同步 但 ASP NET 显然是多线程的 并且可能会发出多个页面请求 从而导致对第 3 方 Web 服务的同时调用 对 Web 服务的调用封装在自
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • C# 处理标准输入

    我目前正在尝试通过命令行断开与网络文件夹的连接 并使用以下代码 System Diagnostics Process process2 new System Diagnostics Process System Diagnostics Pr
  • 带有运算符语法的错误消息,但不带有函数语法的错误消息

    为什么我在调用 unary 时收到错误消息 使用运算符语法 如果我用函数语法调用它就可以了 现场演示 https godbolt org z j7AbeQ template
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 在 C++11 中移出 stdpriority_queue 的元素

    最小的工作示例 include
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 你好,我最近正在开发我的新游戏,我遇到了*无限跳跃*的问题

    所以基本上当我按跳跃 空格键时我会跳跃但是如果我连续按空格键它 只是跳啊跳啊跳等等 我不想要我只想它跳一次 code if Input GetKeyDown space isGrounded velocity y Mathf Sqrt ju
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 将错误代码映射到 C++ 中的字符串

    将错误代码从枚举映射到字符串的更有效方法是什么 在 C 中 例如 现在我正在做这样的事情 std string ErrorCodeToString enum errorCode switch errorCode case ERROR ONE
  • 使用多线程进行矩阵乘法?

    我应该使用线程将两个矩阵相乘 有两件事 当我运行程序时 我不断得到 0 我还收到消息错误 对于每个错误 它在粗体行上显示 警告 从不兼容的指针类型传递 printMatrix 的参数1 我尝试打印输出 还要注意 第一个粗体块 这是我解决问题
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • printf或iostream如何指定点后的最大位数

    字符串采用什么格式printf or iomanip我应该使用 iostream 中的运算符以以下格式打印浮点数 125 0 gt 125 125 1 gt 125 1 125 12312 gt 125 12 1 12345 gt 1 12
  • 这种尺寸对齐是如何工作的

    对于所提供的评论 我无法理解以下代码 这段代码的作用是什么 以及等效的代码是什么8 aligned segment size must be 4 aligned attr gt options ssize 3 Here ssize is o
  • 将 Swagger 与命名空间版本的 WebApi 结合使用

    我已经找到了如何使用基于名称空间的 WebAPI 版本这个班 https aspnet codeplex com SourceControl changeset view dd207952fa86 Samples WebApi Namesp
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可

随机推荐

  • 有没有办法让 WPF 应用程序尊重 Windows 10 中深色/浅色主题的系统选择?

    Windows 10最近添加了深色模式 有什么方法可以让我的 WPF 应用程序尊重此设置吗 最好是一个可以自动翻转它的开关 但如果没有 我想我可以在某处读取系统设置并切换到我的代码或其他东西中的备用主题 没有直接的 API 事件来检测 wp
  • # 符号的 HTML 字符实体是什么?

    符号的 HTML 字符实体是什么 我四处寻找 英镑 不断返回货币 哈希 和 数字 但我尝试的似乎没有变成正确的字符 您可以在以下位置搜索单个字符 文件格式信息 http www fileformat info info unicode ch
  • T-SQL:DROP 表级联约束等效吗?

    在 Oracle 中 我可以发出 DROP TABLE 级联约束 它不会抱怨 FK 等 T SQL 中有等效的吗 对于那些希望获得更普遍适用的答案的人 这将找到约束 删除它 然后删除列 感谢蒂姆 伦汀并投票如何查找默认约束的名称 https
  • Erlang 进程和消息传递架构

    我手头的任务是读取大文件的行 处理它们 并返回有序结果 我的算法是 从评估工作负载的主进程开始 写在文件的第一行 生成工作进程 每个工作进程将使用 pread 3 读取文件的一部分 处理这部分 并将结果发送给 master master接收
  • ggplot2 热图,图表之间具有固定比例的颜色条

    我需要绘制 3 个不同的图 设置相同的比例范围颜色 我有 3 个具有不同值范围的矩阵 例如 range matrixA 0 60 0 85 range matrixB 0 65 0 95 range matrixA 0 5 1 0 我希望对
  • 运行 Google Web 应用程序脚本后出现空白屏幕

    我正在通过 Google Sheets 开发一个签到应用程序 并希望创建一个搜索功能 该功能将运动名称作为 HTML 表单中的输入 然后从 HTML 表格中的工作表返回有关运动的信息 但是 当我尝试测试网络应用程序时 没有任何反应 我怎样才
  • 从 Android 应用程序堆栈中手动删除活动

    我一直在开发 Android Native App 我想做的是 Activities A gt B gt C Then A gt B gt C gt C 从 C Activity 中 如果它再次指向 C 那么我想手动从堆栈中删除 C B 在
  • 在 O(1) 空间中从流中选择随机项

    使用恒定空间以均匀概率从流中随机选择一个项目 该流提供以下操作 class Stream def init self data self data list data def read self if not self data retur
  • 如何在 opencv 版本 4.4.0 上正确使用 cv2.findContours()?

    我正在尝试在 opencv 版本 4 4 0 中使用 cv2 findContours 我使用Python版本3 8 5 但它抛出一个错误 我无法弄清楚 我不确定代码有什么问题 这是一些背景 根据 OpenCV 的语法cv2 findCon
  • 查找 iPhone 中两个日期之间的总天数

    我想查找两个日期之间的总天数 例如今天是 01 01 2011 DD MM YYYY 第二个日期是 25 03 2011 我如何找到总天数 NSDate currentdate NSDate date NSLog curretdate is
  • 基于向量键合并数据框

    我是一个绝对的初学者 希望有人能够帮助我解决合并问题 我今晚大部分时间都在解决这个问题 并且迄今为止无法成功地将解决方案应用于此特定示例的类似问题 我制作了一个虚拟数据框和向量来帮助说明我的问题 dumdata lt data frame
  • 如何将日期范围格式化为“MMM,d”?

    我正在尝试显示当前日期的周数以及周数的日期范围 现在日期范围格式是 DateTime 我想将其更改为 Jan 13 关于如何解决这个问题有什么建议吗 override func viewDidLoad super viewDidLoad l
  • Excel:从日期字符串中提取数字

    我有几个格式错误的日期列 我正在尝试将这些列转换为 月 年 和 start day 列 这是一个示例 January 13th 2018 January 13th 14th 2018 January 5th 7th 2018 January
  • 如何实现 Angular 的“盒子里的香蕉”与自定义元素的双向绑定?

    我正在尝试构建一个将由 Angular 应用程序使用的自定义元素 自定义元素将采用一个 prop 并可能对其进行操作 我的理解是我可以使用 盒子里的香蕉 来处理这个绑定 又名
  • 仅当变量为空时才分配变量

    在 Ruby 上有这样的东西 var value 基本上 这意味着 var将被分配 value 除非 var尚未分配 例如 如果 var is nil 我正在 Kotlin 上寻找相同的东西 但到目前为止 最接近的是 elvis 运算符 有
  • 为什么 Jekyll Remote_theme 的 `_config` 文件中的站点变量不可访问?

    According to this https jekyllrb com docs themes pre configuring theme gems40 Jekyll will read in a config yml at the ro
  • python -m:查找模块规范时出错

    根据 python 文档 m标志应该执行以下操作 在 sys path 中搜索指定模块并执行其内容 main module 当我简单地运行我的脚本时python命令 一切正常 由于我现在想从更高级别导入某些内容 因此我必须使用以下命令运行脚
  • Elasticsearch:在关闭数据节点之前撤出所有数据?

    有没有办法告诉节点删除其所有数据 将其分散回其他节点 以便我可以将其关闭 并且在其关闭后不处理重新平衡 重新复制 如果每个分片有 2 个副本 并且删除了一个节点 则某些分片现在只有 1 个实时副本 必须重新复制 如果可以的话 我宁愿在任何一
  • C# 文件创建 - 如何授予 IUSR DELETE?

    我有一个用 C 编写的控制台程序 它在用户 foo 下运行 该程序创建一个文件 在某些情况下 在 IUSR 下运行的 Web 应用程序需要能够删除控制台应用程序创建的文件 我想在创建文件时向 IUSR 授予 DELETE 或任何等效的操作
  • 在 Unity 2D 中拖动对象

    我正在寻找 Unity 2D 的对象拖动脚本 我在网上找到了一个很好的方法 但它似乎只能在Unity 3D中工作 这对我来说不好 因为我正在制作 2D 游戏 而且它不会以这种方式与 墙 发生碰撞 我尝试将其重写为 2D 但使用向量时遇到了错