Jump to content
Unity Insider Forum

Gameobjekt über Collision auswählen


Zerbo93
 Share

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

Edited by Zerbo93
Zusätzliche Information hinzugefügt
Link to comment
Share on other sites

Moin!

gameObject

referenziert das GameObject, auf dem diese Komponente sitzt. Wenn du das GameObject löschen willst, mit dem kollidiert wurde, musst du auch

collision.gameObject

zerstören.

  • Thanks 1
Link to comment
Share on other sites

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.

  • Thanks 1
Link to comment
Share on other sites

vor 22 Stunden schrieb Sascha:

Moin!


gameObject

referenziert das GameObject, auf dem diese Komponente sitzt. Wenn du das GameObject löschen willst, mit dem kollidiert wurde, musst du auch


collision.gameObject

zerstören.

Danke! Hat funktioniert :)

Link to comment
Share on other sites

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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...