namespace Oculus.Platform.Samples.VrHoops { using UnityEngine; using System.Collections; // This component handles network coordination for the moving backboard. // Although there is randomness in the next direction, the movement is // otherwise completely predictable, much like a moving platform or door, // thus we only need to send occasional updates. If the position of the // backboard is not correct, the GoalMover will gradually nudge it in the // correct direction until the local and remote motion is synchronized. public class P2PNetworkGoal : MonoBehaviour { // cached reference to the associated GoalMover component private GoalMover m_goal; // the last move direction we sent to remote clients private Vector3 m_lastSentMoveDirection; private bool m_sendUpdates; public bool SendUpdates { set { m_sendUpdates = value; } } void Awake() { m_goal = gameObject.GetComponent(); } void FixedUpdate () { // since the backboard's movement is deterministic, we don't need to send position // updates constantly, just when the move direction changes if (m_sendUpdates && m_goal.MoveDirection != m_lastSentMoveDirection) { SendBackboardUpdate(); } } public void SendBackboardUpdate() { m_lastSentMoveDirection = m_goal.MoveDirection; float time = Time.realtimeSinceStartup; PlatformManager.P2P.SendBackboardUpdate( time, transform.localPosition, m_goal.MoveDirection, m_goal.NextMoveDirection); } // message from the remote player with new transforms public void RemoteBackboardUpdate(float remoteTime, Vector3 pos, Vector3 moveDir, Vector3 nextMoveDir) { // interpolate the position forward since the backboard would have moved over // the time it took to send the message float time = Time.realtimeSinceStartup; float numMissedSteps = (time - remoteTime) / Time.fixedDeltaTime; m_goal.ExpectedPosition = pos + (Mathf.Round(numMissedSteps) * moveDir); m_goal.MoveDirection = moveDir; m_goal.NextMoveDirection = nextMoveDir; } } }