Я пытаюсь сделать что-то, что должно быть довольно простым, как это должно происходить в играх довольно часто. Я разрешаю игрокам создавать кубы в мире, а затем, когда игрок нажимает на куб, текстовое значение куба (и связанный с ним счетчик синквар) изменяются.
Однако, это работает ТОЛЬКО при попытке сделать это из комбинации сервер / клиент. Что я делаю неправильно? Я поражен тем, что не могу найти учебники по этому вопросу, так как он кажется повсеместным в играх.
SpawnCube.cs (прикрепляется к каждому игроку)
if (Input.GetKeyDown (KeyCode.Mouse1)) {
RaycastHit hit;
if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 1000f, layers)) {
SpawnedCubeController scc = hit.collider.gameObject.GetComponent<SpawnedCubeController>();
if (scc != null) {
print ("HIT A CUBE");
scc.CmdAdjustCounter (1);
} else {
Vector3 hitPos = new Vector3(hit.point.x, hit.point.y + .5f, hit.point.z);
Quaternion look = Quaternion.LookRotation(hitPos - this.transform.position);
CmdSpawnCube(hitPos, look);
}
}
}
И затем мясо находится в SpawnedCubeController.cs, который присоединен к порожденному кубу.
public class SpawnedCubeController : NetworkBehaviour {
[SyncVar(hook = "OnChangeCounter")]
public int counter = 10;
private TextMeshProUGUI text;
public void OnChangeCounter(int newCount) {
if (text == null)
text = gameObject.GetComponentInChildren<TextMeshProUGUI> ();
text.text = "" + newCount;
}
[Command]
public void CmdAdjustCounter(int amount) {
this.counter -= amount;
if (this.counter <= 0) {
Destroy (this.gameObject);
}
if (isServer)
RpcUpdateCounter (counter);
}
[ClientRpc]
public void RpcUpdateCounter (int amount) {
text.SetText ("" + amount);
}
В моем примере каждый может порождать и вращать кубы очень хорошо - однако я не могу, на всю жизнь, заставить всех быть в состоянии выполнить команду.
Я даже не думаю, что RpcUpdateCounter необходим, поскольку хук должен справиться с этим? В любом случае, нажатие на куб на любом компьютере, кроме сервера, никогда не запускает команду
Спасибо!