Raycasts

Aus hyperdramatik
Zur Navigation springen Zur Suche springen

Raycasts dienen dazu, eine unsichtbare Linie(ray) von einem bestimmten Punkt auf dem Bildschirm in die virtuelle Welt zu projezieren (cast). Sie sind notwendig um in Code herauszufinden, ob jemand auf ein Objekt in der 3D Welt geklickt hat. In VR sind sie nützlich, um den Kopfbewegungen der Benutzerin zu folgen.

Anwendungsbeispiele & Tutorials

Anwendung und Tutorial von Raycasts zum Auswählen von Objekten[1]

Anwendung und Tutorial von Raycasts für Shooter[2]

Für das Spiel Be Bernd wurden Raycasts benutzt, um in der VR Objekte auszuwählen und interagierbar zu machen.

Code

// Dies ist der Code, um einen Raycast in die AR zu bringen und zu testen, ob er ein Game Object trifft
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//Bis hierhin werden die libraries, auf die Unity zurückgreift, benannt
public class hit : MonoBehaviour
//Der Name des Scripts ist hit, daher das hit hinter public class.
    public Text textDebug ;
    public Gameobject rayTest;

// Weil Testing in AR schwierig ist und jedes Mal einen neuen Build erfordert, wird hier ein Debug Textfeld angelegt, das im Editor noch verknüpft werden muss
    // Update is called once per frame
    void Update()
    { if (Input.touchCount >0)
// .touchCount ist die genaueste Methode, um die folgende Funktionen abzurufen, da es auf jede zusätzliche Berührung reagiert. 
        { textDebug.text = "TOUCHED";
// Debugging in 
            PerformRaycast();
        }
        else
        {
            textDebug.text = "NO TOUCH";
        }
        if (Input.touchCount >0 && Input.GetTouch(0).phase==TouchPhase.Began)
//Input.GetTouch(0).phase==TouchPhase.Began veranlasst einen einen neuen Raycast bei jeder neuen Berührung. 
        {
            textDebug.text = "RAYCAST";
            PerformRaycast();
        }

    void PerformRaycast()
    {
        Vector3 ray = playerCamera.ScreenToWorldPoint(Input.GetTouch(0).position);
// Hiermit wird ein Vektor3 Variable erstellt, welche den berührten Punkt auf dem Tablet in die physische Welt überträgt. 
        Ray myRay = playerCamera.ScreenPointToRay(Input.GetTouch(0).position);
//Erstellt einen Rayast vom berühreten Screenpunkt aus
        RaycastHit hit;
// Wird ein Objekt vom Raycast berührt, wird ein RaycastHit Object hit erstellt
        
        touchedObjectText.text = ray.ToString();
// Der Name des gehitteten Objects wird in einen String verwandelt
        
        rayTest.transform.position = myRay.origin;
        rayTest.transform.LookAt(myRay.direction);
//Hier wird ein Testobjekt erstellt, dass dem gesetzten Raycast entspricht- also eine Krücke, um zu sehen, wo der nicht sichtbare Raycast ist

        if (Physics.Raycast(myRay.origin, myRay.direction, out hit, Mathf.Infinity))
// Hier handelt es sich um einen boolean, der true ist, wenn er ein Game Object hittet. Weitere Details: [https://docs.unity3d.com/ScriptReference/Physics.Raycast.html]
        {
            touchedObjectText.text = "HIT!";
            Debug.DrawRay(ray, transform.TransformDirection(Vector3.forward) * hit.distance, Color.yellow);
            hitGameObject = hit.collider.gameObject;
            touchedObjectText.text =hitGameObject.name.ToString();    
        }
 }

}