Unity 射线移动物体Ray

简介: 在Unity中,通过射线检测实现3D物体的拖拽和移动。射线由起点和方向组成,使用`Physics.Raycast`检测与物体的交点。点击物体时,记录位置偏移量,拖动过程中更新物体位置。代码包括基本拖拽和上下拖动功能,适用于正交摄像机场景。测试时为物体设置特定标签(如"JQR")以便区分和操作。示例代码展示了如何通过鼠标事件控制物体移动,并结合层级掩码优化射线检测。具体实现包括:点击选中物体、拖动更新位置、释放鼠标取消选择。此外,提供了上下拖动的额外功能,通过按键切换模式。

效果如下图
link

在 Unity 中使用射线移动物体的原理主要基于射线检测和物体位置的更新,下面为你详细阐述相关原理及实现步骤。
射线检测原理
射线检测是一种在三维空间中从一个点沿着特定方向发射一条无限长的射线,并检测该射线与场景中的物体是否相交的技术。在 Unity 里,射线由 Ray 结构体表示,它包含一个起点(origin)和一个方向(direction)。射线检测通过 Physics.Raycast 或 Physics.RaycastAll 等方法实现。

精准点击物体拖拽的效果 点击选中需要移动的物体,拖动物体,

物体是3D物体,摄像机是正交摄像机,

移动物体代码如下:

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

public class CameraRayObj : MonoBehaviour
{
    public Vector3 offects;
    private Transform cube;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            //给拖拽的物体一个tag值 JQR 方便区分
            //鼠标按下 记录鼠标点击物体的点到物体坐标位置的插值 
            if (Physics.Raycast(ray, out hit) && hit.collider.tag == "JQR")
            {
                cube = hit.collider.transform;
                offects = hit.collider.transform.position - hit.point;
            }

        }

        if (Input.GetMouseButton(0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            //射线打到后面板子,相当于物体的位置, 板子设置一个层级  
            if (Physics.Raycast(ray, out hit, 1000, 1 << 8) && cube != null)
            {
                //第一种方式
                //cube.position = v3-Vector3.forward*v3.z + hit.point-Vector3.forward*hit.point.z;
                //第二种方式
                cube.position = new Vector3(hit.point.x + offects.x, hit.point.y + offects.y, cube.transform.position.z);
            }
        }

        if (Input.GetMouseButtonUp (0))
        {
            cube = null;
        }
    }
}

在加一个上下拖动的代码

代码如下:

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

public class ShengGaoCube : MonoBehaviour {
    Ray ray,ray1,ray2;
    RaycastHit hit,hit1,hit2;
    public Camera  cameraa;


    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKey (KeyCode .V))
        {
            this.GetComponent<ShuiYiTuoDong>().enabled = false;
            if (Input.GetMouseButton(0))
            {
                Debug.DrawLine(transform.position, hit.point);
                ray = cameraa.ScreenPointToRay(this.transform.position);
                LayerMask lm = 1 << 9;
                if (Physics.Raycast(ray, out hit, lm))
                {

                }
                ray1 = cameraa.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray1, out hit1))
                {
                    if (hit1.transform.name == "Cube")
                    {
                        this.transform.position = new Vector3(this.transform.position.x, hit1.point.y, this.transform.position.z);
                    }
                }
            }
        }
        else
        {
            this.GetComponent<ShuiYiTuoDong>().enabled = true;
        }


    }
}

最后自行测试即可

相关文章
|
4天前
|
安全 图形学
Unity射线检测的“坑”
在 Unity 中,射线检测是常用功能,但也存在一些常见问题。首先是层(Layer)设置问题,如射线忽略某些层或误检测到不期望的层,需正确设置 LayerMask。其次是碰撞体相关问题,包括碰撞体未启用或类型不匹配,确保碰撞体启用并合理设置属性。再者是射线起始点和方向问题,错误的位置或方向计算会导致检测失败,需准确设置起始点和方向。此外,频繁进行射线检测或检测范围过大会影响性能,应减少检测次数并合理设置范围。最后,在多线程中进行射线检测可能导致错误,应避免在非主线程中直接调用射线检测。
|
4天前
|
图形学
Unity 获取鼠标位置下的UGUI或3D物体
本文总结了两种检测方法,分别用于UGUI和3D物体的检测。第一种方法`GetOverUIobj`专门用于检测鼠标悬停的UGUI元素,通过`GraphicRaycaster`实现。第二种方法`GetOverWordGameObject`则同时适用于UI和3D物体检测,利用`PhysicsRaycaster`进行射线检测。两者均返回悬停对象或null。
|
4天前
|
图形学
unity 物体震动
在Unity中实现物体震动效果,主要通过改变物体的位置、旋转或缩放属性来模拟震动。以下是位置震动的实现原理及代码示例:通过随机生成微小偏移量并累加到物体位置上,在短时间内不断改变位置产生震动效果。生成随机偏移,并结合时间控制持续震动。
|
4天前
|
前端开发 图形学
unity UGUI跟随3D物体的坐标转换
在 Unity 中实现 UGUI 元素跟随 3D 物体,关键是将 3D 物体的世界坐标转换为屏幕或画布坐标。通过 Camera.WorldToScreenPoint 方法,可将 3D 物体位置映射到屏幕上,再更新 UGUI 元素的位置。代码示例展示了如何使用该方法,使 UGUI 图像跟随 3D 模型,并提供文字显示、图像和线条的显示/隐藏功能。
|
4天前
|
存储 图形学 索引
unity 使物体跟随路径点自动移动位置
在Unity中,物体沿路径点自动移动的核心原理是通过预设路径点,控制物体依次移动。路径点可用空对象或三维向量数组定义,并按顺序存储。移动时,计算当前位置与下一个路径点的向量差以确定方向,使用`Vector3.MoveTowards`逐步靠近目标点。代码实现包括路径点设置、移动控制及插值计算,确保物体平滑移动和旋转。
|
4天前
|
图形学 开发者
unity 从工具栏拖动生成物体
在 Unity 中实现从工具栏拖动生成物体的功能,基于编辑器扩展、事件系统和预制体实例化。通过自定义编辑器窗口、处理鼠标事件(按下、移动、释放)及使用 Instantiate 方法,可实现拖动并生成预制体物体。代码示例展示了如何检测鼠标事件并在指定位置实例化物体。
|
6月前
|
前端开发 图形学
Unity精华☀️UI和物体可见性的判断方法
Unity精华☀️UI和物体可见性的判断方法
|
6月前
|
数据可视化 图形学
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
|
6月前
|
图形学
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
小功能⭐️Unity中利用材质自发光实现物体闪烁效果
|
6月前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
322 6