2016-03-21 10 views
0

Я пробовал несколько методов, но все равно никакого результата. Это post показалось многообещающим, но у меня все те же проблемы. Хост может изменить цвет, но не для игроков-клиентов. Код выглядит так.UNET Изменить текстуру дочернего объекта для клиентов

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); 
} 

Любые предложения были бы полезными. Спасибо заранее.

+0

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

ответ

0

Спасибо всем, кто смотрит на это. Я решил проблему. Наверное, не самый эффективный, я могу поработать над этим позже. Но я добавил [Command] к объекту non player (у которого есть NetworkIdentidy и установленному локальному проигрывателю), в этой команде я ссылаюсь на список игроков в сцене и устанавливаю общедоступную переменную в файле playersscript (который является SyncVar < - это что это сделал). И в игровом скрипте я ссылаюсь на этот объект без игрока и устанавливаю его текстуру той, которую я хотел. Не волнуйтесь, если это LocalPlayer или нет, потому что я хочу, чтобы все игроки увидели это изменение.

[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; 
     } 
    } 
} 

это код в скрипте неигровых и:

[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; 
     } 

    } 
} 

для playerscrip. Я знаю, что это не очень. Но да, если у вас есть предложения по лучшим способам сделать это, пожалуйста, дайте мне знать. И если это полезно кому-то ... Удивительный соус!

Смежные вопросы