Advertisement
Guest User

Untitled

a guest
Oct 31st, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.00 KB | None | 0 0
  1. using System.Collections.Generic;
  2. using System.Diagnostics;
  3. using UnityEngine;
  4.  
  5. public class RayTest : MonoBehaviour
  6. {
  7.     public static class DiagnosticsHelper
  8.     {
  9.         public static Stopwatch Watch = new Stopwatch();
  10.         private static string CurrentMeasurementName;
  11.  
  12.         public static void StartMeasurement(string measurementName)
  13.         {
  14.             CurrentMeasurementName = measurementName;
  15.             Watch.Reset();
  16.             Watch.Start();
  17.         }
  18.  
  19.         public static void ReportMeasurement()
  20.         {
  21.             Watch.Stop();
  22.             UnityEngine.Debug.Log(string.Format("{0} ended in {1}ms", CurrentMeasurementName, Watch.ElapsedMilliseconds));
  23.         }
  24.     }
  25.  
  26.  
  27.     public List<Collider> OwnedColliders;
  28.     public float RayLength = 10;
  29.  
  30.  
  31.     public RaycastHit? Raycast_ExcludeCollider(Vector3 origin, Vector3 direction, float distance, List<Collider> ignore)
  32.     {
  33.         var ray = new Ray(origin, direction);
  34.         var hits = new List<RaycastHit>(Physics.RaycastAll(ray, distance));
  35.         hits.Sort((a, b) => (a.distance.CompareTo(b.distance)));
  36.         foreach(var hit in hits)
  37.         {
  38.             if (ignore.Contains(hit.collider)) continue;
  39.             return hit;
  40.         }
  41.         return null;
  42.     }
  43.  
  44.     public RaycastHit? Raycast_NoIgnore(Vector3 origin, Vector3 direction, float distance)
  45.     {
  46.         RaycastHit hit;
  47.         var ray = new Ray(origin, direction);
  48.         if (Physics.Raycast(ray, out hit, distance, 1))
  49.             return hit;
  50.         return null;
  51.     }
  52.  
  53.     public RaycastHit? Raycast_DisableColliders(Vector3 origin, Vector3 direction, float distance, List<Collider> ignore)
  54.     {
  55.         for (var i = 0; i < ignore.Count; i++) ignore[i].enabled = false;
  56.         var result = Raycast_NoIgnore(origin, direction, distance);
  57.         for (var i = 0; i < ignore.Count; i++) ignore[i].enabled = true;
  58.         return result;
  59.     }
  60.  
  61.     public RaycastHit? Raycast_DisableGameObjects(Vector3 origin, Vector3 direction, float distance, List<Collider> ignore)
  62.     {
  63.         for (var i = 0; i < ignore.Count; i++) ignore[i].gameObject.SetActive(false);
  64.         var result = Raycast_NoIgnore(origin, direction, distance);
  65.         for (var i = 0; i < ignore.Count; i++) ignore[i].gameObject.SetActive(true);
  66.         return result;
  67.     }
  68.  
  69.     private static Collider[] _excludedColliders;
  70.     private static int[] _colliderLayers;
  71.  
  72.     public static void ExcludeCollidersFromNextRaycast(Collider[] colliders)
  73.     {
  74.         _excludedColliders = colliders;
  75.         _colliderLayers = new int[colliders.Length];
  76.         for (var i = 0; i < _colliderLayers.Length; i++)
  77.         {
  78.             var gameObject = colliders[i].gameObject;
  79.             _colliderLayers[i] = gameObject.layer;
  80.             gameObject.layer = 31;
  81.         }
  82.     }
  83.  
  84.     public static void RollbackColliders()
  85.     {
  86.         for (var i = 0; i < _excludedColliders.Length; i++)
  87.             _excludedColliders[i].gameObject.layer = _colliderLayers[i];
  88.     }
  89.  
  90.     public RaycastHit? Raycast_ChangeLayer(Vector3 origin, Vector3 direction, float distance, Collider[] ignore)
  91.     {
  92.         ExcludeCollidersFromNextRaycast(ignore);
  93.         var result = Raycast_NoIgnore(origin, direction, distance);
  94.         RollbackColliders();
  95.         return result;
  96.     }
  97.  
  98.     private void Start()
  99.     {
  100.         var toIgnore = OwnedColliders.ToArray();
  101.         var hit = Raycast_ChangeLayer(transform.position, transform.forward, RayLength, toIgnore);
  102.  
  103.         DiagnosticsHelper.StartMeasurement("No ignore (1000k)");
  104.         for (var i = 0; i < 1000000; i++) hit = Raycast_NoIgnore(transform.position, transform.forward, RayLength);
  105.         DiagnosticsHelper.ReportMeasurement();
  106.  
  107.         DiagnosticsHelper.StartMeasurement("Change layer (1000k)");
  108.         for (var i = 0; i < 1000000; i++) hit = Raycast_ChangeLayer(transform.position, transform.forward, RayLength, toIgnore);
  109.         DiagnosticsHelper.ReportMeasurement();
  110.  
  111.         DiagnosticsHelper.StartMeasurement("Excluding colliders (1000k)");
  112.         for (var i = 0; i < 1000000; i++) hit = Raycast_ExcludeCollider(transform.position, transform.forward, RayLength, OwnedColliders);
  113.         DiagnosticsHelper.ReportMeasurement();
  114.  
  115.         DiagnosticsHelper.StartMeasurement("Disable colliders (1000k)");
  116.         for (var i = 0; i < 1000000; i++) hit = Raycast_DisableColliders(transform.position, transform.forward, RayLength, OwnedColliders);
  117.         DiagnosticsHelper.ReportMeasurement();
  118.  
  119.  
  120.         DiagnosticsHelper.StartMeasurement("Disable game objects (1000k)");
  121.         for (var i = 0; i < 1000000; i++) hit = Raycast_DisableGameObjects(transform.position, transform.forward, RayLength, OwnedColliders);
  122.         DiagnosticsHelper.ReportMeasurement();
  123.  
  124.  
  125.         if (hit != null)
  126.             UnityEngine.Debug.DrawLine(transform.position, hit.Value.point, Color.green, 10);
  127.         else
  128.             UnityEngine.Debug.DrawLine(transform.position, transform.position + transform.forward * RayLength, Color.red, 10);
  129.     }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement