Очень полезно, спасибо. Но проблема не совсем в непонимании кода, скорее в том что и откуда должно вызываться. Распишу более подробно:
Вот фрагмент кода из скрипта Player:
Используется csharp
private void Update()
{
if (!isLocalPlayer)
return;
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, 4f))
{
if (hit.collider.tag == "Tree")
if (Input.GetButtonDown("Submit"))
hit.collider.GetComponent<MultiplayerTree>().CmdGrow();
}
}
А вот код из скрипта Tree:
Используется csharp
public class MultiplayerTree : NetworkBehaviour {
[SyncVar]
public int curSize = 1;
public override void OnStartClient()
{
base.OnStartClient();
transform.localScale = Vector3.one * curSize;
}
[Command]
public void CmdGrow()
{
RpcUpdateSize();
}
[ClientRpc]
public void RpcUpdateSize()
{
curSize++;
transform.localScale = Vector3.one * curSize;
if (curSize == 10)
{
print("You won!");
}
}
}
При таком раскладе, когда клиент пытается вызвать эту функцию, выдает предупреждение, о котором я писал выше.
Также я думал о том, чтобы [Command] функцию вызывать в самом игроке, и из нее вызывать [ClientRpc] функцию в объекте. Но в таком случае мне нужно передать hit.collider.GetComponent<MulitplayerTree>() в [Command] функцию(чтобы знать какой объект должен увеличить размер), но здесь мне уже говорят, что нельзя передавать аргумент в [Command] функцию.