Я делаю простую многопользовательскую VR-игру и столкнулся с несколькими проблемами с сетевым плагином Mirror.
Вот мой код:
public RootMotion.FinalIK.VRIK ik;
public LineRenderer laserLine;
void Start()
{
// body follow HMD and Controller
ik.solver.spine.headTarget = GameObject.Find("HeadTracker").transform;
ik.solver.leftArm.target = GameObject.Find("LHand").transform;
ik.solver.rightArm.target = GameObject.Find("RHandGunPos").transform;
}
// Update is called once per frame
void Update()
{
// Test in editor
if (Input.GetKeyDown(KeyCode.Space))
{
// NOT WORK
if (isServer)
RpcShoot();
else
CmdShoot();
// THIS WORK
//StartCoroutine(ShowLaser());
}
}
[Command]
public void CmdShoot()
{
RpcShoot();
}
[ClientRpc]
public void RpcShoot()
{
StartCoroutine( ShowLaser());
}
private IEnumerator ShowLaser()
{
Transform t = GameObject.Find("Pistol").transform;
laserLine.SetPosition(0, t.position);
// .up = front in the pistol model
laserLine.SetPosition(1, t.position + t.up * 10);
yield return new WaitForSeconds(0.2f);
laserLine.SetPosition(0, Vector3.zero);
laserLine.SetPosition(1, Vector3.zero);
}
В Update (), если я вызываю StartCoroutine напрямую, все работает нормально, лазер появляется прямо в центре пистолета.
Если я вызываю сопрограмму в методе ClientRp c, лазер не перемещается моими ИК-руками, скорее всего, он использует исходное положение пистолета, когда тело находилось в позе Т.