LonlonFarm1 Geschrieben 7. Juli 2021 Melden Share Geschrieben 7. Juli 2021 Moin, Ich glaube ehrlich gesagt dass mir etwas sehr leichtes entgeht. Ich sitze nun schon den ganzen Tag an dem Problem.. Also, in meinem Online-Spiel möchte ich das alle Spieler andere Farben haben, sie sollen jedoch alle das selbe Prefab haben. Also hab ich drei verschiedene Materialien zu dem "SetPlayer"-Script hinzgefügt. Je nach dem welchen PlayerCount der Spieler hat soll durch den Index die Farbe ausgewählt und im Material slot des SpriteRenderers eingefügt werden. Das funktioniert auch gut. Jedoch bekomme ich es einfach nicht hin die Variable auch für das Äquivalent auf dem Bildschrim des anderen Spielers zu ändern. Dort bekommt es dann einfach die Farbe des Spielers der dort ist, also haben dann beide die selbe Farbe. Ich hatte es bereits gelöst indem mit if(!isMine){playerCount = (view.ViewID - 1) / 1000; } schrieb, aber mal ehrlich, das funktioniert nur weil die ID glücklicherweise gleichmäßig ansteigt. Ich hoffe ihr könnt überhaupt verstehen was ich meine, ich kann von dem ganzen hin und her garnicht mehr denken. Der Code: public class SetPlayer : MonoBehaviour { public Material blueMat, greenMat, yellowMat; public Material[] mats; public GameObject cam; PhotonView view; public int playerCount; // Start is called before the first frame update void Start() { cam = FindObjectOfType<CinemachineVirtualCamera>().gameObject; mats = new Material[] { blueMat, greenMat, yellowMat }; view = GetComponent<PhotonView>(); if (view.IsMine) { cam.GetComponent<CinemachineVirtualCamera>().Follow = transform; transform.GetChild(1).gameObject.SetActive(true); view.RPC("SetCountRPC", RpcTarget.AllBuffered); } if (!view.IsMine) { //playerCount = (view.ViewID - 1) / 1000; } GetComponent<SpriteRenderer>().material = mats[playerCount - 1]; } [PunRPC] public void SetCountRPC() { playerCount = PhotonNetwork.LocalPlayer.ActorNumber; } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Elharter Geschrieben 5. Dezember 2021 Melden Share Geschrieben 5. Dezember 2021 Also ich löse das so sehr ähnlich, jedoch entscheiden die Spieler in der Lobby welche Farbe sie haben können und sehen das auch direkt. Ich habe 2 Pfeile für links/rechts um die Farbe zu wechseln und habe, der einfachheithalber, farben fix vorgegeben. Hier siehst du die Pfeile neben dem Auto. Bei jedem clickt synct PUN zu allen verbundenen Clients und merkt sich den Status. Variablen: public Color[] colors = new Color[10]; //the color array to change the car color rivate int carIndex = 0; //define car Colors in array colors[0] = new Color32(167, 167, 167, 255); //grey colors[1] = new Color32(0, 171, 36, 255); //green colors[2] = new Color32(143, 0, 0, 255); //red colors[3] = new Color32(241, 255, 0, 255); //yellow colors[4] = new Color32(255, 0, 185, 255); //pink colors[5] = new Color32(255, 153, 0, 255); //orange colors[6] = new Color32(0, 23, 255, 255); //blue colors[7] = new Color32(0, 0, 0, 255); //black colors[8] = new Color32(0, 255, 244, 255); //turquoise colors[9] = new Color32(84, 30, 178, 255); //purple Ich habe hierzu 2 Methoden: Pfeil nach rechts/links public void NextCar() { carIndex = (carIndex + 1) % colors.Length; SetCustomProperties(Photon.Pun.PhotonNetwork.LocalPlayer, carIndex, (int)Photon.Pun.PhotonNetwork.LocalPlayer.CustomProperties["spawn"], false, qualifiyingmode, qualirounds, qualitime, qualigrid, qualifinished, steamidstring, totalLaps); Debug.Log("CarIndex:" + carIndex); int playerIndex = 0; foreach (Photon.Realtime.Player p in Photon.Pun.PhotonNetwork.PlayerList) { Transform playerMenu = playerMenus[playerIndex++]; if (p == Photon.Pun.PhotonNetwork.LocalPlayer) { /* Renderer rend = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); //Set the main Color of the Material to green rend.material.shader = Shader.Find("Standard"); rend.material.SetColor("_Color", colors[carIndex]); */ // New code with different materials Renderer colorMat = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); if (colorMat != null) { Material[] matArray = colorMat.materials; //get the current materials // overwrite it with the two hardcoded materials matArray[0] = mats[carIndex]; matArray[1] = default_mat;//is black colorMat.materials = matArray; } else { //Debug.Log("PUNRoom_Handler:No Mesh Renderer found at the race-car"); } } } } public void PreviousCar() { carIndex--; if (carIndex < 0) carIndex = colors.Length - 1; SetCustomProperties(Photon.Pun.PhotonNetwork.LocalPlayer, carIndex, (int)Photon.Pun.PhotonNetwork.LocalPlayer.CustomProperties["spawn"], false, qualifiyingmode, qualirounds, qualitime, qualigrid, qualifinished, steamidstring, totalLaps); Debug.Log("CarIndex:" + carIndex); int playerIndex = 0; foreach (Photon.Realtime.Player p in Photon.Pun.PhotonNetwork.PlayerList) { Transform playerMenu = playerMenus[playerIndex++]; if (p == Photon.Pun.PhotonNetwork.LocalPlayer) { /* Renderer rend = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); //Set the main Color of the Material to green rend.material.shader = Shader.Find("Standard"); rend.material.SetColor("_Color", colors[carIndex]); */ // New code with different materials Renderer colorMat = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); if (colorMat != null) { //Debug.Log("PUNRoom_Handler:colorMat is not null"); Material[] matArray = colorMat.materials; //get the current materials //Debug.Log("PUNRoom_Handler:material0"+matArray[0]); //Debug.Log("PUNRoom_Handler:material1"+matArray[1]); // overwrite it with the two hardcoded materials matArray[0] = mats[carIndex]; matArray[1] = default_mat;//is black colorMat.materials = matArray; } else { //Debug.Log("PUNRoom_Handler:No Mesh Renderer found at the race-car"); } } } } Dann verwende ich die OnPhotonPlayerPropertiesChanged Methode um auf allen Clients jeden Change mit zu bekommen: public void OnPhotonPlayerPropertiesChanged(object[] playerAndUpdatedProps) { Debug.Log("PUNRoom_Handler:PUNRoom_handler:OnPhotonPlayerPropertiesChanged called"); UpdatePlayerList(); } dH wenn einer der Spieler die Farbe ändert, callen alle Spieler im sellben Raum die UpdatePlayerList(); Und in der UpdatePlayerList() schaue ich mir einfach an was "ich als Client" empfangen habe und weise es entsprechend dem richtigen Auto zu. public void UpdatePlayerList() { foreach (Photon.Realtime.Player p in Photon.Pun.PhotonNetwork.PlayerList) { Transform playerMenu = playerMenus[playerIndex++]; if (p.CustomProperties.ContainsKey("car")) {Renderer colorMat = playerMenu.Find("SelectedPlayerCar/RaceCarCanvas/RaceCar/RaceCar/Body").gameObject.GetComponent<Renderer>(); if (colorMat != null) { //Debug.Log("PUNRoom_Handler:colorMat is not null"); Material[] matArray = colorMat.materials; //get the current materials //Debug.Log("PUNRoom_Handler:material0"+matArray[0]); //Debug.Log("PUNRoom_Handler:material1"+matArray[1]); // overwrite it with the two hardcoded materials Debug.Log("PUNRoom_Handler:current customproperties for car:" + (int)p.CustomProperties["car"]); matArray[0] = mats[(int)p.CustomProperties["car"]]; matArray[1] = default_mat;//is black //Debug.Log("+++++++++++++++++++++++AFTER first asssign+++++++++++++++++++++++++++++++"); //Debug.Log("PUNRoom_Handler:material0"+matArray[0]); //Debug.Log("PUNRoom_Handler:material1"+matArray[1]); colorMat.materials = matArray; } else { Debug.Log("PUNRoom_Handler:No Mesh Renderer found at the race-car"); } } } Fertig ist der ganze Streich.... lg Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
LonlonFarm1 Geschrieben 8. Dezember 2021 Autor Melden Share Geschrieben 8. Dezember 2021 Wow, unfassbar wie detailliert deine Antwort ist 🤩 Vielen vielen Dank, das hilft mir weiter :) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.