Initialer Upload neues Unity-Projekt
This commit is contained in:
141
Assets/SteamVR/Extras/SteamVR_LaserPointer.cs
Normal file
141
Assets/SteamVR/Extras/SteamVR_LaserPointer.cs
Normal file
@ -0,0 +1,141 @@
|
||||
//======= Copyright (c) Valve Corporation, All rights reserved. ===============
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
|
||||
public struct PointerEventArgs
|
||||
{
|
||||
public uint controllerIndex;
|
||||
public uint flags;
|
||||
public float distance;
|
||||
public Transform target;
|
||||
}
|
||||
|
||||
public delegate void PointerEventHandler(object sender, PointerEventArgs e);
|
||||
|
||||
|
||||
public class SteamVR_LaserPointer : MonoBehaviour
|
||||
{
|
||||
public bool active = true;
|
||||
public Color color;
|
||||
public float thickness = 0.002f;
|
||||
public GameObject holder;
|
||||
public GameObject pointer;
|
||||
bool isActive = false;
|
||||
public bool addRigidBody = false;
|
||||
public Transform reference;
|
||||
public event PointerEventHandler PointerIn;
|
||||
public event PointerEventHandler PointerOut;
|
||||
|
||||
Transform previousContact = null;
|
||||
|
||||
// Use this for initialization
|
||||
void Start ()
|
||||
{
|
||||
holder = new GameObject();
|
||||
holder.transform.parent = this.transform;
|
||||
holder.transform.localPosition = Vector3.zero;
|
||||
holder.transform.localRotation = Quaternion.identity;
|
||||
|
||||
pointer = GameObject.CreatePrimitive(PrimitiveType.Cube);
|
||||
pointer.transform.parent = holder.transform;
|
||||
pointer.transform.localScale = new Vector3(thickness, thickness, 100f);
|
||||
pointer.transform.localPosition = new Vector3(0f, 0f, 50f);
|
||||
pointer.transform.localRotation = Quaternion.identity;
|
||||
BoxCollider collider = pointer.GetComponent<BoxCollider>();
|
||||
if (addRigidBody)
|
||||
{
|
||||
if (collider)
|
||||
{
|
||||
collider.isTrigger = true;
|
||||
}
|
||||
Rigidbody rigidBody = pointer.AddComponent<Rigidbody>();
|
||||
rigidBody.isKinematic = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(collider)
|
||||
{
|
||||
Object.Destroy(collider);
|
||||
}
|
||||
}
|
||||
Material newMaterial = new Material(Shader.Find("Unlit/Color"));
|
||||
newMaterial.SetColor("_Color", color);
|
||||
pointer.GetComponent<MeshRenderer>().material = newMaterial;
|
||||
}
|
||||
|
||||
public virtual void OnPointerIn(PointerEventArgs e)
|
||||
{
|
||||
if (PointerIn != null)
|
||||
PointerIn(this, e);
|
||||
}
|
||||
|
||||
public virtual void OnPointerOut(PointerEventArgs e)
|
||||
{
|
||||
if (PointerOut != null)
|
||||
PointerOut(this, e);
|
||||
}
|
||||
|
||||
|
||||
// Update is called once per frame
|
||||
void Update ()
|
||||
{
|
||||
if (!isActive)
|
||||
{
|
||||
isActive = true;
|
||||
this.transform.GetChild(0).gameObject.SetActive(true);
|
||||
}
|
||||
|
||||
float dist = 100f;
|
||||
|
||||
SteamVR_TrackedController controller = GetComponent<SteamVR_TrackedController>();
|
||||
|
||||
Ray raycast = new Ray(transform.position, transform.forward);
|
||||
RaycastHit hit;
|
||||
bool bHit = Physics.Raycast(raycast, out hit);
|
||||
|
||||
if(previousContact && previousContact != hit.transform)
|
||||
{
|
||||
PointerEventArgs args = new PointerEventArgs();
|
||||
if (controller != null)
|
||||
{
|
||||
args.controllerIndex = controller.controllerIndex;
|
||||
}
|
||||
args.distance = 0f;
|
||||
args.flags = 0;
|
||||
args.target = previousContact;
|
||||
OnPointerOut(args);
|
||||
previousContact = null;
|
||||
}
|
||||
if(bHit && previousContact != hit.transform)
|
||||
{
|
||||
PointerEventArgs argsIn = new PointerEventArgs();
|
||||
if (controller != null)
|
||||
{
|
||||
argsIn.controllerIndex = controller.controllerIndex;
|
||||
}
|
||||
argsIn.distance = hit.distance;
|
||||
argsIn.flags = 0;
|
||||
argsIn.target = hit.transform;
|
||||
OnPointerIn(argsIn);
|
||||
previousContact = hit.transform;
|
||||
}
|
||||
if(!bHit)
|
||||
{
|
||||
previousContact = null;
|
||||
}
|
||||
if (bHit && hit.distance < 100f)
|
||||
{
|
||||
dist = hit.distance;
|
||||
}
|
||||
|
||||
if (controller != null && controller.triggerPressed)
|
||||
{
|
||||
pointer.transform.localScale = new Vector3(thickness * 5f, thickness * 5f, dist);
|
||||
}
|
||||
else
|
||||
{
|
||||
pointer.transform.localScale = new Vector3(thickness, thickness, dist);
|
||||
}
|
||||
pointer.transform.localPosition = new Vector3(0f, 0f, dist/2f);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user