首页 > 其他分享 >Unity在进行射线检测时忽略掉指定的碰撞器

Unity在进行射线检测时忽略掉指定的碰撞器

时间:2023-08-22 16:22:47浏览次数:40  
标签:hit collider 碰撞 RaycastHit 忽略 start Unity return public

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

public class Test : MonoBehaviour
{
    public Transform startPoint; // 起始点
    public Transform endPoint; // 结束点

    public List<Collider> ignoreList;

    private void Start()
    {
        if (Linecast(startPoint.position, endPoint.position, ignoreList, -5, out RaycastHit hit))
        {
            Debug.LogError(hit.collider.name);
        }
        else
        {
            Debug.LogError("no find");
        }
    }

    /// <summary>
    /// 射线检测可以忽略指定的Collider,
    /// </summary>
    bool Linecast(Vector3 start, Vector3 end, List<Collider> ignored, int layerMask, out RaycastHit raycastHit)
    {
        Vector3 direction = end - start;
        RaycastHit[] hits = Physics.RaycastAll(start, direction.normalized, direction.magnitude, layerMask);

        //返回的数组是无序的,按距离start的远近,排下序
        System.Array.Sort(hits, (left, right) => { return left.distance.CompareTo(right.distance); });

        foreach (RaycastHit hit in hits)
        {
            //检测到的点不是起始点
            if (hit.point != start && hit.point != end)
            {
                //检测到的物体没有在忽略名单里
                if (!Contains(ignored, hit))
                {
                    raycastHit = hit;
                    return true;
                }
            }
        }
        raycastHit = default;
        return false;
    }

    /// <summary>
    /// 等于或在Collider的内部
    /// </summary>
    public bool Contains(List<Collider> colliders, RaycastHit hit)
    {
        foreach (var collider in colliders)
        {
            if (collider == hit.collider || collider.bounds.Contains(hit.point))
            {
                return true;
            }
        }
        return false;
    }

}

 

标签:hit,collider,碰撞,RaycastHit,忽略,start,Unity,return,public
From: https://www.cnblogs.com/Jason-c/p/17648832.html

相关文章

  • Unity TextMeshPro使用自建中文字体
    TextMeshPro  TextMeshPro是Unity新一代字体,是Unity的最终文本解决方案。它是UnityUIText和旧版TextMesh的完美替代方案。功能强大、易于使用、性能高效。目前TextMeshPro对中文的支持也还可以,不过默认不能用,需要自己成生成。  本文就介绍TextMeshPro中文字体文件的......
  • 震惊!CSS 也能实现碰撞检测?
    本文,我们将一起学习,使用纯CSS,实现如下所示的动画效果:上面的动画效果,非常有意思,核心有两点:小球随机做X、Y方向的直线运动,并且能够实现碰撞到边界的时候,实现反弹效果小球在碰撞边界的瞬间,颜色发生随机的变化嗯?很有意思的效果。看上去,我们好像使用CSS实现了碰撞检测。然......
  • [Lua][Love Engine] 有效碰撞处理の类别与位掩码 | fixture:setFilterData
    有效的碰撞处理只用IF判断假设在一个物理世界,不希望两个同类实体发生碰撞,那么localbegin_contact_callback=function(fixture_a,fixture_b)localentity_a_type=fixture_a:getUserData()localentity_b_type=fixture_b:getUserData()--如果碰撞的两个实体不......
  • Unity 资源加载的两种方式:Resources和AssetBundle最详细的解析(转)
    https://blog.csdn.net/xinzhilinger/article/details/115408934前言:在游戏开发学习初期,游戏体量较小,如果游戏场景需要Asset中的资源,我们可能会通过拖动的方式,将其添加到游戏场景中。而到了实际工作中,会发现再这样做就会使得各种拖动的资源非常复杂,难以查找与维护关于资源:在......
  • GDAL在Unity3D中的使用(一)
    1.上官网选择对应版本  https://www.gisinternals.com/query.html?content=filelist&file=release-1930-x64-gdal-3-6-3-mapserver-8-0-0.zip选择StableReleases然后选择对应得版本点进来后,一般下载第一个 把图中dll放到Unity的Assets文件夹下面我们之前建立的Plugins文件......
  • Unity Custom SRP
    CustomRenderPipelineProjectSetup我们需要在线性空间计算光照,所以设置为Linear。PipelineAssetUnity默认使用默认渲染管线,而在这里,我们通过PipelineAsset来管理自定义管线。进一步的,我们将资产的文件格式写成默认渲染管线的路径格式。默认的Csharp文件是游戏逻辑的文......
  • Three.js中实现碰撞检测
    1.引言碰撞检测是三维场景中常见的需求,Three.js是常用的前端三维JavaScript库,本文就如何在Three.js中进行碰撞检测进行记述主要使用到的方法有:射线法Raycaster包围盒boundingbox物理引擎Cannon.js2.RaycasterRaycaster用于进行raycasting(光线投射),光线投射用于进行鼠......
  • Unity 物体围绕自身中心旋转而非轴心
    ============================================================在上面两张图坐标中心都在轴中心,但是如果用Rotate进行旋转,第一张是正确的,第二张进行了缩放的物体旋转并不会围绕自身中心旋转.解决的方法://相对于某一个点旋转//point相对于哪个点旋转//axis相对于point的......
  • 跨界融合:人工智能与互联网、物联网的碰撞
    随着科技的快速发展,人工智能(ArtificialIntelligence,AI)已经成为推动社会进步和经济增长的重要驱动力之一。然而,仅仅依赖于人工智能技术本身并不足够,我们需要将其与其他领域进行跨界融合,以实现更广泛的应用和创新。本文将深入探讨人工智能与互联网、物联网的碰撞,探讨其在各个领域中......
  • 根据键名多少来生成配对,超过键名个数的键值被忽略 默认遍历keys()
    foriin{k:vfork,vinzip(range(10,40,10),range(3))}:#默认遍历keys()print(i)foriin{k:vfork,vinzip(range(10,40,10),range(3))}.items():#遍历元组print(i){k:vfork,vinzip(range(10,30,10),range(30))}#根据键名多少来生成配对......