Jump to content
Unity Insider Forum

Unet Spawn Prefabs


Kuxii

Recommended Posts

Bin gerade dabei Mein spiel Spielbar zu machen,

Nun stehe ich vor einem Problem, Level ist klar, Aber mann kann ja bei dem Orginalen Unet nur ein Spawn Prefab zuweisen nun ist das aber so das ich beim Verlassen der Garage mehrere Verschiedene Habe wovon ich eins auswählen kann.

Wie kann ich das nun machen das das Spawn Prefab im Manager auf das Ausgewähle geändert wird?
 

bis jetzt sieht der Code so aus:

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
using System.IO;
using UnityEngine.Networking;

public class DriveOutGarage : NetworkBehaviour
{

    public GameObject[] Cars;
    public Button[] Slots;
    public GameObject Player;
    public string Profile;
    public CarSaveSettings carSaveSettings;
    public Scrollbar scrollbar;
    public DriveOutGarage driveOutGarage;
    public string SelectedCar;
    public float Sonlinemode;
    public ProfilCreator profilCreator;
    public NetworkManager manager;
    public Vector3 playerSpawnPos;

    int pages;
    int selectedID;
    int unselectedID;
    private readonly short assetId;

    void Start() {
        Player = GameObject.FindWithTag("Player");
        Profile = Player.name;
        carSaveSettings = new CarSaveSettings();
        profilCreator = new ProfilCreator();
        saveUpdate();
        LoadSettings();
    }

    public void saveUpdate()
    {
        string[] saves = Directory.GetDirectories(Application.persistentDataPath + "\\Profiles/" + Profile + "/Cars");
        pages = Mathf.FloorToInt(saves.Length / 8);
        driveOutGarage.scrollbar.GetComponent<Scrollbar>().numberOfSteps = pages;
        int pagesSelect = Mathf.FloorToInt(driveOutGarage.scrollbar.GetComponent<Scrollbar>().value * pages);
        for (int i = 0; i < saves.Length; i++)
        {
            int sites = Mathf.FloorToInt(i / 8);
            if (sites == pagesSelect)
            {
                driveOutGarage.Slots[i].GetComponentInChildren<Text>().text = getFolderName(saves[i]);
            }
        }
    }

    public void SelectedID(int id)
    {
        int pagesSelect = Mathf.FloorToInt(driveOutGarage.scrollbar.GetComponent<Scrollbar>().value * pages);
        int i = pagesSelect * 8;
        i += id;
        for (int u = 0; u < 8; u++)
        {
            driveOutGarage.Slots[u].GetComponentInChildren<Text>().color = Color.black;
            unselectedID = u;
            // carHolder.Parts[id].GetComponentInChildren<Text>().text = ;
        }
        SelectedCar = driveOutGarage.Slots[id].GetComponentInChildren<Text>().text;
        driveOutGarage.Slots[id].GetComponentInChildren<Text>().color = Color.blue;
        selectedID = i;
    }

    string getFolderName(string path)
    {
        string[] s = path.Split('/');
        string[] s2 = path.Split('\\');
        return s2[s2.Length - 1];
    }

    public void LoadSettings()
    {
        profilCreator = JsonUtility.FromJson<ProfilCreator>(File.ReadAllText(Application.persistentDataPath + "/Profiles/" + Profile + "/1"));
        Sonlinemode = profilCreator.onlinemode;
    }

    public void StertGameScene()
    {
        if (Sonlinemode == 0) //Soll Server Starten wenn = 0
        {
            manager.StartServer();
            Debug.Log("Try to Start Server");
        }
        if (Sonlinemode == 1) //Soll Client Starten wenn = 1
        {
            manager.StartClient();
            Debug.Log("Try to Start Client");
        }
    }

    void OnServerAddPlayer(NetworkConnection conn)
    {
        GameObject thePlayer = (GameObject)Instantiate(Cars[selectedID], Vector3.zero, Quaternion.identity);
        NetworkServer.AddPlayerForConnection(conn, thePlayer, assetId);

    }
}

Start Scene(Weiß liegt ein Tippfehler vor) Liegt auf dem Play Button von meinen Panel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du könntest in deinem Spawnprefab alle anderes Prefabs von denen man auswählen kann unterordnen. Dann aktivierst du halt immer nur das, was der Spieler ausgewählt hast und die anderen werden einfach deaktiviert. 

Oder du schreibst dir dein eigenes Spawnsystem aber 1. Variante geht deutlich schneller und einfacher denke ich :D 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier ist ein Lösung wie du verschiedene Prefabs für den Spieler zumindest beim Gamestart auswählen kannst. Wie man das Spielerprefab im laufenden Spiel austauschen kann, kann ich dir leider nicht sagen, ist aber denke ich auch nicht so ganz einfach. Ich denke aber, sowohl der Client als auch der Server müssen dies mitbekommen.
https://forum.unity.com/threads/unet-spawning-different-player-prefabs-solved.387747/

Vielleicht kommt man mit dieser Methode zum Ziel:
https://docs.unity3d.com/ScriptReference/Networking.NetworkServer.ReplacePlayerForConnection.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Sooo bisschen umschreiben und nun geht das, Aber er will keinen server aufmachen Screenshot_1.thumb.png.ccd5004f48045e5478df3daa0e804c84.pngScreenshot_2.thumb.png.cc45a9568656527e9d3a740bb64ed49c.png

 

 

Okay werde es nun anders machen Gleich via Hauptmenü in die Scene (Mit Orginal NetworkManager) Spawnen Lassen und in der Garage dann beim Auswählen des Autos den Car vom Haupt menü löschen und dan den Neuen (Mit Auto zuweißen)

Link zu diesem Kommentar
Auf anderen Seiten teilen

  • 1 month later...

Denke wenn man wirklich wechselnde steuerbare Objekte während dem laufenden Spiel verwenden will, sollte man nicht das SpawnPrefab ändern sondern durch das SpawnPrefab einfach das gewünschte Objekt mit Authority spawnen lassen und den Input vom PlayerPrefab an das gesapwnte Objekt weiterleiten. Dadurch entfällt das austauschen des PlayerPrefab und die damit verbundenen Probleme.

Wenn du es dir aber eh reicht das vor dem eigentlichen Spielstart im Hauptmenü zu machen, ist die Methode das PlayerPrefab vorher zu tauschen die einfachste.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...