Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

11

25.04.2016, 11:25

Ok, das hatte ich übersehen. Ich ging davon aus, dass nur in der 2. Zeile der Unterschied wäre.

Aber abgesehen davon gilt weiterhin, dass Generik zu bevorzugen ist:

C#-Quelltext

1
GameObject[] prefabs = Resources.LoadAll<GameObject>("Assets/Resources/Maps");
(Die Angabe des Verzeichnisses habe ich vom Vorposter übernommen, nicht aber selbst getestet.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

12

25.04.2016, 11:46

Aber abgesehen davon gilt weiterhin, dass Generik zu bevorzugen ist:[cs]GameObject[] prefabs = Resources.LoadAll<GameObject>


Da stimme ich dir voll und ganz zu.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

13

25.04.2016, 12:34


Ok, das hatte ich übersehen. Ich ging davon aus, dass nur in der 2. Zeile der Unterschied wäre.

Aber abgesehen davon gilt weiterhin, dass Generik zu bevorzugen ist:







C#-Quelltext




1



GameObject[] prefabs = Resources.LoadAll<GameObject>("Assets/Resources/Maps");




(Die Angabe des Verzeichnisses habe ich vom Vorposter übernommen, nicht aber selbst getestet.)


Wie gesagt, der Pfad wird ab "Assets/Resources/" angegeben. In dem Fall also einfach 'Resources.LoadAll<GameObject>("Maps");'
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

14

25.04.2016, 15:43

Also erstmal vielen Dank für das große Input :)

Ich bin allerdings etwas verwirrt. Also dass ich generische Varianten von Methoden benutzen sollte hab ich jetzt. Also soll ich statt eines ganz normalen Arrays einfach die "List" benutzen? Und um erlich zu sein, habe ich noch nicht so ganz verstanden, wann ich die Generics benutzen muss, bzw zu welchen zweck. Vorallem gerade in meinem Fall. Wäre ziemlich cool wenn mir das einer nochmal ganz kurz erklären könnte, damit ich das auch an anderen bsp. anwenden kann.


MfG Orange

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

15

25.04.2016, 16:03

Der Vorteil der Generics in diesem Fall ist, dass du direkt z.B. ein Array von GameObjects und kein allgemeines Array von Objects als Rückgabewert erhältst. Damit sparst du dir einerseits das casten und andererseits ist damit, wie Sacaldur geschrieben hat, eine bessere Typsicherheit gegeben.

Die entsprechenden generischen Methoden kannst du also also immer dort benutzen, wo du sonst nur ein Object als Rückgabewert erhältst. Beispiele dafür sind:

C#-Quelltext

1
2
3
GameObject.Instantiate<GameObject>(...) //statt GameObject.Instantiate(...) as GameObject;
GetComponent<MyComponent>(); //statt GetComponent("MyComponent") as MyComponent;
Resources.LoadAll<GameObject>(...); //statt Resources.LoadAll(..., GameObject) und dann in GameObject[] umwandeln

16

25.04.2016, 20:54

Aaaahhh okei! Super ich danke euch vielmals, habt mir wirklich weiter geholfen. Für alle die es Intressiert hier ist es wie ich es umgesetzt habe:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using System.Collections.Generic;

public class LoadNewArea : MonoBehaviour {

    public string levelToLoad;
    public List<Object> allMaps = new List<Object>();
    void Start () {
        ChooseMap();
    }
    
    
    void Update () {
    
    }

    void OnTriggerEnter2D(Collider2D other)
    {

        if(other.gameObject.name == "Player")
        {
            //ChooseMap();
            SceneManager.LoadScene(levelToLoad);
        }
        

    }

    public void ChooseMap()
    {
        Object[] map = Resources.LoadAll("Maps", typeof(Object));

        if(map == null || map.Length == 0)
        {
            Debug.Log("Keine Werte im Array");
        }

        allMaps = new List<Object>();
        foreach (Object maps in map)
        {
            Object w = (Object)maps;
            allMaps.Add(w);
            Debug.Log("Map " + w.name + " in List geladen");
        }

    }
}

Superwayne

Treue Seele

Beiträge: 242

Beruf: Student & App Entwickler (Xamarin)

  • Private Nachricht senden

17

25.04.2016, 23:09

In Zeile 43 castest du von Object nach Object ;)

Brauchst du jetzt doch kein GameObject mehr?

18

26.04.2016, 12:12

Ähhhh... eigentlich wollte ich die Prefabs da rein werfen, mach ich das nicht als Object? :O

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

19

26.04.2016, 13:20

Prefabs werden als GameObject gespeichert (weil Prefabs spezielle GameObjects sind), entsprechend wäre es besser, wenn du mit GameObjects arbeiten würdest.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige