Enseñanza de la función VRTK (2): Unity3DVRTK maneja la teletransportación y la función de conmutación de rayos interactivos de UI 丨 Conmutación interactiva de rayos modelo 3D 丨 Conmutación entre líneas rectas y curvas

Enseñanza de la función VRTK (2): Unity3DVRTK maneja la teletransportación y la función de conmutación de rayos interactivos de UI 丨 Conmutación interactiva de rayos modelo 3D 丨 Conmutación entre líneas rectas y curvas

`


introducir

Este artículo: Para la función de interacción del mango de VRTK, el problema de que los dos rayos no se pueden cambiar de manera efectiva cuando se teletransporta y la interacción de la interfaz de usuario


pantalla de código

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using VRTK;

public class VRTK_SwitchPointLine : MonoBehaviour
{
    
    
    public VRTK_BezierPointerRenderer bezierRender;
    public VRTK_StraightPointerRenderer straightRender;
    public VRTK_Pointer mainPointer;
    public string InteractHoverTag = "ModeObj";
    private VRTK_ControllerEvents mEvent;
    private VRTK_ShotLine cacheShowLabel;

    public UnityAction<string> r_RayAction = null;

    // public UnityEvent TipAccordingObjevent;

    private void Awake()
    {
    
    

        mEvent = GetComponent<VRTK_ControllerEvents>();
        mainPointer.activateOnEnable = false;
        bezierRender.enabled = false;
        straightRender.enabled = false;


    }


    void Update()
    {
    
    
        Ray ray = new Ray(transform.position, transform.forward);
        if (Physics.Raycast(ray, out var hit))
        {
    
    

            VRTK_ShotLine temp = hit.transform.GetComponent<VRTK_ShotLine>();
            //直线射线物体使用方式为轻触触摸板 对准带着规定标签的物体 射线转换为直线
            if (temp != null && mEvent.touchpadTouched)
            {
    
    

                if (hit.transform.tag.Equals(this.InteractHoverTag) || hit.transform.tag.Equals("PositionControl"))
                {
    
    
                    temp.LineEnter(this.mEvent);

                    if (mEvent.triggerClicked)
                    {
    
    
                        Debug.Log(hit.collider.name);
                        r_RayAction?.Invoke(hit.collider.name);
                    }
                }

                if (cacheShowLabel == null)
                {
    
    
                    temp.LineEnter();
                }
                else
                if (cacheShowLabel != null && cacheShowLabel != temp)
                {
    
    
                    cacheShowLabel.LineExit();
                    temp.LineEnter();
                }

                cacheShowLabel = temp;
                mainPointer.pointerRenderer = straightRender;
            }
            else
            {
    
    
                //否则射线为曲线
                if (cacheShowLabel != null)
                {
    
    
                    cacheShowLabel.LineExit();
                    cacheShowLabel = null;
                }
                //判断检测到Ui的交互时射线转换为直线
                if (hit.transform.GetComponent<VRTK_UICanvas>())
                {
    
    
                    mainPointer.pointerRenderer = straightRender;

                }
                else if (hit.transform.tag == "canPoint")
                {
    
    
                    mainPointer.pointerRenderer = straightRender;
                }
                else
                {
    
    
                    mainPointer.pointerRenderer = bezierRender;
                }

            }
        }
        else
        {
    
    
            if (cacheShowLabel != null)
            {
    
    
                cacheShowLabel.LineExit();
                cacheShowLabel = null;
            }
            mainPointer.pointerRenderer = bezierRender;
        }

        if (mEvent != null && cacheShowLabel != null)
        {
    
    
            if (mEvent.triggerClicked)
            {
    
    
                cacheShowLabel.Execute();
                cacheShowLabel = null;
            }
        }
        if (mainPointer.pointerRenderer == straightRender)
        {
    
    
            bezierRender.enabled = false;
            straightRender.enabled = true;
            mainPointer.activateOnEnable = true;
            mainPointer.holdButtonToActivate = false;
            mainPointer.activationButton = VRTK_ControllerEvents.ButtonAlias.Undefined;
            mainPointer.selectionButton = VRTK_ControllerEvents.ButtonAlias.Undefined;
            straightRender.cursorVisibility = VRTK_BasePointerRenderer.VisibilityStates.AlwaysOn;
            straightRender.tracerVisibility = VRTK_BasePointerRenderer.VisibilityStates.AlwaysOn;
        }
        else
        {
    
    
            bezierRender.enabled = true;
            straightRender.enabled = false;
            mainPointer.activateOnEnable = false;
            mainPointer.holdButtonToActivate = true;
            mainPointer.activationButton = VRTK_ControllerEvents.ButtonAlias.TouchpadPress;

            mainPointer.selectionButton = VRTK_ControllerEvents.ButtonAlias.TouchpadPress;
            straightRender.cursorVisibility = VRTK_BasePointerRenderer.VisibilityStates.OnWhenActive;
            straightRender.tracerVisibility = VRTK_BasePointerRenderer.VisibilityStates.OnWhenActive;
        }
    }
}







También existe este script. Este script se usó originalmente para la interacción con el modelo, pero si no agrega este script, informará muchos errores. Es muy problemático eliminar uno por uno. Si no necesita la interacción con el modelo. , solo cree este script y déjelo solo.

using VRTK;
public interface VRTK_ShotLine
{
    
    
    void LineEnter();

    void LineExit();

    void Execute();

    void LineEnter(VRTK_ControllerEvents events);
}

método de configuración

Configuracion basica

En primer lugar, no debe haber menos componentes montados en el controlador de nuestro mango.
inserte la descripción de la imagen aquí

Entre ellos, Switch Point Line es el script compilado por nosotros.Se
pueden montar tres controladores directamente en el controlador.

Configuración de la interacción de la interfaz de usuario

Para la interacción de la interfaz de usuario, además de configurar la configuración básica, también debe montar el script UICanvas en el lienzo con el que desea interactuar.
inserte la descripción de la imagen aquí

Interacción con modelos de objetos 3D

Además de configurar la configuración básica para la interacción del modelo, también debemos montar nuestro script VRTK_ShotLine en el objeto con el que se debe interactuar, así como la etiqueta, que es el nombre ModeObj definido en nuestro script. Nota para los novatos: asegúrese de agregar un colisionador.
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Resumir

Por ejemplo: lo anterior es de lo que quiero hablar hoy.. Este artículo presenta el uso de la función handle ray de VRTk.

Supongo que te gusta

Origin blog.csdn.net/weixin_42746271/article/details/124197286
Recomendado
Clasificación