Jump to content
Unity Insider Forum

Photon Variable über das Netzwerk ändern


Recommended Posts

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

  • 4 months later...

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

LobbyMenue.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...