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射线检测的避坑指南
|
3月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
172 6
|
3月前
|
图形学
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
小功能⭐️Unity解决物体移动速度过快不能检测到碰撞
|
6月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
114 0
|
11月前
|
图形学
Unity小游戏——武士和怪物的碰撞检测
Unity小游戏——武士和怪物的碰撞检测
|
11月前
|
数据可视化 图形学
Unity射线编程详解
Unity射线编程详解
102 0
|
图形学
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
398 0
|
图形学
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用
430 1
Unity【RaycastHit】- 关于射线投射碰撞信息中normal法线向量的运用