2016-03-21 13 views
0

Ich habe mehrere Techniken ausprobiert, aber immer noch kein Ergebnis. Diese post schien vielversprechend, aber ich habe immer noch die gleichen Probleme. Der Host kann die Farbe ändern, jedoch nicht für die Client-Player. Der Code sieht so aus.UNET Änderung der Textur des Kindes Objekt für Kunden

public List<GameObject> bases = new List<GameObject>(); 
[SyncVar] 
public Texture redTexture; 
[SyncVar] 
public Texture blueTexture; 
[SyncVar] 
GameObject objID; 
NetworkIdentity objNetID; 
public void CheckTexture() 
{ 
    if (isLocalPlayer) 
    { 
     for (int i = 0; i < bases.Count; ++i) 
     { 
      var tempScript = bases[i].GetComponent<BaseScoreScript>(); 
      if (tempScript.owner == "blue") 
      { 
       objID = bases[i]; 
       CmdCheckText(objID, blueTexture); 
      } 
     } 
    } 
} 
[ClientRpc] 
void RpcChangeTexture(GameObject obj, Texture text) 
{ 
    obj.GetComponentInChildren<MeshRenderer>().material.mainTexture = text; 
} 
[Command] 
void CmdCheckText(GameObject obj, Texture texture) 
{ 
    objNetID = obj.GetComponent<NetworkIdentity>(); 
    objNetID.AssignClientAuthority(connectionToClient); 
    RpcChangeTexture(obj, texture); 
    objNetID.RemoveClientAuthority(connectionToClient); 
} 

Alle Vorschläge wären hilfreich. Vielen Dank im Voraus.

+0

http://stackoverflow.com/questions/34191207/unet-multi-player-game-having-both-player-interact-with-gameobject-changes-sy – CaptObvious

Antwort

0

Danke für jeden, der sich das anschaut. Ich habe das Problem gelöst. Wahrscheinlich nicht der effizienteste, daran kann ich später arbeiten. Aber ich habe dem non player Objekt (das eine NetworkIdentidy hat und auf local player gesetzt ist) einen [Command] hinzugefügt, in diesem Befehl referenziere ich eine Liste von Spielern in der Szene und setze eine public Variable im playersscript (was eine SyncVar ist) < - das was es getan hat). Und im Playerskript referenziere ich dieses Nicht-Player-Objekt und setze seine Textur auf die gewünschte. Keine Sorge, ob es LocalPlayer ist oder nicht, weil ich möchte, dass alle Spieler die Veränderung sehen.

[Command] 
void CmdSyncOwner(string own) 
{ 
    //List<GameObject> players = new List<GameObject>(); 
    foreach (GameObject obj in GameObject.FindObjectsOfType<GameObject>()) 
    { 
     players.Remove(obj); 
     players.Add(obj); 
    } 

    for (int i = 0; i < players.Count; ++i) 
    { 
     if (players[i].tag.Contains("Ply")) 
     { 
      players[i].GetComponent<FPSPlayerFunction>().baseOwner = own; 
     } 
    } 
} 

, die den Code in dem Nicht-Spieler-Skript ist und:

[SyncVar] 
public string baseOwner; 

void BaseStatus() 
{ 
    var blue = Color.blue; 
    var red = Color.red; 

    foreach(GameObject obj in bases) 
    { 
     if (baseOwner == "blue") 
     { 
      centBaseStatus.image.color = blue; 
      centBaseStatus.GetComponentInChildren<Text>().text = "Center Base : "+ baseOwner; 
      GameObject.Find("CenterBase").GetComponentInChildren<Renderer>().material.mainTexture = BlueBase; 
     } 

    } 
} 

für die playerscrip. Ich weiß es ist nicht schön. Aber ja, wenn Sie Vorschläge für bessere Möglichkeiten haben, lassen Sie es mich bitte wissen. Und wenn das jemandem hilft ... Tolle Soße!