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