Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections.Generic;
- using System.Diagnostics;
- using UnityEngine;
- public class RayTest : MonoBehaviour
- {
- public static class DiagnosticsHelper
- {
- public static Stopwatch Watch = new Stopwatch();
- private static string CurrentMeasurementName;
- public static void StartMeasurement(string measurementName)
- {
- CurrentMeasurementName = measurementName;
- Watch.Reset();
- Watch.Start();
- }
- public static void ReportMeasurement()
- {
- Watch.Stop();
- UnityEngine.Debug.Log(string.Format("{0} ended in {1}ms", CurrentMeasurementName, Watch.ElapsedMilliseconds));
- }
- }
- public List<Collider> OwnedColliders;
- public float RayLength = 10;
- public RaycastHit? Raycast_ExcludeCollider(Vector3 origin, Vector3 direction, float distance, List<Collider> ignore)
- {
- var ray = new Ray(origin, direction);
- var hits = new List<RaycastHit>(Physics.RaycastAll(ray, distance));
- hits.Sort((a, b) => (a.distance.CompareTo(b.distance)));
- foreach(var hit in hits)
- {
- if (ignore.Contains(hit.collider)) continue;
- return hit;
- }
- return null;
- }
- public RaycastHit? Raycast_NoIgnore(Vector3 origin, Vector3 direction, float distance)
- {
- RaycastHit hit;
- var ray = new Ray(origin, direction);
- if (Physics.Raycast(ray, out hit, distance, 1))
- return hit;
- return null;
- }
- public RaycastHit? Raycast_DisableColliders(Vector3 origin, Vector3 direction, float distance, List<Collider> ignore)
- {
- for (var i = 0; i < ignore.Count; i++) ignore[i].enabled = false;
- var result = Raycast_NoIgnore(origin, direction, distance);
- for (var i = 0; i < ignore.Count; i++) ignore[i].enabled = true;
- return result;
- }
- public RaycastHit? Raycast_DisableGameObjects(Vector3 origin, Vector3 direction, float distance, List<Collider> ignore)
- {
- for (var i = 0; i < ignore.Count; i++) ignore[i].gameObject.SetActive(false);
- var result = Raycast_NoIgnore(origin, direction, distance);
- for (var i = 0; i < ignore.Count; i++) ignore[i].gameObject.SetActive(true);
- return result;
- }
- private static Collider[] _excludedColliders;
- private static int[] _colliderLayers;
- public static void ExcludeCollidersFromNextRaycast(Collider[] colliders)
- {
- _excludedColliders = colliders;
- _colliderLayers = new int[colliders.Length];
- for (var i = 0; i < _colliderLayers.Length; i++)
- {
- var gameObject = colliders[i].gameObject;
- _colliderLayers[i] = gameObject.layer;
- gameObject.layer = 31;
- }
- }
- public static void RollbackColliders()
- {
- for (var i = 0; i < _excludedColliders.Length; i++)
- _excludedColliders[i].gameObject.layer = _colliderLayers[i];
- }
- public RaycastHit? Raycast_ChangeLayer(Vector3 origin, Vector3 direction, float distance, Collider[] ignore)
- {
- ExcludeCollidersFromNextRaycast(ignore);
- var result = Raycast_NoIgnore(origin, direction, distance);
- RollbackColliders();
- return result;
- }
- private void Start()
- {
- var toIgnore = OwnedColliders.ToArray();
- var hit = Raycast_ChangeLayer(transform.position, transform.forward, RayLength, toIgnore);
- DiagnosticsHelper.StartMeasurement("No ignore (1000k)");
- for (var i = 0; i < 1000000; i++) hit = Raycast_NoIgnore(transform.position, transform.forward, RayLength);
- DiagnosticsHelper.ReportMeasurement();
- DiagnosticsHelper.StartMeasurement("Change layer (1000k)");
- for (var i = 0; i < 1000000; i++) hit = Raycast_ChangeLayer(transform.position, transform.forward, RayLength, toIgnore);
- DiagnosticsHelper.ReportMeasurement();
- DiagnosticsHelper.StartMeasurement("Excluding colliders (1000k)");
- for (var i = 0; i < 1000000; i++) hit = Raycast_ExcludeCollider(transform.position, transform.forward, RayLength, OwnedColliders);
- DiagnosticsHelper.ReportMeasurement();
- DiagnosticsHelper.StartMeasurement("Disable colliders (1000k)");
- for (var i = 0; i < 1000000; i++) hit = Raycast_DisableColliders(transform.position, transform.forward, RayLength, OwnedColliders);
- DiagnosticsHelper.ReportMeasurement();
- DiagnosticsHelper.StartMeasurement("Disable game objects (1000k)");
- for (var i = 0; i < 1000000; i++) hit = Raycast_DisableGameObjects(transform.position, transform.forward, RayLength, OwnedColliders);
- DiagnosticsHelper.ReportMeasurement();
- if (hit != null)
- UnityEngine.Debug.DrawLine(transform.position, hit.Value.point, Color.green, 10);
- else
- UnityEngine.Debug.DrawLine(transform.position, transform.position + transform.forward * RayLength, Color.red, 10);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement