Unity 之 plane.Raycast 射线检测

简介: 原来一直用Physics.Raycast或者对应的2D射线检测,今天无意中发一个有趣射线检测,话不多说直接上示例void Update()LateUpdate()示例代码using UnityEngine;publ...
原来一直用Physics.Raycast或者对应的2D射线检测,今天无意中发一个有趣射线检测,话不多说直接上示例

void Update()

img_839c4a591b45a63315dc2e743d5022ae.gif

LateUpdate()

img_4b5205ae3eef89b7877bc8d1d9000183.gif

示例代码

using UnityEngine;
public class PlaneRayExample : MonoBehaviour
{
    //需要移动的cube的预制
    public GameObject m_Cube;
    //距离射线原点的距离
    public float m_DistanceZ = 10.0f;

    Plane m_Plane;
    Vector3 m_DistanceFromCamera;

    void Start()
    {
        //这是离Plane放置的距离有多远
        m_DistanceFromCamera = new Vector3(Camera.main.transform.position.x, Camera.main.transform.position.y, Camera.main.transform.position.z + m_DistanceZ);
        //在距离m_DistanceFromCamera处,创建一个方向为forward的Plane
        m_Plane = new Plane(Vector3.forward, m_DistanceFromCamera);
    }

    void Update()
    {

        if (Input.GetMouseButton(0))
        {

            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            float enter = 0.0f;

            if (m_Plane.Raycast(ray, out enter))
            {
                Debug.DrawRay(ray.origin, ray.direction * enter, Color.green);
                //得到点击的点
                Vector3 hitPoint = ray.GetPoint(enter);
                //将你的方块游戏对象移动到你点击的地方
                m_Cube.transform.position = hitPoint;
            }
            else
            {
                Debug.Log($"enter{enter}");
                Debug.DrawRay(ray.origin, ray.direction * 10, Color.red);
            }
        }
    }

    Plane plane = new Plane(Vector3.up, Vector3.zero);

    private void LateUpdate()
    {
        if (Input.GetMouseButton(0))
        {
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            float ent = 100.0f;
            if (plane.Raycast(ray, out ent))
            {
                Debug.Log("Plane Raycast hit at distance: " + ent);
                var hitPoint = ray.GetPoint(ent);

                var go = GameObject.CreatePrimitive(PrimitiveType.Cube);
                go.transform.position = hitPoint;
                Debug.DrawRay(ray.origin, ray.direction * ent, Color.green);
            }
            else
            {
                Debug.DrawRay(ray.origin, ray.direction * 10, Color.red);
            }

        }
    }

}
相关文章
|
图形学
Unity射线检测的避坑指南
Unity射线检测的避坑指南
|
10天前
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
|
10天前
|
图形学
Unity 射线移动物体Ray
在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如"JQR")以便区分和操作。 示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。
|
11天前
|
图形学
unity 扇形范围检测目标
本文介绍了两种实现扇形范围检测的方法。第一种方法通过计算目标点与技能释放者之间的距离和夹角,判断目标是否在指定的扇形范围内。代码主要利用了`Vector3.Distance`和`Vector3.Dot`进行距离和角度的计算。 第二种方法则使用摄像机射线检测,分为两个脚本:一个挂载在摄像机上,负责发射多条射线并检测碰撞对象;另一个挂载在目标物体上,处理被发现后的逻辑。摄像机脚本通过`Physics.Raycast`检测敌人或障碍物,并调用目标物体的响应函数。该方法适用于更复杂的场景,如视野检测和敌人发现机制。
|
6月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
337 6
|
6月前
|
图形学
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
|
9月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
142 0
|
图形学
Unity小游戏——武士和怪物的碰撞检测
Unity小游戏——武士和怪物的碰撞检测
115 0
|
数据可视化 图形学
Unity射线编程详解
Unity射线编程详解
132 0