forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
namespace Oculus.Platform.Samples.VrBoardGame
 | 
						|
{
 | 
						|
	using UnityEngine;
 | 
						|
	using UnityEngine.UI;
 | 
						|
	using UnityEngine.EventSystems;
 | 
						|
 | 
						|
	// This is a helper class for selecting objects that the user is looking at.
 | 
						|
	// It will select UI objects that have an attach 3d collision volume and helps
 | 
						|
	// the GameController locate GamePieces and GamePositions.
 | 
						|
	public class EyeCamera : MonoBehaviour
 | 
						|
	{
 | 
						|
		// the EventSystem used by the UI elements
 | 
						|
		[SerializeField] private EventSystem m_eventSystem = null;
 | 
						|
 | 
						|
		// the GameController to notify
 | 
						|
		[SerializeField] private GameController m_gameController = null;
 | 
						|
 | 
						|
		// a tine ball in the distance to debug where the user is looking
 | 
						|
		[SerializeField] private SphereCollider m_gazeTracker = null;
 | 
						|
 | 
						|
		// the current Button, if any, being looked at
 | 
						|
		private Button m_currentButton;
 | 
						|
 | 
						|
		// the current GamePiece, if any, being looked at
 | 
						|
		private GamePiece m_currentPiece;
 | 
						|
 | 
						|
		// the current BoardPosition, if any, being looked at
 | 
						|
		private BoardPosition m_boardPosition;
 | 
						|
 | 
						|
		void Update()
 | 
						|
		{
 | 
						|
			RaycastHit hit;
 | 
						|
			Button button = null;
 | 
						|
			GamePiece piece = null;
 | 
						|
			BoardPosition pos = null;
 | 
						|
 | 
						|
			// do a forward raycast to see if we hit a selectable object
 | 
						|
			bool hitSomething = Physics.Raycast(transform.position, transform.forward, out hit, 50f);
 | 
						|
			if (hitSomething) {
 | 
						|
				button = hit.collider.GetComponent<Button>();
 | 
						|
				piece = hit.collider.GetComponent<GamePiece>();
 | 
						|
				pos = hit.collider.GetComponent<BoardPosition>();
 | 
						|
			}
 | 
						|
 | 
						|
			if (m_currentButton != button)
 | 
						|
			{
 | 
						|
				if (m_eventSystem != null)
 | 
						|
				{
 | 
						|
					m_eventSystem.SetSelectedGameObject(null);
 | 
						|
				}
 | 
						|
				m_currentButton = button;
 | 
						|
				if (m_currentButton != null)
 | 
						|
				{
 | 
						|
					m_currentButton.Select();
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if (m_currentPiece != piece)
 | 
						|
			{
 | 
						|
				if (m_currentPiece != null)
 | 
						|
				{
 | 
						|
					m_gameController.StoppedLookingAtPiece();
 | 
						|
				}
 | 
						|
				m_currentPiece = piece;
 | 
						|
				if (m_currentPiece != null)
 | 
						|
				{
 | 
						|
					m_gameController.StartedLookingAtPiece(m_currentPiece);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			if (m_boardPosition != pos)
 | 
						|
			{
 | 
						|
				m_boardPosition = pos;
 | 
						|
				if (m_boardPosition != null)
 | 
						|
				{
 | 
						|
					m_gameController.StartedLookingAtPosition(m_boardPosition);
 | 
						|
				}
 | 
						|
			}
 | 
						|
 | 
						|
			// clear the potential move if they gaze off the board
 | 
						|
			if (hit.collider == m_gazeTracker)
 | 
						|
			{
 | 
						|
				m_gameController.ClearProposedMove();
 | 
						|
			}
 | 
						|
 | 
						|
			// moves the camera with the mouse - very useful for debugging in to 2D mode.
 | 
						|
			if (Input.GetButton("Fire2"))
 | 
						|
			{
 | 
						|
				var v = Input.GetAxis("Mouse Y");
 | 
						|
				var h = Input.GetAxis("Mouse X");
 | 
						|
				transform.rotation *= Quaternion.AngleAxis(h, Vector3.up);
 | 
						|
				transform.rotation *= Quaternion.AngleAxis(-v, Vector3.right);
 | 
						|
				Vector3 eulers = transform.eulerAngles;
 | 
						|
				eulers.z = 0;
 | 
						|
				transform.eulerAngles = eulers;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |