C# Unity Raycast klicken

DreamGamer

Lieutenant
Registriert
Feb. 2017
Beiträge
543
Hallo, ich bin neu in Unity und wollte simple anfangen... Und zwar habe ich ein Script geschrieben was einfach Random auf dem Bildschirm Images spawnt. Dies hat auch alles ohne Probleme funktioniert, nur wollte ich jetzt eine Aktion ausführen, wenn ich auf ein Bild klicke(2D). Im Internet habe ich als Lösung RaycastHit2D gefunden nur funktioniert dies irgendwie bei mir nicht. So sieht aktuell mein Skript aus:

Code:
    void Update()
    {
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);

            if (touch.phase == TouchPhase.Began)
            {
                Debug.Log("Began");

                Vector2 worldPoint = Camera.main.ScreenToWorldPoint(touch.position);
                RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero);
                if (hit.collider != null)
                {
                    Debug.Log(hit.collider.gameObject.name);
                }
            }

        }
    }
Es kommt aber nur "Began" beim klicken auf ein Bild und bei Raycast passiert gar nichts. Ich selber bin ja neu in dem Thema deshalb meine Frage, ist es vllt. ein Anfängerfehler :D? Freue mich sehr über jede Hilfe :)

MFG DreamGamer
 
@Zespire so sieht der Spawn Code aus:

C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Game : MonoBehaviour
{
    public GameObject melone;
    public float spawnRate = 2f;
    float nextSpawn = 0.0f;
    Vector2 spawnPoint;
    public Transform gamePanel;

    Vector3 touchPosWorld;


    // Use this for initialization
    void Start()
    {

        



    }

    void Update()
    {
        if (Input.touchCount > 0)
        {
            Touch touch = Input.GetTouch(0);

            if (touch.phase == TouchPhase.Began)
            {
                Debug.Log("Began");

                Vector2 worldPoint = Camera.main.ScreenToWorldPoint(touch.position);
                RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero);
                if (hit.collider != null)
                {
                    Debug.Log(hit.collider.gameObject.name);
                }
            }

        }


        if (Time.time > nextSpawn)
        {
            nextSpawn = Time.time + spawnRate;
            spawnPoint = new Vector2(Random.Range(-500.4f, 500.4f), Screen.currentResolution.height);
            GameObject meloneObject = Instantiate(melone, spawnPoint, Quaternion.identity);
            meloneObject.transform.SetParent(gamePanel.transform, false);
            meloneObject.layer = 0;
            meloneObject.name = "rain";

        }
    }


}

Und @hoppler "melon" ist ein eigenes Objekt mit Rigibody2D und einem 2D Box Collider.
 
Da du ja scheinbar den Collider bereits im Editor hinzu gefügt hast und das nicht der Fehler ist würde ich raten das deine Kamera auf Perspective gestellt ist und nicht auf Orthographic.
 
Meine Kamera ist bereits auf "Orthographic" gestellt. Und hier sind mal ein paar Screens von Unity:
781576


781577
 
Oh du nutzt ein Canvas das erklärt auch weshalb du Screen.currentResolution.height nimmst.
Da musst du anders heran gehen ich glaube dort brauchst du keine Collider da das ganze über das EventSystem läuft hier mal eine Anleitung.

https://answers.unity.com/questions/1095047/detect-mouse-events-for-ui-canvas.html
und
https://docs.unity3d.com/Manual/script-GraphicRaycaster.html

So würde es ohne canvas funktionieren

Code:
    public float spawnRate = 2f;
    float nextSpawn = 0.0f;
    Vector2 spawnPoint;
    Vector3 touchPosWorld;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Vector2 worldPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            RaycastHit2D hit = Physics2D.Raycast(worldPoint, Vector2.zero);
            if (hit.collider != null)
                Debug.Log(hit.collider.gameObject.name);
        }


        if (Time.time > nextSpawn)
        {
            nextSpawn = Time.time + spawnRate;
            spawnPoint = new Vector2(Random.Range(-10.4f, 10.4f), Random.Range(-10.4f, 10.4f));
            Spawn(spawnPoint);
        }
    }

    private void Spawn(Vector2 spawnPoint)
    {
        GameObject quad = GameObject.CreatePrimitive(PrimitiveType.Quad);
        quad.transform.position = new Vector3(spawnPoint.x, spawnPoint.y, 0);
        DestroyImmediate(quad.GetComponent<MeshCollider>());
        quad.AddComponent<BoxCollider2D>();
        quad.layer = 0;
        quad.name = "rain";
    }
 
Zuletzt bearbeitet:
Gibt es denn eine bessere Alternative für Texturen? Die mit Raycast funktionieren? Ansonsten lese ich mich dort mal ein. Ich denke ja mal das UI-Canvas nicht die beste Lösung für game-textures sind, oder? :D
 
Ja die bewegen sich im Worldspace und werden auch von deiner MainCamera gerendert die Objekte auf dem Canvas nutzen eine eigene Kamera und bewegen sich auf dem Canvas.
 
Oh ich habe den Canvas benutzt da ich es Responsive Mobile entwickel. Geht das dann dort trd. wenn ich die Geräte-Auflösung abfrage? Schon, oder?
 
Alles klar danke dir :) Ich werde mich dann erstmal etwas einlesen :D
 

Ähnliche Themen

Zurück
Oben