namespace Oculus.Platform.Samples.VrHoops { using UnityEngine; // This script moves to goal around in a random direction to add a bit more difficulty // to the game. public class GoalMover : MonoBehaviour { // how far to from the center before changing direction [SerializeField] private float MAX_OFFSET = 2.0f; // how fast the backboard will move [SerializeField] private float m_speed = 0.005f; // maximum interpolation distance allow to correct per update private const float MOVE_TOLERANCE = 0.1f; // the position the goal should be in - only differs if network updates come in private Vector3 m_expectedPosition; // the current move vector * m_speed; private Vector3 m_moveDirection; // the direction to move when we run into the boundary private Vector3 m_nextMoveDirection; public Vector3 ExpectedPosition { get { return m_expectedPosition; } set { m_expectedPosition = value; } } public Vector3 MoveDirection { get { return m_moveDirection; } set { m_moveDirection = value; } } public Vector3 NextMoveDirection { get { return m_nextMoveDirection; } set { m_nextMoveDirection = value; } } void Start () { ExpectedPosition = transform.localPosition; m_moveDirection.x = Random.Range(-1.0f, 1.0f); m_moveDirection.y = Random.Range(-1.0f, 1.0f); m_moveDirection = Vector3.ClampMagnitude(m_moveDirection, m_speed); m_nextMoveDirection.x = -Mathf.Sign(m_moveDirection.x) * Random.Range(0f, 1.0f); m_nextMoveDirection.y = -Mathf.Sign(m_moveDirection.y) * Random.Range(0f, 1.0f); m_nextMoveDirection = Vector3.ClampMagnitude(m_nextMoveDirection, m_speed); } void FixedUpdate () { // move a bit along our random direction transform.localPosition += MoveDirection; ExpectedPosition += MoveDirection; // make a slight correction to the position if we're not where we should be Vector3 correction = ExpectedPosition - transform.localPosition; correction = Vector3.ClampMagnitude(correction, MOVE_TOLERANCE); transform.localPosition += correction; // if we've gone too far from the center point, correct and change direction if (transform.localPosition.sqrMagnitude > (MAX_OFFSET*MAX_OFFSET)) { transform.localPosition = Vector3.ClampMagnitude(transform.localPosition, MAX_OFFSET); ExpectedPosition = transform.localPosition; MoveDirection = NextMoveDirection; // select a the next randomish direction to move in m_nextMoveDirection.x = -Mathf.Sign(m_moveDirection.x) * Random.Range(0f, 1.0f); m_nextMoveDirection.y = -Mathf.Sign(m_moveDirection.y) * Random.Range(0f, 1.0f); m_nextMoveDirection = Vector3.ClampMagnitude(m_nextMoveDirection, m_speed); } } } }