检查模型与两个不同物体之间是否同时发生碰撞

2023-12-07

在 VR Unity 项目中工作,尝试编写一些 C# 脚本。

我的角色模型有两只脚,在 VR 中使用跟踪器进行控制。我需要一种方法来找出双脚何时与立方体碰撞。同时,左脚使用立方体 A,右脚使用立方体 B。这样我就可以在满足条件时生成另一个对象。

该怎么做呢?什么对象应该有脚本?现在,立方体具有 OnTriggerStay 函数,用于检查与脚的碰撞并将立方体颜色更改为绿色。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckForFoot : MonoBehaviour {

    void OnTriggerStay(Collider other)
    {



    }
}

所以这个脚本被放在地板上的立方体上。立方体上有一个与脚相同的煤块。当碰撞发生时,我现在可以做一些事情,但我需要找出如何检查两个相同的立方体同时碰撞


该怎么做呢?

With Collider2D,那就是Physics2D.IsTouching(collider1, collider2)但这是 Collider/3D,不同的是,不存在内置 API 来执行此操作。这很复杂但也是可能的。以下是简化的步骤:

1.Use List of KeyValuePair存放接触的物体。

static private List<KeyValuePair<GameObject, GameObject>> collisionList;

使其成为static变量,以便该列表只有一个实例。

2.检测何时有触发器OnTriggerEnter.

触发检测脚本OnTriggerEnter函数必须附加到您想要检测彼此接触时的每个游戏对象。

3.检索刚刚互相接触的两个游戏对象。

您可以使用以下方法检索第一个this.gameObject和第二个 GameObject 通过使用other.gameObject;. The other变量来自于Collider other论据中的OnTriggerEnter功能。

4现在,检查两个 GameObject 是否存在于collisionList变量来自#1。如果没有,请添加它们。如果它们已经存在,请忽略它。


5。就像#2,检测何时有触发器退出OnTriggerExit。这意味着对象不再接触。

6.检索不再像您在中那样相互接触的两个游戏对象#3但在OnTriggerExit这次的功能。

7现在,检查两个 GameObject 是否存在于collisionList变量来自#1。如果他们确实将其从该列表中删除。如果他们不忽视的话。

什么对象应该有脚本?

附上CollisionDetection为您想要用另一个对象检测的每个游戏对象编写脚本。还要确保 Collider 的 IsTrigger 是enabled以及一个Rigidbody组件也附加到每个游戏对象。

using System.Collections.Generic;
using UnityEngine;

public class CollisionDetection: MonoBehaviour

{
    static private List<KeyValuePair<GameObject, GameObject>> collisionList =
        new List<KeyValuePair<GameObject, GameObject>>();

    void OnTriggerEnter(Collider other)
    {
        //Debug.Log("Trigger Entered");

        //Get the two Objects involved in the collision
        GameObject col1 = this.gameObject;
        GameObject col2 = other.gameObject;

        //Add to the collison List
        RegisterTouchedItems(collisionList, col1, col2);
    }

    void OnTriggerExit(Collider other)
    {
        //Debug.Log("Trigger Exit");

        //Get the two Objects involved in the collision
        GameObject col1 = this.gameObject;
        GameObject col2 = other.gameObject;

        //Remove from the collison List
        UnRegisterTouchedItems(collisionList, col1, col2);
    }

    public static bool IsTouching(GameObject obj1, GameObject obj2)
    {
        int matchIndex = 0;
        return _itemExist(collisionList, obj1, obj2, ref matchIndex);
    }

    private void UnRegisterTouchedItems(List<KeyValuePair<GameObject, GameObject>> existingObj, GameObject col1, GameObject col2)
    {
        int matchIndex = 0;

        //Remove if it exist
        if (_itemExist(existingObj, col1, col2, ref matchIndex))

        {
            existingObj.RemoveAt(matchIndex);
        }
    }

    private void RegisterTouchedItems(List<KeyValuePair<GameObject, GameObject>> existingObj, GameObject col1, GameObject col2)
    {
        int matchIndex = 0;

        //Add if it doesn't exist
        if (!_itemExist(existingObj, col1, col2, ref matchIndex))

        {
            KeyValuePair<GameObject, GameObject> item = new KeyValuePair<GameObject, GameObject>(col1, col2);
            existingObj.Add(item);
        }
    }

    private static bool _itemExist(List<KeyValuePair<GameObject, GameObject>> existingObj, GameObject col1,
    GameObject col2, ref int matchIndex)
    {
        bool existInList = false;
        for (int i = 0; i < existingObj.Count; i++)
        {
            //Check if key and value exist and vice versa
            if ((existingObj[i].Key == col1 && existingObj[i].Value == col2) ||
                    (existingObj[i].Key == col2 && existingObj[i].Value == col1))
            {
                existInList = true;
                matchIndex = i;
                break;
            }
        }
        return existInList;
    }

}

USAGE:

只需使用CollisionDetection.IsTouching(object1, object2)检查两个对象是否接触。

public GameObject foot1;
public GameObject foot2;

void Update()
{
    //Check if feet GameObjects are touching 
    bool touching = CollisionDetection.IsTouching(foot1, foot2);

    if (touching)
    {
        Debug.Log("<color=green>leg1 and leg2 touching</color>");
    }
    else
    {
        Debug.Log("leg1 and leg2 NOT touching");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查模型与两个不同物体之间是否同时发生碰撞 的相关文章

随机推荐

  • 如何将 TextView 声明为全局变量以在其他类中使用

    我是一名新的 Android 开发者 我想用同样的TextView在所有活动中 但是 我不知道如何将 TextView 声明为全局变量以及如何使用它来显示活动中的文本 请帮我 代码很简单 感谢每一位 将 id 的文本视图的 XML 代码编写
  • Java 是以小端还是大端读取整数?

    我问这个问题是因为我正在将字节流从 C 进程发送到 Java 在 C 端 32 位整数的 LSB 是第一个字节 MSB 是第四个字节 所以我的问题是 在Java方面 当我们读取从C进程发送的字节时 什么是endian在Java方面 后续问题
  • 从最后一行删除谷歌电子表格中的重复行

    我发现此代码用于删除谷歌电子表格中的重复行 从这个网址 https developers google com apps script articles removing duplicates function removeDuplicat
  • boost::bool_testable<> 是否被重新定位或删除?

    我正在尝试利用杠杆boost bool testable lt gt 来自 Boost Operators 为类实现安全 bool 习惯用法 但该库的最新版本 截至本文为 1 49 似乎不再具有它 它去哪儿了 现在有更好的替代方案吗 而我刚
  • Angular2 服务创建、显示和管理其内部组件?如何实现jsalert()?

    我试图找到一种在服务中拥有和管理 angular2 组件的方法 但没有成功 我需要创建 AlertService alertConfirm msg Promise AlertConfirm 将提示一个带有 2 个按钮 确定 取消 的确认窗口
  • 升级到 Windows 10 后 WMI 不工作

    我一直在 Windows 8 上的 Visual Studio 中使用以下代码作为控制台应用程序 以返回所连接的串行设备的描述和设备 ID 我在创建的应用程序中使用了该版本的修改版本 以自动检测 Arduino 的 COM 端口 自从我使用
  • Python 中的“线程本地存储”是什么,为什么需要它?

    具体来说 在 Python 中 变量如何在线程之间共享 虽然我用过threading Thread在此之前我从未真正理解或看到变量如何共享的示例 它们是在主线程和子线程之间共享还是仅在子线程之间共享 我什么时候需要使用线程本地存储来避免这种
  • C# - 为 Roman8 字符集创建自己的编码

    C 不支持 Roman8 字符集 但我需要正确使用它 编码 解码字符串 所以我想知道创建自己的编码以支持此编码的最佳方法是什么 够了吗 class Roman8Encoding Encoding 编码器呢 解码器 编码器回退 解码器回退 欢
  • 使用 RTTI 获取 Delphi 中组件的子属性

    我想使用 RTTI 访问以下属性 MyComponent1 Property variable SubProperty 我想要这样的东西 var Ctx TRttiContext Typ TRttiType SubTyp TRttiType
  • 使用 Str_Replace 替换多个单词

    我想用一个特定单词替换多个同义词 结果 本田是一辆汽车 雷克萨斯是一辆汽车 日产是一辆车 赛恩是一辆汽车 有人可以告诉我一种干净的方法 用 汽车 一词替换 车辆 卡车 轿跑车 轿车 而不是我单独替换所有 4 个词
  • 错误:元素应该是“select”,但却是“a”

    当我尝试从下拉列表中选择一个选项时 我收到错误 元素应该是 选择 但却是 a 下面是我的源代码 WebElement element dr findElement By id m1tlm0 Select select new Select
  • 使用函数接口抽象公共代码的问题

    在这里我实现了以下两个功能 如下所示 Output1 computeFirst Input1 input String lockName input getId LockItem lockItem acquireLock lockName
  • 计算已售库存/股票的利润/资本收益

    我有一个 Google 表格 适用 Excel 公式 其中包含 2000 笔交易 其结构如下 链接到 Google Sheet 其中包含示例计算 我需要计算每个卖单的利润 即先进先出资本收益 并将该金额放入第五列 如图所示 这可以通过传统公
  • 为 clion 配置 SFML (Windows)

    我正在我的 Windows 计算机上为学校项目设置工作环境 我们将使用 C 和 CLion 制作一个基本游戏 为了制作游戏 我需要使用 SFML 库 我已经遵循了一些教程 但我似乎无论如何都无法让它工作 I have 下载 CLion 并使
  • 为什么Python请求无法解析TikTok API数据?

    我正在使用请求库向 TikTok 发出 Python 请求 我设法挖掘出他们的用户详细信息的 URL 我不知道这是否合法 如果不合法 请告诉我 当我尝试将其解析为 json 时 它会引发异常 有人可以帮我解析 修复这个问题吗 这是代码 Py
  • 计算一个字母在一个单词中出现的次数

    我有一句话describe 我想看看每个字母在单词中出现了多少次 例如 e 出现两次 d 出现一次等等 我努力了 for letter map str seq describe count re seq letter describe 但我
  • 如何使用更少的 import 语句导入 Java 中的多个类? [复制]

    这个问题在这里已经有答案了 我对在 Java 中使用包还很陌生 我想知道是否有一种更简单的方法来使用更少的 import 语句导入类 我正在使用处理并且我已经开始使用用于处理的 Box2D创建一些游戏 为了使用该库 我必须将以下内容添加到我
  • 为什么这个表达式的计算结果为 0?

    为什么表达 5 lt 3 lt 1 在 MATLAB 中计算结果为 0 每个单独的语句都评估为 true 所以我很困惑为什么它的评估结果为 false 因为它实际上看起来像这样 5 lt 3 lt 1 5 1 最终答案 0
  • 实施 UserDefaults 时遇到问题

    我以前有编码经验 但对 Swift 和 iOS 都非常陌生 我正在开发一款供个人使用的应用程序 以将我用来帮助管理多动症的多个不同应用程序的功能合并到一个地方 该应用程序的主视图提供了一种跟踪日常支出的方法 我正在尝试使用 UserDefa
  • 检查模型与两个不同物体之间是否同时发生碰撞

    在 VR Unity 项目中工作 尝试编写一些 C 脚本 我的角色模型有两只脚 在 VR 中使用跟踪器进行控制 我需要一种方法来找出双脚何时与立方体碰撞 同时 左脚使用立方体 A 右脚使用立方体 B 这样我就可以在满足条件时生成另一个对象