如何将滑动速度和位置转换为对象速度

2024-03-14

我正在开发一款“踢球门”类型的游戏,目的是自学 Unity 3d。我有我想要的界面和功能,游戏看起来像这样:

我在 OnUpdate 中使用一些代码来检测鼠标按钮何时首次按下(或触摸阶段开始)以及何时释放(或触摸阶段结束),并计算滑动方向、距离和持续时间。我想将这些信息转化为“启动”足球的初始速度,但数学似乎有点超出我的范围。

我从这样的事情开始:

rigidbody.velocity = new Vector3(
    Mathf.Min(15, swipeDelta.x * .13f),
    Mathf.Min(20, swipeDelta.y * yRatio),
    5 / swipeDuration);

这当然在我最初的分辨率和纵横比下效果很好,但一旦我改变其中任何一个,就会惨遭失败。我希望代码的分辨率和纵横比更加不可知,或者至少是相对的。上面代码中使用的数字完全是任意的,并且根据迭代测试发现,在我的初始分辨率下可以产生理想的结果。

有什么建议么?


这个想法是获取起点和终点之间的距离和持续时间,并将它们用作速度。

我使用 ScreenToWorldPoint 获取从屏幕坐标到世界坐标的鼠标位置,以便计算世界中的距离,而不是屏幕的像素密度或分辨率。

预期的最小/最大值是在进行任何调整之前获得的功率值。为了获得良好的值,您可以对最小值进行慢速/短划操作,对最大值进行快速长划操作。

所需的最小/最大值是可以产生所需结果的任意值。

您可能需要根据游戏的方向来旋转速度。现在,向上滑动会给出正 y 值,向右滑动会给出正 x 值。

Vector3 startPos;
float startTime;

void Update () 
{
    if (Input.GetMouseButtonDown(0))
    {
        //Store initial values
        startPos = Input.mousePosition;
        startTime = Time.time;
    }

    if (Input.GetMouseButtonUp(0))
    {
        //Get end values
        Vector3 endPos = Input.mousePosition;
        float endTime = Time.time;

        //Mouse positions distance from camera. Might be a better idea to use the cameras near plane
        startPos.z = 0.1f
        endPos.z = 0.1f

        //Makes the input pixel density independent
        startPos = Camera.main.ScreenToWorldPoint(startPos);
        endPos = Camera.main.ScreenToWorldPoint(endPos);

        //The duration of the swipe
        float duration = endTime - startTime;

        //The direction of the swipe
        Vector3 dir = endPos - startPos;

        //The distance of the swipe
        float distance = dir.magnitude;

        //Faster or longer swipes give higher power
        float power = distance / duration;

        //expected values are what power you get when you try 
        //desired values are what you want
        //you might want these as public values so they can be set from the inspector
        const float expectedMin = 50;
        const float expectedMax = 60;
        const float desiredMin = 15;
        const float desiredMax = 20;

        //Measure expected power here
        Debug.Log(power);

        //change power from the range 50...60 to 0...1
        power -= expectedMin;
        power /= expectedMax - expectedMin;

        //clamp value to between 0 and 1
        power = Mathf.Clamp01(power);

        //change power to the range 15...20
        power *= desiredMax - desiredMin;
        power += desiredMin;

        //take the direction from the swipe. length of the vector is the power
        Vector3 velocity = (transform.rotation * dir).normalized * power
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将滑动速度和位置转换为对象速度 的相关文章

  • Blender 与 Unity [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 尝试 Azure 与 Unity 连接时出现“NotImplementedException”(c#)

    我使用的是Unity 2019 3 6f1 我创建了一个简单的 DLL 用于连接到 Azure 并上传文件 但是 当我调用此 DLL 来尝试连接到 Azure blob 存储时 我得到以下堆栈跟踪 NotImplementedExcepti
  • 使用意图从 Unity 应用程序向 Android 应用程序发送数据

    我有两个独立的应用程序 AppA 使用 Android Studio 开发 和 AppB 使用 Unity 开发 AppA 将启动 AppB 这是一个游戏应用程序 用户玩完游戏 AppB 并点击退出按钮后 会将游戏记录 字符串数组 发送回A
  • Unity项目没有解决方案文件

    我刚刚开始学习 Unity 并且创建了一个项目 但我的项目中没有包含 sln 文件 每次我创建 C 脚本并在 Xamarin Studio 中打开它时 我都无法获得任何智能感知 unity项目中没有sln文件正常吗 如果没有 如何将解决方案
  • 如何更改Vuforia AR相机对焦模式?

    我在用Vuforia 6 2 AR SDK对于在Unity中 但是当我在 Android 手机中测试该应用程序时 相机看起来像blurry 我在 Vuforia 的开发者网站中搜索并找到了一些相机对焦模式 但我无法实现 因为该指南适用于较旧
  • Unity使用Invoke在另一个脚本上调用方法

    我有两个脚本 其中一个重新启动场景 另一个是倒计时器 而不是在第一个脚本中调用重新启动场景方法 但是 它没有重新启动 即使没有错误 我也不明白为什么 重新启动场景的第一个脚本 using UnityEngine using UnityEng
  • 如何计算 RectTransform 中的 sizeDelta?

    我编写了自定义布局所需的自定义内容适配程序 所以 我需要控制RectTransform sizeDelta当锚点不同时属性 但我无法显示该值 我不需要Unity3D API参考资料 我读了它 但什么也没得到 因为它只说 此 RectTran
  • 使用 Unity 3D 移动鼠标时相机跟随玩家

    我有一个简单的脚本 当我转动相机时 可以移动和环顾四周 但相机不随角色转动 我如何让它们一起转动 using System Collections Generic using UnityEngine public class PlayerF
  • 从通用平面获取轴对齐坐标

    标题可能是错误的 因为我不知道足够的数学知识来实际用一个小句子描述我的问题 我有一个 3D 矢量闭环 我将其称为 3D 多边形 我需要对其执行仅 2D 操作 这将返回一个 不同的 2D 点集 我需要将这些新的 2D 点转换回 3D 我目前的
  • 2D 弹跳公式无法正常工作

    我是 Unity 的新手 我正在尝试创建一个弹跳球 所以我做了很多关于弹跳相关物理的研究 我找到了一个公式 Formula 2 V dot N N V 其中 V 是速度矢量 N 是球弹跳表面的法线 这是我的脚本 using UnityEng
  • Unity HTML5 错误:找不到编码 1252 数据

    我使用的是 Mac 在 Google Chrome 中执行我的小应用程序时 出现 不支持代码页 1252 的 pb 我正在使用Unity 2017 年 6 月测试版为了整合几何健身房IFClib 的编码为 NET 4 6 现在在最后一个 U
  • Total Blank Unity / Microsoft Store Build 未通过 WACK 测试

    我一直在努力为我的游戏取得成功统一 2018 2 1f1 and 视觉工作室 2017 15 8 0 尝试为 Windows 商店成功构建 打包 WACK 失败后所有 每个不同的配置 我尝试了完全空白默认Unity UWP平台应用程序 生成
  • 快速移动的球与鼠标控制的球拍的碰撞检测问题

    在统一中 我有一个应该击球的球拍 并且球拍直接由鼠标控制 即鼠标使用鼠标轴移动球棒并使用 translate 函数移动球拍 我预计 Unity3d 的物理特性不会直接通过鼠标正确地转换球拍的运动并相应地影响球 我必须编写一些自定义的内容 结
  • 与动态功能模块(应用程序包)一起安装时“存储空间不足”

    我有一个使用 Android App Bundle 的 DFM 动态安装的 Unity 项目 使用 Unity 2019 3 导出 并将其上传到 google play 进行内部测试 动态模块可以按需下载 但是当我运行 UnityActiv
  • 获取单位圆上 (0, 0) 处的随机点

    我正在使用 Unity 和 C 并且想编写一个函数 以 0 0 单位圆上随机点的 Vector2 形式返回 x 和 y 坐标 好像有一个功能UnityEngine Random insideUnitCircle 得到单位圆内的随机点 有Un
  • 创建对话框/弹出窗口

    有这样的代码 bool b EditorUtility DisplayDialog Test Reset or continue Reset Continue if b ResetGame 但它仅在编辑器中有效 在游戏中无效 如何将 Edi
  • Unity Transform.LookAt 仅在一个轴上

    我一直在开发一款游戏 进展非常顺利 从这里得到了一些帮助 我再次需要它 所以我正在制作一个 2D 自上而下的射击游戏 我需要我的敌人看着玩家 显然敌人会在所有轴上旋转 因此是无敌的 或者看起来很奇怪 那么 如何让它只在Z轴上旋转呢 另外 如
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 除了在 Unity3D 中使用“Assets/Gizmos”之外,如何拥有自定义脚本图标

    我知道这个问题可能被问过很多次了 但它经常被回答错误 我想要的是 Use a custom icon for specific components scripts in the Inspector e g Figure 2 and Fig
  • foreach 循环为 Unity 中的按钮赋值时出现问题

    我正在尝试在 Unity 中为我的游戏制作一个类似 Candy Crush 的地图 我正在尝试将所有按钮收集到一个数组中 然后设置其 onclick 属性 这样当我单击它们时 我就可以达到我想要的级别 我正在使用 Foreach 循环来实现

随机推荐