Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 13 Next capture
2021 2022 2023
1 capture
13 Jun 22 - 13 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by Squire Grooktook · Nov 26, 2014 at 10:09 PM · scene-viewviews

Can you only make Raycasts visible in scene view?

I'm working in Unity 2d, and I've put

Debug.DrawLine (lineStart.position, lineEnd.position, Color.red);

in a function called Raycast, which is constantly called from Update(). I'm told that by setting Raycasts to visible on the gizmos tab, you can see them. However this only seems to work for me in the Scene view, and not the Game view or preview. Is there a way to make them visible during gameplay?

Comment
Add comment
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

2 Replies

· Add your reply
  • Sort: 
avatar image
0

Answer by Graham-Dunnett · Nov 26, 2014 at 10:09 PM

Use the GL API to draw lines in the game.

Comment
Add comment · Show 1 · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image Squire Grooktook · Nov 27, 2014 at 03:50 AM 0
Share

I tried going by the Unity Documentation page on GL Lines

I set a "mat" variable at the top

$$anonymous$$aterial mat;

and created a function like in the documentation, but with the mouse position and vertex swapped out for the points at which my raycast are generated.

 void OnPostRender(){
     if (!mat) {
         Debug.LogError("Please Assign a material on the inspector");
         return;
     }
     GL.Push$$anonymous$$atrix();
     mat.SetPass(0);
     GL.LoadOrtho();
     GL.Begin(GL.LINES);
     GL.Color(Color.red);
     GL.Vertex(lineStart.position);
     GL.Vertex((lineEnd.position));
     GL.End();
     GL.Pop$$anonymous$$atrix();
 }


It says however that the mat is never assigned, and doesn't show up in the game. I'm somewhat confused by how this all works, first time I've ever heard of materials.

avatar image
0

Answer by Cherno · Nov 27, 2014 at 05:25 AM

Here is Drawing.cs, taken from the Unity Wiki (I think).

It's used by calling Drawing.DrawLine(Vector2 pointA, Vector2 pointB, Color color, float width, bool antiAlias) and you obviously have to convert points in 3D space to 2d Screen points first.

 using System.Reflection;
 using UnityEngine;
 
 // Line drawing routine originally courtesy of Linusmartensson:
 // http://forum.unity3d.com/threads/71979-Drawing-lines-in-the-editor
 //
 // Rewritten to improve performance by Yossarian King / August 2013.
 //
 // This version produces virtually identical results to the original (tested by drawing
 // one over the other and observing errors of one pixel or less), but for large numbers
 // of lines this version is more than four times faster than the original, and comes
 // within about 70% of the raw performance of Graphics.DrawTexture.
 //
 // Peak performance on my laptop is around 200,000 lines per second. The laptop is
 // Windows 7 64-bit, Intel Core2 Duo CPU 2.53GHz, 4G RAM, NVIDIA GeForce GT 220M.
 // Line width and anti-aliasing had negligible impact on performance.
 //
 // For a graph of benchmark results in a standalone Windows build, see this image:
 // https://app.box.com/s/hyuhi565dtolqdm97e00
 //
 // For a Google spreadsheet with full benchmark results, see:
 // https://docs.google.com/spreadsheet/ccc?key=0AvJlJlbRO26VdHhzeHNRMVF2UHZHMXFCTVFZN011V1E&usp=sharing
 
 public static class Drawing
 {
     private static Texture2D aaLineTex = null;
     private static Texture2D lineTex = null;
     private static Material blitMaterial = null;
     private static Material blendMaterial = null;
     private static Rect lineRect = new Rect(0, 0, 1, 1);
     
     // Draw a line in screen space, suitable for use from OnGUI calls from either
     // MonoBehaviour or EditorWindow. Note that this should only be called during repaint
     // events, when (Event.current.type == EventType.Repaint).
     //
     // Works by computing a matrix that transforms a unit square -- Rect(0,0,1,1) -- into
     // a scaled, rotated, and offset rectangle that corresponds to the line and its width.
     // A DrawTexture call used to draw a line texture into the transformed rectangle.
     //
     // More specifically:
     //      scale x by line length, y by line width
     //      rotate around z by the angle of the line
     //      offset by the position of the upper left corner of the target rectangle
     //
     // By working out the matrices and applying some trigonometry, the matrix calculation comes
     // out pretty simple. See https://app.box.com/s/xi08ow8o8ujymazg100j for a picture of my
     // notebook with the calculations.
     public static void DrawLine(Vector2 pointA, Vector2 pointB, Color color, float width, bool antiAlias)
     {
         // Normally the static initializer does this, but to handle texture reinitialization
         // after editor play mode stops we need this check in the Editor.
         #if UNITY_EDITOR
         if (!lineTex)
         {
             Initialize();
         }
         #endif
         
         // Note that theta = atan2(dy, dx) is the angle we want to rotate by, but instead
         // of calculating the angle we just use the sine (dy/len) and cosine (dx/len).
         float dx = pointB.x - pointA.x;
         float dy = pointB.y - pointA.y;
         float len = Mathf.Sqrt(dx * dx + dy * dy);
         
         // Early out on tiny lines to avoid divide by zero.
         // Plus what's the point of drawing a line 1/1000th of a pixel long??
         if (len < 0.001f)
         {
             return;
         }
         
         // Pick texture and material (and tweak width) based on anti-alias setting.
         Texture2D tex;
         Material mat;
         if (antiAlias)
         {
             // Multiplying by three is fine for anti-aliasing width-1 lines, but make a wide "fringe"
             // for thicker lines, which may or may not be desirable.
             width = width * 3.0f;
             tex = aaLineTex;
             mat = blendMaterial;
         }
         else
         {
             tex = lineTex;
             mat = blitMaterial;
         }
         
         float wdx = width * dy / len;
         float wdy = width * dx / len;
         
         Matrix4x4 matrix = Matrix4x4.identity;
         matrix.m00 = dx;
         matrix.m01 = -wdx;
         matrix.m03 = pointA.x + 0.5f * wdx;
         matrix.m10 = dy;
         matrix.m11 = wdy;
         matrix.m13 = pointA.y - 0.5f * wdy;
         
         // Use GL matrix and Graphics.DrawTexture rather than GUI.matrix and GUI.DrawTexture,
         // for better performance. (Setting GUI.matrix is slow, and GUI.DrawTexture is just a
         // wrapper on Graphics.DrawTexture.)
         GL.PushMatrix();
         GL.MultMatrix(matrix);
         Graphics.DrawTexture(lineRect, tex, lineRect, 0, 0, 0, 0, color, mat);
         GL.PopMatrix();
     }
     
     // Other than method name, DrawBezierLine is unchanged from Linusmartensson's original implementation.
     public static void DrawBezierLine(Vector2 start, Vector2 startTangent, Vector2 end, Vector2 endTangent, Color color, float width, bool antiAlias, int segments)
     {
         Vector2 lastV = CubeBezier(start, startTangent, end, endTangent, 0);
         for (int i = 1; i < segments; ++i)
         {
             Vector2 v = CubeBezier(start, startTangent, end, endTangent, i/(float)segments);
             Drawing.DrawLine(lastV, v, color, width, antiAlias);
             lastV = v;
         }
     }
     
     private static Vector2 CubeBezier(Vector2 s, Vector2 st, Vector2 e, Vector2 et, float t)
     {
         float rt = 1 - t;
         return rt * rt * rt * s + 3 * rt * rt * t * st + 3 * rt * t * t * et + t * t * t * e;
     }
     
     // This static initializer works for runtime, but apparently isn't called when
     // Editor play mode stops, so DrawLine will re-initialize if needed.
     static Drawing()
     {
         Initialize();
     }
     
     private static void Initialize()
     {
         if (lineTex == null)
         {
             lineTex = new Texture2D(1, 1, TextureFormat.ARGB32, false);
             lineTex.SetPixel(0, 1, Color.white);
             lineTex.Apply();
         }
         if (aaLineTex == null)
         {
             // TODO: better anti-aliasing of wide lines with a larger texture? or use Graphics.DrawTexture with border settings
             aaLineTex = new Texture2D(1, 3, TextureFormat.ARGB32, false);
             aaLineTex.SetPixel(0, 0, new Color(1, 1, 1, 0));
             aaLineTex.SetPixel(0, 1, Color.white);
             aaLineTex.SetPixel(0, 2, new Color(1, 1, 1, 0));
             aaLineTex.Apply();
         }
         
         // GUI.blitMaterial and GUI.blendMaterial are used internally by GUI.DrawTexture,
         // depending on the alphaBlend parameter. Use reflection to "borrow" these references.
         blitMaterial = (Material)typeof(GUI).GetMethod("get_blitMaterial", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, null);
         blendMaterial = (Material)typeof(GUI).GetMethod("get_blendMaterial", BindingFlags.NonPublic | BindingFlags.Static).Invoke(null, null);
     }
 }
Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

4 People are following this question.

avatar image avatar image avatar image avatar image

Related Questions

Setting z axis to certain point in scene and game view instantly... 1 Answer

Trouble with unity calls Android native view 0 Answers

I m new to unity and wants to reset my scene view to orthographic as it comes when you create a new project? 0 Answers

My Scene window went black and is throwing a console error, now I can't see anything 1 Answer

camera isn't moving in the editor 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges