Advertisement
thebeardphantom

MakeScreenColliders

Jul 28th, 2014
1,846
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.07 KB | None | 0 0
  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class MakeScreenColliders : MonoBehaviour {
  5.  
  6.     [Tooltip("What camera to poll viewport information from. Uses Camera.main when this is not specified.")]
  7.     public Camera cam;
  8.     [Tooltip("How far the colliders are scaled in the camera's forward direction. Has no effect when 'use3DPhysics' is set to 'false'.")]
  9.     public float depth = 100f;
  10.     [Tooltip("When camera is in perspective mode, what distance to sample at to get the correct bounding box. Has no effect when camera is in orthographic mode."), Range(0f, 1f)]
  11.     public float distanceQuery = 1f;
  12.     [SerializeField, Tooltip("Changes between 2D and 3D collider physics. Can not be adjusted at runtime.")]
  13.     bool use3DPhysics = false;
  14.  
  15.     bool _use3DPhysics = false;
  16.     float _distanceQuery = 1000f;
  17.     float _skin2D = 0.05f;
  18.  
  19.     GameObject top, bottom, left, right;
  20.     GameObject[] barriers;
  21.  
  22.     void Start() {
  23.         //Allows overriding on what camera to use for positioning
  24.         //Will use the main camera when one isn't provided.
  25.         if(cam == null)
  26.             cam = Camera.main;
  27.  
  28.         _use3DPhysics = use3DPhysics;
  29.  
  30.         if(_use3DPhysics)
  31.             Create3DBarriers();
  32.         else
  33.             Create2DBarriers();
  34.     }
  35.  
  36.     private void Create2DBarriers() {
  37.         top = GameObject.CreatePrimitive(PrimitiveType.Cube);
  38.         top.name = "Top";
  39.         top.transform.localScale = new Vector3(0f, _skin2D, 0f);
  40.  
  41.         bottom = GameObject.CreatePrimitive(PrimitiveType.Cube);
  42.         bottom.name = "Bottom";
  43.         bottom.transform.localScale = new Vector3(0f, _skin2D, 0f);
  44.  
  45.         left = GameObject.CreatePrimitive(PrimitiveType.Cube);
  46.         left.name = "Left";
  47.         left.transform.localScale = new Vector3(_skin2D, 0f, 0f);
  48.  
  49.         right = GameObject.CreatePrimitive(PrimitiveType.Cube);
  50.         right.name = "Right";
  51.         right.transform.localScale = new Vector3(_skin2D, 0f, 0f);
  52.  
  53.         barriers = new GameObject[] { top, bottom, left, right };
  54.  
  55.         foreach(var b in barriers) {
  56.             DestroyImmediate(b.collider);
  57.             //no need to render these.
  58.             DestroyImmediate(b.renderer);
  59.  
  60.             b.transform.parent = cam.transform;
  61.  
  62.             var bc = b.AddComponent<BoxCollider2D>();
  63.             var rb = b.AddComponent<Rigidbody2D>();
  64.             rb.isKinematic = true;
  65.         }
  66.     }
  67.  
  68.     private void Create3DBarriers() {
  69.         top = GameObject.CreatePrimitive(PrimitiveType.Cube);
  70.         top.name = "Top";
  71.         top.transform.localScale = new Vector3(100f, 0f, 0f);
  72.  
  73.         bottom = GameObject.CreatePrimitive(PrimitiveType.Cube);
  74.         bottom.name = "Bottom";
  75.         bottom.transform.localScale = new Vector3(100f, 0f, 0f);
  76.  
  77.         left = GameObject.CreatePrimitive(PrimitiveType.Cube);
  78.         left.name = "Left";
  79.         left.transform.localScale = new Vector3(0f, 100f, 0f);
  80.  
  81.         right = GameObject.CreatePrimitive(PrimitiveType.Cube);
  82.         right.name = "Right";
  83.         right.transform.localScale = new Vector3(0f, 100f, 0f);
  84.  
  85.         barriers = new GameObject[] { top, bottom, left, right };
  86.  
  87.         foreach(var b in barriers) {
  88.             b.transform.parent = cam.transform;
  89.             var rb = b.AddComponent<Rigidbody>();
  90.             rb.isKinematic = true;
  91.  
  92.             //no need to render these.
  93.             DestroyImmediate(b.renderer);
  94.         }
  95.  
  96.         SetScales();
  97.         SetPositions();
  98.     }
  99.  
  100.     private void SetScales() {
  101.         var verticalSize = (cam.isOrthoGraphic) ? cam.orthographicSize * 2.0f : 2.0f * _distanceQuery * Mathf.Tan(cam.fieldOfView * 0.5f * Mathf.Deg2Rad);
  102.         var horizontalSize = (cam.isOrthoGraphic) ? verticalSize * ((float)Screen.width / (float)Screen.height) : verticalSize * cam.aspect;
  103.  
  104.         top.transform.localScale = (_use3DPhysics) ? new Vector3(horizontalSize, 0f, depth) : new Vector3(horizontalSize, _skin2D, 0f);
  105.         bottom.transform.localScale = (_use3DPhysics) ? new Vector3(horizontalSize, 0f, depth) : new Vector3(horizontalSize, _skin2D, 0f);
  106.         left.transform.localScale = (_use3DPhysics) ? new Vector3(0f, verticalSize, depth) : new Vector3(_skin2D, verticalSize, 0f);
  107.         right.transform.localScale = (_use3DPhysics) ? new Vector3(0f, verticalSize, depth) : new Vector3(_skin2D, verticalSize, 0f);
  108.     }
  109.  
  110.     private void SetPositions() {
  111.         //Camera rotations mess up the positions
  112.         var camRot = cam.transform.rotation;
  113.         cam.transform.rotation = Quaternion.identity;
  114.  
  115.         top.transform.position = cam.ViewportToWorldPoint(new Vector3(0.5f, 1f, _distanceQuery));
  116.         bottom.transform.position = cam.ViewportToWorldPoint(new Vector3(0.5f, 0f, _distanceQuery));
  117.         left.transform.position = cam.ViewportToWorldPoint(new Vector3(0f, 0.5f, _distanceQuery));
  118.         right.transform.position = cam.ViewportToWorldPoint(new Vector3(1f, 0.5f, _distanceQuery));
  119.  
  120.         foreach(var b in barriers)
  121.             b.transform.localPosition = ZeroZ(b.transform);
  122.  
  123.         //reset to the real rotation.
  124.         cam.transform.rotation = camRot;
  125.     }
  126.  
  127.     //Make each cube's position start at the camera's z position and extend outwards.
  128.     private Vector3 ZeroZ(Transform t) {
  129.         var pos = t.localPosition;
  130.         pos.z = (_use3DPhysics) ? t.localScale.z / 2f : 0f;
  131.  
  132.         return pos;
  133.     }
  134.  
  135.     void FixedUpdate() {
  136.         if(cam == null)
  137.             cam = Camera.main;
  138.  
  139.         distanceQuery = Mathf.Clamp01(distanceQuery);
  140.         _distanceQuery = cam.farClipPlane * distanceQuery;
  141.         _distanceQuery = Mathf.Clamp(_distanceQuery, cam.nearClipPlane, cam.farClipPlane);
  142.  
  143.         SetScales();
  144.         SetPositions();
  145.     }
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement