• Unity-WIKI 之 DebugLine


    脚本功能

    在Unity中要使用画线功能,需要添加LineRenderer 组件,或打开Gizmos功能,下面这个组件为开发带来了方便

    功能预览

    image image image

    搭建步骤

    1、创建“Plugins” 文件夹

    2、在“Plugins”中创建"DebugLine.cs"

    3、提供两个方法:DrawLine() or DebugLine.DrawRay()

    注意:场景中必须有一个相机的tag是MainCamera

    组件源码

    using UnityEngine;
    using System.Collections;
    
    public class UseDebugLine : MonoBehaviour {
    
        // Use this for initialization
        void Start () {
            DebugLine.DrawLine(new Vector3(0, 0, 0), new Vector3(5, 5, -5), Color.cyan, 4, 2);
        }
        
        // Update is called once per frame
        void Update () {
            DebugLine.DrawRay(transform.position, transform.forward * 10, Color.blue);
            DebugLine.DrawRay(transform.position, transform.up * 10, Color.green);
            DebugLine.DrawRay(transform.position, transform.right * 10, Color.red);
        }
    }
    

    DebugLine.cs

    /* Author: Spencer Evans
     * 
     * Description:
     * DebugLine.cs provides 2 useful functions for debugging : DrawLine and DrawRay. These functions are almost identical to those provided in the Unity 3D 
     * engine Debug class (http://docs.unity3d.com/Documentation/ScriptReference/Debug.html), except in the following ways:
     * 1. The lines are drawn in the Game window, not the Scene editor window.
     * 2. A "width" option is provided - allowing the user to choose the width in pixels of the line drawn.
     * 3. The "depthTest" parameter in the Debug.DrawLine() and Debug.DrawRay() functions is unavailable; all lines are obscured by objects closer to the camera.
     * 
     * Usage:
     * 1. Create a new folder titled "Plugins", and move it to your project's "/Assets" folder (if you haven't already).
     * 2. Create and place "DebugLine.cs" inside the "/Plugins" folder.
     * 3. Call the DebugLine.DrawLine() or DebugLine.DrawRay() functions just as you would with the Debug class.
     * 
     * Notes:
     * 1. You must have a Camera in your scene tagged "MainCamera" for these debug functions to work properly.
     * 2. You do NOT need Unity Pro for this to work.
     */
     
    using UnityEngine;
    using System.Collections;
     
    public class DebugLine : MonoBehaviour
    {
        //used to make calls from both Update and FixedUpdate function properly
        public float destroy_time = float.MaxValue;
        public float fixed_destroy_time = float.MaxValue;
     
        //draw ray functions - http://docs.unity3d.com/Documentation/ScriptReference/Debug.DrawRay.html
        public static void DrawRay(Vector3 start, Vector3 dir)
        {
            DebugLine.DrawLine(start, start + dir, Color.white);
        }
        public static void DrawRay(Vector3 start, Vector3 dir, Color color, float duration = 0, float width = 1)
        {
            DebugLine.DrawLine(start, start + dir, color, duration, width);
        }
     
        //draw line functions - http://docs.unity3d.com/Documentation/ScriptReference/Debug.DrawLine.html
        public static void DrawLine(Vector3 start, Vector3 end)
        {
            DebugLine.DrawLine(start, end, Color.white);
        }
        public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration = 0, float width = 1)
        {
            //early out if there is no Camera.main to calculate the width
            if (!Camera.main)
                return;
     
            GameObject line = new GameObject("debug_line");
     
            //set the params of the line renderer - http://docs.unity3d.com/Documentation/ScriptReference/LineRenderer.html
            LineRenderer lineRenderer = line.AddComponent<LineRenderer>();
            lineRenderer.material = new Material(Shader.Find("Mobile/Particles/Additive"));
            lineRenderer.SetPosition( 0, start );
            lineRenderer.SetPosition( 1, end );
            lineRenderer.SetColors( color, color );
            lineRenderer.SetWidth( DebugLine.CalcPixelHeightAtDist( (start - Camera.main.transform.position).magnitude) * width,
                                   DebugLine.CalcPixelHeightAtDist( (end - Camera.main.transform.position).magnitude) * width    );
     
            //add the MonoBehaviour instance
            DebugLine debugLine = line.AddComponent<DebugLine>();
     
            //set the time to expire - default is 0 (will only draw for one update cycle)
            //use Update or FixedUpdate depending on the time of the invoking call
            if (Time.deltaTime == Time.fixedDeltaTime)
                debugLine.fixed_destroy_time = Time.fixedTime + duration;
            else    debugLine.destroy_time = Time.time + duration;
        }
     
        //utility function to calculate the world height of a single pixel given the following info:
        // - Camera.main.fov
        // - Camera.main.pixelHeight
        // - distance to the camera
        public static float CalcPixelHeightAtDist(float dist)
        {
            //early out if there is no Camera.main to calculate the width
            if (!Camera.main)
                return 0;
     
            //http://docs.unity3d.com/Documentation/Manual/FrustumSizeAtDistance.html
            float frustumHeight = 2 * dist * Mathf.Tan(Camera.main.fieldOfView * 0.5f * Mathf.Deg2Rad);
     
            return frustumHeight / Camera.main.pixelHeight;
        }
     
        //check to see if should be destroyed yet
        public void Update ()
        {
            if (Time.time > destroy_time)
                Destroy(transform.gameObject);
        }
        public void FixedUpdate ()
        {
            if (Time.fixedTime > fixed_destroy_time)
                Destroy(transform.gameObject);
        }
    }
  • 相关阅读:
    【Storm篇】--Storm从初始到分布式搭建
    【Storm篇】--Storm 容错机制
    git命令log与reflog的比较
    长时间不操作Navicat或Putty会断线?
    git使用ssh密钥
    公钥能用公钥解吗?
    什么是公钥,,什么是密钥啊 ?有什么区别吗?
    CSS滑动门
    Html设置文本换行与不按行操作
    设置鼠标光标与页面favicon
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/3648861.html
Copyright © 2020-2023  润新知