Jump to content
Unity Insider Forum

Gameobjekt über Collision auswählen


Zerbo93

Recommended Posts

Hallo,

ich stehe mal wieder vor einem Problem, und brauche eure Hilfe. :)

Ich habe vor, über ein Gameobjekt(Bulldozer), ein anderes Gameobjekt(Gebäude) zu löschen. Sprich wenn der Bulldozer mit einem Objekt kollidiert, dass den Tag "Building" hat und man dann die linke Maustaste drückt, soll das Gebäude,  und die Einträge zum Gebäude aus der txt-Datei, gelöscht werden. Momentan löscht sich das Bulldozer-Objekt aber nur selbst. Und das auch nicht jedes mal, sondern erst nach einigen Versuchen.

Hier das Script(C#) zum Bulldozer:

using System;
using UnityEngine;
using System.IO;


public class BulldozerScript : MonoBehaviour
{
    private uint id;
    private string Sid;
    private void OnCollisionStay(Collision collision)
    {
        if (collision.gameObject.tag == "Building" && Input.GetMouseButtonDown(0))
        {
            Debug.Log("Hallo!");
            if (gameObject.GetComponent<HuasScript>() != null)
            {
                id = gameObject.GetComponent<HuasScript>().GebäudeId;
            }
            else if (gameObject.GetComponent<FarmScript>() != null)
            {
                id = gameObject.GetComponent<FarmScript>().GebäudeId;
            }
            else if (gameObject.GetComponent<FabrikScript>() != null)
            {
                id = gameObject.GetComponent<FabrikScript>().GebäudeId;
            }
            else if (gameObject.GetComponent<HolzfaellerScript>() != null)
            {
                id = gameObject.GetComponent<HolzfaellerScript>().GebäudeId;
            }
            else if (gameObject.GetComponent<RoadScript>() != null)
            {
                id = gameObject.GetComponent<RoadScript>().GebäudeId;
            }
            else if (gameObject.GetComponent<SaegewerkScript>() != null)
            {
                id = gameObject.GetComponent<SaegewerkScript>().GebäudeId;
            }

            Sid = Convert.ToString(id);

            string[] lines = File.ReadAllLines("Temp.txt");
            StreamWriter writer = new StreamWriter("Temp.txt", true);

            for (int i = 0; i < lines.Length; i++)
            {
                if(lines[i] == Sid)
                {
                    int y = i + 6;
                    string leeren = null;
                    while(i <= y)
                    {
                        writer.WriteLine(lines[i], leeren);
                        i++;
                    }
                    break;
                }
            }
            writer.Close();
            Destroy(gameObject);
        }
    }
}

 

Anbei ein Screenshot, zum besseren Verständnis, was ich mit dem Bulldozer-Objekt meine. Das Objekt folgt stets der Maus.

 

Schonmal danke für eure Hilfe im voraus! :)

 

Edit 1: Er geht in die if-Abfrage "collision.gameObject.tag == "Building" && Input.GetMouseButtonDown(0)" rein. Daher erkennt er auf jeden fall, dass er über einem Gebäude steht.
Der Bulldozer selber hat keinen Tag. Nur die Gebäude, mit denen er kollidiert!

Edit 2: Das Script liegt natürlich direkt auf dem Bulldozer-Objekt.

01.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin ein Tipp zu der if abfrage. Du kannst das optimieren in dem du das so machst:

if (collision.gameObject.TryGetComponent<HuasScript>(out HuasScript huasScript))
{
    id = huasScript.GebäudeId;
}
else if (collision.gameObject.TryGetComponent<FarmScript>(out FarmScript farmScript)
{
    id = farmScript.GebäudeId;
}

Viel bessere wäre übrigens, dass du ein extra Component hast die Basics hat. Beispiel wäre ein Component namens BuildingData oder BuildingInfo passend und mit den Daten wie die ID oder so.

Nun musst du EINMAL

if (collision.gameObject.TryGetComponent<BuildingData>(out BuildingData buildingData))
{
    id = buildingData.GebäudeId;
}

abfragen und schon ersparst du die ganzen if abfragen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 58 Minuten schrieb MaZy:

Moin ein Tipp zu der if abfrage. Du kannst das optimieren in dem du das so machst:


if (collision.gameObject.TryGetComponent<HuasScript>(out HuasScript huasScript))
{
    id = huasScript.GebäudeId;
}
else if (collision.gameObject.TryGetComponent<FarmScript>(out FarmScript farmScript)
{
    id = farmScript.GebäudeId;
}

Viel bessere wäre übrigens, dass du ein extra Component hast die Basics hat. Beispiel wäre ein Component namens BuildingData oder BuildingInfo passend und mit den Daten wie die ID oder so.

Nun musst du EINMAL


if (collision.gameObject.TryGetComponent<BuildingData>(out BuildingData buildingData))
{
    id = buildingData.GebäudeId;
}

abfragen und schon ersparst du die ganzen if abfragen.

Werde ich mal entsprechend abändern. Danke! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...