0

我尝试了多种技术,但仍然没有结果。这篇 文章看起来很有希望,但我仍然有同样的问题。主机可以更改颜色,但不能为客户端玩家更改颜色。代码看起来像这样。

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

任何的意见都将会有帮助。提前致谢。

4

1 回答 1

0

感谢任何看到这个的人。我解决了这个问题。可能不是最有效的,我可以稍后再做。但是我向非玩家对象(它确实有一个 NetworkIdentidy 并设置为本地玩家)添加了一个 [Command],在这个命令中我引用了场景中的玩家列表并在 playerscript 中设置了一个公共变量(这是一个 SyncVar <- 那是做什么的)。在 playerscript 中,我引用了那个非 Player 对象并将其纹理设置为我想要的。不担心是不是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。我知道它不漂亮。但是,是的,如果您对更好的方法有任何建议,请告诉我。如果这对某人有帮助……真棒酱!

于 2016-03-21T17:41:54.010 回答