using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Oculus.Platform.Samples.VrHoops { public abstract class Player : MonoBehaviour { public const uint MAX_BALLS = 6u; private const float INITIAL_FORCE = 870f; private const float RESPAWN_SECONDS = 2f; private uint m_score; private Text m_scoreUI; private GameObject m_ballPrefab; private BallEjector m_ballEjector; private Queue m_balls = new Queue(); private GameObject m_heldBall; private float m_nextSpawnTime; public virtual uint Score { get { return m_score; } set { m_score = value; if ((bool)m_scoreUI) { m_scoreUI.text = m_score.ToString(); } } } public GameObject BallPrefab { set { m_ballPrefab = value; } } protected bool HasBall { get { return m_heldBall != null; } } private void Start() { m_ballEjector = base.transform.GetComponentInChildren(); m_scoreUI = base.transform.parent.GetComponentInChildren(); m_scoreUI.text = "0"; } public GameObject CreateBall() { if ((long)m_balls.Count >= 6L) { Object.Destroy(m_balls.Dequeue()); } GameObject gameObject = Object.Instantiate(m_ballPrefab); m_balls.Enqueue(gameObject); gameObject.transform.position = m_ballEjector.transform.position; gameObject.transform.SetParent(m_ballEjector.transform, true); gameObject.GetComponent().useGravity = false; gameObject.GetComponent().detectCollisions = false; gameObject.GetComponent().Player = this; return gameObject; } protected GameObject CheckSpawnBall() { PlatformManager.State currentState = PlatformManager.CurrentState; if ((currentState == PlatformManager.State.WAITING_TO_PRACTICE_OR_MATCHMAKE || currentState == PlatformManager.State.PLAYING_A_LOCAL_MATCH || currentState == PlatformManager.State.PLAYING_A_NETWORKED_MATCH) && Time.time >= m_nextSpawnTime && !HasBall) { m_heldBall = CreateBall(); return m_heldBall; } return null; } protected GameObject ShootBall() { GameObject heldBall = m_heldBall; m_heldBall = null; heldBall.GetComponent().useGravity = true; heldBall.GetComponent().detectCollisions = true; heldBall.GetComponent().AddForce(m_ballEjector.transform.forward * 870f, ForceMode.Acceleration); heldBall.transform.SetParent(base.transform.parent, true); m_nextSpawnTime = Time.time + 2f; return heldBall; } private void OnDestroy() { foreach (GameObject ball in m_balls) { Object.Destroy(ball); } } } }