Я хочу изменить материал GameObject на всех клиентах, когда я нажимаю на него в любом клиенте. Я новичок в UNET и полагаю, что у меня есть концептуальный недостаток. Итак, в основном я пытаюсь сделать следующее:
- Направить луч на NetworkPlayer на объект в сцене.
- Отправить
[Command]
от игрока - В этом
[Command]
вызовите[ClientRpc]
на объекте - В
[ClientRpc]
измените материал этого объекта
Мой плеер:
using UnityEngine;
using UnityEngine.Networking;
// This script is on my Game Player Prefab
// (removed the cam movement part)
public class CamMovement : NetworkBehaviour
{
void Update()
{
if (!isLocalPlayer)
{
return;
}
if (Input.GetMouseButtonDown(0))
{
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
CmdNextColor(hit.transform.gameObject);
}
}
[Command]
public void CmdNextColor(GameObject hitObject)
{
RPC_ColorChange colorChange = hitObject.GetComponent<RPC_ColorChange>();
if (colorChange != null)
{
colorChange.RpcNextColor();
}
}
}
Мой объект:
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
public class RPC_ColorChange : NetworkBehaviour {
public Material[] material;
[SyncVar]
int curColOfThisObject;
Text text;
private void Start()
{
text = GetComponentInChildren<Text>();
}
[ClientRpc]
public void RpcNextColor()
{
if (!isClient)
return;
if (material.Length > 0)
{
Material curMaterial = this.GetComponent<MeshRenderer>().material;
curColOfThisObject++;
if (curColOfThisObject >= material.Length)
curColOfThisObject = 0;
curMaterial = material[curColOfThisObject];
}
}
private void Update()
{
if (isClient)
{
text.text = "new color of this object: " + curColOfThisObject.ToString();
}
}
}
Происходит следующее: текст на объекте меняется на соответствующий цвет, но материал никогда не меняется. Как мне сменить материал?
Дополнительный вопрос: если кто-нибудь знает хорошее руководство по созданию концепции игры UNET, пожалуйста, дайте мне знать.