Newer
Older
CGTrack / Assets / Oculus / Platform / Samples / VrHoops / Scripts / P2PNetworkGoal.cs
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<GoalMover>();
		}

		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;
		}
	}
}