forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
namespace Oculus.Platform.Samples.VrHoops
 | 
						|
{
 | 
						|
	using UnityEngine;
 | 
						|
	using UnityEngine.UI;
 | 
						|
	using System.Collections.Generic;
 | 
						|
 | 
						|
	// The base Player component manages the balls that are in play.  Besides spawning new balls,
 | 
						|
	// old balls are destroyed when too many are around or the Player object itself is destroyed.
 | 
						|
	public abstract class Player : MonoBehaviour {
 | 
						|
 | 
						|
		// maximum number of balls allowed at a time
 | 
						|
		public const uint MAX_BALLS = 6;
 | 
						|
 | 
						|
		// the initial force to impart when shooting a ball
 | 
						|
		private const float INITIAL_FORCE = 870f;
 | 
						|
 | 
						|
		// delay time before a new ball will spawn.
 | 
						|
		private const float RESPAWN_SECONDS = 2.0f;
 | 
						|
 | 
						|
		// current score for the player
 | 
						|
		private uint m_score;
 | 
						|
 | 
						|
		// cached reference to the Text component to render the score
 | 
						|
		private Text m_scoreUI;
 | 
						|
 | 
						|
		// prefab for the GameObject representing a ball
 | 
						|
		private GameObject m_ballPrefab;
 | 
						|
 | 
						|
		// gameobject for the position and orientation of where the ball will be shot
 | 
						|
		private BallEjector m_ballEjector;
 | 
						|
 | 
						|
		// queue of active balls for the player to make sure too many arent in play
 | 
						|
		private Queue<GameObject> m_balls = new Queue<GameObject>();
 | 
						|
 | 
						|
		// reference to a ball that hasn't been shot yet and is tied to the camera
 | 
						|
		private GameObject m_heldBall;
 | 
						|
 | 
						|
		// when to spawn a new ball
 | 
						|
		private float m_nextSpawnTime;
 | 
						|
 | 
						|
		#region Properties
 | 
						|
 | 
						|
		public virtual uint Score
 | 
						|
		{
 | 
						|
			get { return m_score; }
 | 
						|
			set
 | 
						|
			{
 | 
						|
				m_score = value;
 | 
						|
 | 
						|
				if (m_scoreUI)
 | 
						|
				{
 | 
						|
					m_scoreUI.text = m_score.ToString();
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		public GameObject BallPrefab
 | 
						|
		{
 | 
						|
			set { m_ballPrefab = value; }
 | 
						|
		}
 | 
						|
 | 
						|
		protected bool HasBall
 | 
						|
		{
 | 
						|
			get { return m_heldBall != null; }
 | 
						|
		}
 | 
						|
 | 
						|
		#endregion
 | 
						|
 | 
						|
		void Start()
 | 
						|
		{
 | 
						|
			m_ballEjector = transform.GetComponentInChildren<BallEjector>();
 | 
						|
			m_scoreUI = transform.parent.GetComponentInChildren<Text>();
 | 
						|
			m_scoreUI.text = "0";
 | 
						|
		}
 | 
						|
 | 
						|
		public GameObject CreateBall()
 | 
						|
		{
 | 
						|
			if (m_balls.Count >= MAX_BALLS)
 | 
						|
			{
 | 
						|
				Destroy(m_balls.Dequeue());
 | 
						|
			}
 | 
						|
			var ball = Instantiate(m_ballPrefab);
 | 
						|
			m_balls.Enqueue(ball);
 | 
						|
 | 
						|
			ball.transform.position = m_ballEjector.transform.position;
 | 
						|
			ball.transform.SetParent(m_ballEjector.transform, true);
 | 
						|
			ball.GetComponent<Rigidbody>().useGravity = false;
 | 
						|
			ball.GetComponent<Rigidbody>().detectCollisions = false;
 | 
						|
			ball.GetComponent<DetectBasket>().Player = this;
 | 
						|
 | 
						|
			return ball;
 | 
						|
		}
 | 
						|
 | 
						|
		protected GameObject CheckSpawnBall()
 | 
						|
		{
 | 
						|
			switch (PlatformManager.CurrentState)
 | 
						|
			{
 | 
						|
				case PlatformManager.State.WAITING_TO_PRACTICE_OR_MATCHMAKE:
 | 
						|
				case PlatformManager.State.PLAYING_A_LOCAL_MATCH:
 | 
						|
				case PlatformManager.State.PLAYING_A_NETWORKED_MATCH:
 | 
						|
					if (Time.time >= m_nextSpawnTime && !HasBall)
 | 
						|
					{
 | 
						|
						m_heldBall = CreateBall();
 | 
						|
						return m_heldBall;
 | 
						|
					}
 | 
						|
					break;
 | 
						|
			}
 | 
						|
			return null;
 | 
						|
		}
 | 
						|
 | 
						|
		protected GameObject ShootBall()
 | 
						|
		{
 | 
						|
			GameObject ball = m_heldBall;
 | 
						|
			m_heldBall = null;
 | 
						|
 | 
						|
			ball.GetComponent<Rigidbody>().useGravity = true;
 | 
						|
			ball.GetComponent<Rigidbody>().detectCollisions = true;
 | 
						|
			ball.GetComponent<Rigidbody>().AddForce(m_ballEjector.transform.forward * INITIAL_FORCE, ForceMode.Acceleration);
 | 
						|
			ball.transform.SetParent(transform.parent, true);
 | 
						|
 | 
						|
			m_nextSpawnTime = Time.time + RESPAWN_SECONDS;
 | 
						|
			return ball;
 | 
						|
		}
 | 
						|
 | 
						|
		void OnDestroy()
 | 
						|
		{
 | 
						|
			foreach (var ball in m_balls)
 | 
						|
			{
 | 
						|
				Destroy(ball);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |