-AUTEUR(S): giyomuSan
-DESCRIPTION : Classe pour definir diverse operation avec raycast..pour le moment juste une seule fonction pour un raycast avec la camera, par la suite cette classe peut etre etendu avec plus de functions ( que j'ajouterais en update ici ).
Le but etant juste de se faire une sorte de wrapper / helper classe pour gerer certaine operation sans avoir a les re-ecrires a chaque coup ou de devoir drag dropper un script a chaque fois ...
Selon les besoins les arguments du constructeur peuvent etre etendu..
Le script fonctionne pour n'importe quelle plateforme ( y compris mobile si on utilise un single touch )
-UTILISATION : Importer le fichier RayCastHelper.cs dans votre projet, et creer une instance de celui-ci depuis n'importe quel autre script, en lui passant les arguments necessaires dans son constructeur
- SCRIPT :
Code : Tout sélectionner
using UnityEngine;
public class RaycastHelper
{
private readonly Camera _camera;
// Constructeur
public RaycastHelper(Camera camera)
{
_camera = camera;
}
public bool GetCameraRayCastInfos(Vector2 input, out RaycastHit hit)
{
var ray = _camera.ScreenPointToRay(input);
hit = new RaycastHit();
if(Physics.Raycast(ray, out hit, Mathf.Infinity))
return true;
return false;
}
}
Vous pouvez telecharger le package il contient deja la scene toute prete et les deux scripts
Code : Tout sélectionner
using UnityEngine;
// TestRay.cs
public class TestRay : MonoBehaviour
{
private RaycastHelper _raycastHelper;
private bool _rayFlag = false;
private RaycastHit _hit = new RaycastHit();
private Transform _hitTransform;
// Use this for initialization
void Start ()
{
// Creation d'une instance RaycastHelper
_raycastHelper = new RaycastHelper(Camera.mainCamera);
}
// Update is called once per frame
private void Update ()
{
if(Input.GetMouseButtonDown(0))
{
if( _raycastHelper.GetCameraRayCastInfos(Input.mousePosition, out _hit))
{
_rayFlag = true;
_hitTransform = _hit.collider.transform;
}
else
{
_hitTransform = null;
_rayFlag = false;
}
}
if(_hitTransform)
_hitTransform.Rotate(new Vector3(10f, 20f, 10f) * Time.deltaTime);
}
private void OnGUI()
{
if(_rayFlag)
{
var labelPos = Camera.mainCamera.WorldToScreenPoint( _hit.point);
GUI.Label(new Rect(labelPos.x, Screen.height - labelPos.y, 300f, 50f), "Distance\nFrom\nCamera = " + _hit.distance);
GUI.Label(new Rect(labelPos.x, Screen.height - labelPos.y + 50f, 300f, 50f), "I am a " + _hit.collider.name);
}
}
private void OnDrawGizmos()
{
if(_rayFlag)
{
Gizmos.color = Color.red;
Gizmos.DrawSphere(_hit.point, 0.1f + (_hit.distance / 100f));
Gizmos.color = Color.cyan;
Gizmos.DrawRay(_hit.point, _hit.normal.normalized * 2f);
}
}
}