Unity---2d射线检测

目录

1.目标物体加对应的collider碰撞体

 2.调节ProjectSetting里的time 帧速

3.LayerMask设置

4.避坑代码


1.目标物体加对应的collider碰撞体

 2.调节ProjectSetting里的time 帧速

⚠️按需使用

3.LayerMask设置

Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略一些collider或Collision使用。

在代码中使用时如何开启某个Layers?

LayerMask mask = 1 << 你需要开启的Layers层。
LayerMask mask = 0 << 你需要关闭的Layers层。

比如:
LayerMask mask = 1 << 2; 表示开启Layer2。
LayerMask mask = 0 << 5;表示关闭Layer5。
LayerMask mask = 1<<2|1<<8;表示开启Layer2和Layer8。
LayerMask mask = 0<<3|0<<7;表示关闭Layer3和Layer7。

上面也可以写成:
LayerMask mask = ~(1<<3|1<<7);表示关闭Layer3和Layer7。
LayerMask mask = 1<<2|0<<4;表示开启Layer2并且同时关闭Layer4.

4.避坑代码

⚠️注意:相机需要设置为正交模式

using UnityEngine;

public class XXXContr : MonoBehaviour
{
    RaycastHit2D hit;
    private Transform hitObj;
   

    private void Awake()
    {
        
    }


    void Start()
    {

    }

    private void OnMouseDown()
    {
        Debug.LogError("down");

    }
    private void OnMouseDrag()
    {
        
    }
    private void OnMouseUp()
    {
        SetTableState(false);
    }

    private void FixedUpdate()
    {
        if (isMove)
        {
            //2d射线检测需要指定参与碰撞的layer 并且添加射线长度,否则会失效
            LayerMask layer = 1 << 8;
            hit = Physics2D.Raycast(_camera.ScreenToWorldPoint(Input.mousePosition), Vector2.zero, 100f, layer);
            Debug.DrawLine(Input.mousePosition, hit.point, Color.black);
            if (hit.collider != null)
            {
                hitObj = hit.transform;
                //Debug.LogError("------" + hitObj.tag + "------");
                //注意上调参与点击的spriteRender的z轴 使其距离摄像机更近,否则可能会被其他碰撞体盖住 影响点击响应
                transform.position = new Vector3(offsetX, offsetY, -5);
            }
        }
    }

  

    private void OnTriggerEnter2D(Collider2D collision)
    {
        //Debug.LogError("trigger:" + collision.tag);
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        //Debug.LogError("Exit:" + collision.tag);
    }
}
### 实现和使用Unity 2D射线检测 为了在Unity 2D项目中实现射线检测,通常会利用`Physics2D.Raycast`方法来发射一条从起点到终点的虚拟光线,并检查这条光线是否碰撞到了任何带有Collider2D组件的对象。 当涉及到UI交互时,考虑到所有的Raycast Targets都必须经过Graphic Raycaster的测试,最佳实践是仅在那些确实需要响应指针事件的UI组件上开启“Raycast Target”的选项。这样做可以减少每次Raycast操作所需处理的目标数量,从而提高性能效率[^1]。 对于场景中的游戏对象间的互动,则可以通过编写脚本来调用`Physics2D.Raycast`函数来进行射线投射。下面是一个简单的C#代码片段展示如何执行这样的射线检测: ```csharp using UnityEngine; public class Example : MonoBehaviour { void Update() { Vector2 origin = Camera.main.ScreenToWorldPoint(Input.mousePosition); RaycastHit2D hit = Physics2D.Raycast(origin, Vector2.zero); if (hit.collider != null) { Debug.Log("Hit object name: " + hit.collider.gameObject.name); } } } ``` 此段代码会在每一帧更新时计算鼠标位置的世界坐标作为射线源点(`origin`),并尝试沿零向量方向(即原地探测)进行一次射线检测。如果命中了某个具有Collider2D的游戏物体,则打印该物体的名字。 需要注意的是,在某些情况下改变Transform的父子关系或者调整其兄弟节点顺序都会触发OnTransformParentChanged回调,这可能会导致Graphics被标记为脏(dirty),进而影响布局重建与顶点重绘的行为[^2]。因此,在设计涉及频繁变换结构或层级变化的应用程序部分时应格外小心。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格拉格拉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值