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

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


person CaptObvious    schedule 21.03.2016    source источник
comment
stackoverflow.com/questions/34191207/   -  person CaptObvious    schedule 21.03.2016


Ответы (1)


Спасибо всем, кто смотрит на это. Я решил проблему. Вероятно, не самый эффективный, я могу поработать над этим позже. Но я добавил [Command] к объекту, не являющемуся игроком (который имеет NetworkIdentidy и установлен для локального игрока), в этой команде я ссылаюсь на список игроков в сцене и устанавливаю общедоступную переменную в playerscript (которая является 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;
        }

    }
}

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

person CaptObvious    schedule 21.03.2016