Unity SteamVR 2.x UGUI射线交互 +物品射线点击+物品抓起(超级简单)

这篇具有很好参考价值的文章主要介绍了Unity SteamVR 2.x UGUI射线交互 +物品射线点击+物品抓起(超级简单)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

刚开始先查看了其他道友的方案:1.Unity使用SteamVR2.0实现基本功能(瞬移,抓取物品,射线点击,UI交互等)_贪小心的博客-CSDN博客_unity steam vr

2.【Steam VR 2.0】5.射线操作UGUI-射线点击物体_恩博同学的博客-CSDN博客_htc steamvr 射线点击ui

嗯。。。试着尝试了一下,不是很好用,于是乎记得以前用过得的方法(别人做的,我只是使用者),剔除出来,整理一下。

一 UGUI射线点击:

使用插件:CurvedUI(CurvedUI+DOTween+Shaders+Sprites-其它文档类资源-CSDN文库),SteamVR Plugin(商店免费)

场景使用SteamVR 的Interactions_Example场景测试的

1.将CurvedUI 下的CurvedUILaserPointer预制体 放置 SteamVR的 Player 下。

Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)
  1. 其他设置

Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)
Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)
Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)
Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)
Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)
Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)
Unity  SteamVR 2.x  UGUI射线交互 +物品射线点击+物品抓起(超级简单)

二 物品射线点击:

继承重写类:CurvedUILaserBeam


using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System;
using Valve.VR;
using Valve.VR.Extras;
using UnityEngine.Events;

namespace CurvedUI
{
    /// <summary>
    /// This class contains code that controls the visuals (only!) of the laser pointer.
    /// </summary>
    public class CurvedUILaserBeam : MonoBehaviour
    {
        public SteamVR_Action_Boolean interactWithModel = SteamVR_Input.GetBooleanAction("GrabPinch");
        bool isActive = false;
        public event PointerEventHandler PointerClickModel;
        Transform previousContact = null;
        public virtual void OnPointerClickModel(PointerEventArgs e)
        {
            if (PointerClickModel != null)
                PointerClickModel(this, e);
        }
        GameObject itemObject = null;
        bool bo = false;

#pragma warning disable 0649
        [SerializeField]
        Transform LaserBeamTransform;
        [SerializeField]
        Transform LaserBeamDot;
        [SerializeField]
        bool hideWhenNotAimingAtCanvas = false;
#pragma warning restore 0649

        protected void Update()
        {
            //get direction of the controller
            Ray myRay = new Ray(this.transform.position, this.transform.forward);

            //make laser beam hit stuff it points at.
            if (LaserBeamTransform && LaserBeamDot)
            {
                float length = 10000;
                RaycastHit hit;
                if (Physics.Raycast(myRay, out hit, length, CurvedUIInputModule.Instance.RaycastLayerMask))
                {
                    length = Vector3.Distance(hit.point, this.transform.position);
                    CurvedUISettings cuiSettings = hit.collider.GetComponentInParent<CurvedUISettings>();
                    if (cuiSettings != null)//UI 界面
                    {
                       // Debug.Log("是 UI 界面");
                        //find if there are any canvas objects we're pointing at. we only want transforms with graphics to block the pointer. (that are drawn by canvas => depth not -1)
                        int selectablesUnderPointer = cuiSettings.GetObjectsUnderPointer().FindAll(x =>
                        x != null && x.GetComponent<Graphic>() != null && x.GetComponent<Graphic>().depth != -1).Count;

                        length = selectablesUnderPointer == 0
                            ? 10000
                            : Vector3.Distance(hit.point, this.transform.position);
                    }
                    else{ length = 0; }
                }
                else if (Physics.Raycast(myRay, out hit, length, LayerMask.GetMask("Obj")))
                {
                    //物品的 Layer 设置 Obj  ,挂载组件:BoxCollider,FT_InteractableRay
                    length = Vector3.Distance(hit.point, this.transform.position);
                    FT_InteractableRay FT_InteractableRay = hit.collider.GetComponentInParent<FT_InteractableRay>();
                    BoxCollider boxCollider = hit.collider.GetComponentInParent<BoxCollider>();
                    if (boxCollider != null&& FT_InteractableRay != null)
                    {
                        length = 1000;
                        length =  Vector3.Distance(hit.point, this.transform.position);
                        itemObject = hit.collider.gameObject;

                        if (!bo)
                        {
                            bo = true;
                            itemObject.GetComponent<FT_InteractableRay>().RayEnter();
                        }

                        if (CurvedUIInputModule.Instance.SteamVRClickAction.GetStateDown(Valve.VR.SteamVR_Input_Sources.RightHand))
                        {
                            //点击
                            itemObject.GetComponent<FT_InteractableRay>().RayClick();
                        }
                        else if (CurvedUIInputModule.Instance.SteamVRClickAction.GetStateDown(Valve.VR.SteamVR_Input_Sources.LeftHand))
                        {
                            //点击
                            itemObject.GetComponent<FT_InteractableRay>().RayClick();
                        }
                    }
                }
                else
                {
                    bo = false;
                    itemObject?.GetComponent<FT_InteractableRay>().RayExit();
                    itemObject = null;
                    length = 0;
                }

                //set the leangth of the beam
                LaserBeamTransform.localScale = LaserBeamTransform.localScale.ModifyZ(length);

                 射线长度为零的时候隐藏射线
                //if (Math.Abs(length) < 0.0001f && LaserBeamTransform.gameObject.activeSelf)
                //    LaserBeamTransform.gameObject.SetActive(false);
                //else if (Math.Abs(length) >= 0.0001f && !LaserBeamTransform.gameObject.activeSelf)
                //    LaserBeamTransform.gameObject.SetActive(true);
            }


        }

    }
}

2.挂载物品上代码


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

    public class FT_InteractableRay : MonoBehaviour
    {
        public bool isActive = true;

        public UnityEvent OnRayEnter;
        public UnityEvent OnRayExit;
        public UnityEvent OnRayClick;

        public virtual void RayEnter()
        {
            OnRayEnter?.Invoke();
           // this.GetComponent<HighlightEffect>().highlighted = false;
            Debug.Log("射线进入:" + name);
        }

        public virtual void RayExit()
        {
            OnRayExit?.Invoke();
            Debug.Log("射线离开:" + name);
        }

        public virtual void RayClick()
        {
           OnRayClick?.Invoke();
           Debug.Log("射线点击:" + name);
        }
    }

3.逻辑测试 代码

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

public class TestTest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        this.gameObject.GetComponent<FT_InteractableRay>().OnRayEnter.AddListener(() => {
            this.gameObject.GetComponent<HighlightEffect>().highlighted = true;
        });
        this.gameObject.GetComponent<FT_InteractableRay>().OnRayExit.AddListener(() => {
            this.gameObject.GetComponent<HighlightEffect>().highlighted = false;
        });
        this.gameObject.GetComponent<FT_InteractableRay>().OnRayClick.AddListener(() => {

        });
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

完事!!!!!!!!!!!

后面 慢慢完善一下。

以上 方案我以弃用,不是不好用,而是 很多功能需要自己 集成。恰好找到了一个别人集成好的方案。

:Unity VR Interaction Framework+VIVE Cosmos(完美组合)_野区捕龙为宠的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-424206.html

到了这里,关于Unity SteamVR 2.x UGUI射线交互 +物品射线点击+物品抓起(超级简单)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

    PhysicsRaycaster是Unity UGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给相应的UI元素。 PhysicsRaycaster通过发射一条射线来检测UI元素。当射线与UI元素相交时,PhysicsRaycaster会将事件传递给相应的UI元素。 Event

    2024年02月15日
    浏览(46)
  • 【超级入门】Unity如何实现画射线+射线检测+NavMeshAgent结合

           “射线检测 是在3D数字世界里选择某个特定物体常用的一种技术,如在3D、VR游戏中检测子弹命中敌人情况或者从地上捡起一支枪,这都要用到 射线检测 , 射线检测 是在3D数字空间中选择虚拟物体的最基本方法。 ” 效果: 我们先创建一个物体,挂脚本 RayTest ,代码

    2024年02月15日
    浏览(38)
  • Unity所以说是玩具, UGUI的PhysicsRaycaster (物理射线检测)组件的介绍及使用

    PhysicsRaycaster是Unity UGUI中的一个组件,用于在UI元素上进行物理射线检测。它可以检测鼠标或触摸事件是否发生在UI元素上,并将事件传递给相应的UI元素。 PhysicsRaycaster通过发射一条射线来检测UI元素。当射线与UI元素相交时,PhysicsRaycaster会将事件传递给相应的UI元素。 Event

    2024年02月22日
    浏览(43)
  • Unity UGUI的Physi会随机改变csRaycaster (物理射线检测)组件的介绍及使用

    这里只介绍liteflow的简单基础使用以及作者对liteflow进行可视化扩展的相关阐述 背景:对于拥有复杂业务逻辑的系统承载着核心业务逻辑,这些核心业务逻辑涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。项目几经易手,维护的成本就

    2024年02月20日
    浏览(69)
  • Unity中SteamVR2.0手柄按键绑定当SteamVR Input里的Open Binding UI按钮点击后打不开

    分享给第一次接触steamVR和新手的。也是给自己记一个笔记 最近在做SteamVR手柄按钮绑定时碰到一个问题,SteamVR Input里的Open Binding UI按钮点击后打不开本地的steamVR的绑定页面。之后我去查找资料一直都没解决方法,直到有一篇中提到了一句话在SteamVR里打开控制器设置。因此我

    2024年02月01日
    浏览(63)
  • Unity UGUI的PhysicsRayc可变化、可扩展aster (物理射线检测)组件的介绍及使用

    最近工作中需要用到MongoDB的事务操作,因此参考了一些资料封装了一个小的组件,提供基础的CRUD Repository基类 和 UnitOfWork工作单元模式。今天,就来简单介绍一下这个小组件。 MongoDB在4.2版本开始全面支持了多文档事务,至今已过了四年了,虽然我们可能没有在项目中用Mon

    2024年02月20日
    浏览(50)
  • Unity UGUI的PhysicsRaycaster (物算法能力可视化理射线检测)组件的介绍及使用

    Outline(描边)组件是Unity UGUI中的一种特效组件,用于给UI元素添加描边效果。通过设置描边的颜色、宽度和模糊程度,可以使UI元素在视觉上更加突出。 Outline(描边)组件通过在UI元素周围绘制多个相同的UI元素,并设置不同的颜色和大小,从而实现描边的效果。描边的宽度和模糊

    2024年02月07日
    浏览(44)
  • Unity UGUI的Physics2DRaycaster (2D物理射线检测)组件的介绍及使用

    Physics2DRaycaster是Unity中的一个UGUI组件,用于在2D场景中进行物理射线检测。它可以检测鼠标或触摸事件在UI元素上的碰撞,并将事件传递给相应的UI元素。 Physics2DRaycaster通过发射一条射线来检测UI元素的碰撞。当射线与UI元素相交时,Physics2DRaycaster会将事件传递给相应的UI元素,

    2024年02月15日
    浏览(49)
  • Unity射线以及相关点击触发事件的归纳

    例如:最近在做一些Unity的小游戏需要,需要用到射线检测和点击事件等操作,虽然都是一些很基础的东西但是也折腾了一会,主要有些细节没处理好就会导致不触发,写篇博客学习记录一下吧。   这个是最常用的,常用于3D游戏中通过射线检测来获取鼠标点击的位置来控

    2024年02月01日
    浏览(43)
  • Unity UGUI实现点击事件穿透

     代码很简单如下 将此代码挂载到上层节点上即可 使用此方案遇到的一些问题以及处理方法 1.下层Button没响应问题 如果只传递一层的情况 Button的Text文本 或者Button下面有遮挡物 并且Raycast Target是true的情况它会传递给Text或者 其他遮挡物 而Button 不会收到点击消息 所以如果想

    2024年04月09日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包