Dies setzt einige Dinge voraus.
Zuerst verwende ich EventSystems, um Mausklicks zu erhalten. Dies ist keine Voraussetzung, es kann leicht geändert werden (durch Sie aber ^^). Um es richtig einzurichten, benötigen Sie eine EventSystem
in Ihrer Szene (wenn Sie eine Benutzeroberfläche haben, haben Sie wahrscheinlich bereits eine).
Zweitens müssen Sie eine PhysicsRaycaster
Komponente an Ihre Hauptkamera anschließen (die Kamera, die der Player durchschaut).
Zuletzt, auf dem GameObject, das den Renderer für die Render-Textur enthält (ich benutzte einen einfachen Quad), wenden Sie das folgende Skript an und weisen Sie die entsprechende Kamera zu.
using UnityEngine;
using UnityEngine.EventSystems;
//i chose box collider because its cheap
[RequireComponent(typeof(BoxCollider))]
public class RenderTextureRaycaster : MonoBehaviour, IPointerDownHandler {
//assign in inspector
public Camera portalExit;
BoxCollider portal;
Vector3 portalExitSize;
void Start() {
portal = GetComponent<BoxCollider>();
//this is the target camera resolution, idk if there is another way to get it.
portalExitSize = new Vector3(portalExit.targetTexture.width, portalExit.targetTexture.height, 0);
}
public void OnPointerDown(PointerEventData eventData) {
//the click in world space
Vector3 worldClick = eventData.pointerCurrentRaycast.worldPosition;
//transformed into local space
Vector3 localClick = transform.InverseTransformPoint(worldClick);
//since the origin of the collider is in its center, we need to offset it by half its size to get it realtive to bottom left
Vector3 textureClick = localClick + portal.size/2;
//now we scale it up by the actual texture size which equals to the "camera resoution"
Vector3 rayOriginInCameraSpace = Vector3.Scale(textureClick, portalExitSize);
//with this knowledge we can creata a ray.
Ray portaledRay = portalExit.ScreenPointToRay(rayOriginInCameraSpace);
RaycastHit raycastHit;
//and cast it.
if (Physics.Raycast(portaledRay, out raycastHit)) {
Debug.DrawLine(portaledRay.origin, raycastHit.point, Color.blue, 4);
}
else {
Debug.DrawRay(portaledRay.origin, portaledRay.direction * 100, Color.red, 4);
}
}
}
edit: oben vielleicht ein bisschen ausführlicher ist, können Sie es leicht zu reduzieren, wenn Sie einen Liner mögen, es ist einfach zu zeigen, wie es funktioniert. bitte auch nur halte dies für einen Proof of Concept, es ist nicht gründlich getestet.
Zeigerinteraktionen treten nicht bei einzelnen Texturen auf, sie sind das Ergebnis eines Raycasts von der Kamera, die auf einen Collider trifft. Ihr Spielobjekt benötigt einen Collider, wenn Sie Unity5 verwenden, können Sie das EventSystem a [PhysicsRaycaster] (http://docs.unity3d.com/ScriptReference/EventSystems.PhysicsRaycaster.html) auf der Kamera und den [IPointClickHander] (http://docs.unity3d.com/ScriptReference/EventSystems.IPointerClickHandler.html) Schnittstelle – Rob
Ich denke Raycast verwenden Physik und es gibt keine Physik auf die Kamera angewendet –
Wie bekomme ich ich Welt Raumposition von Textur klicken? –