在Unity中创建图表

时间:2016-05-10 11:23:55

标签: c# unity3d graph

我正在创建一款测量玩家反应时间的智能手机游戏。我想显示一个图表,显示每次点击的时间,以及显示平均值的线。

我想放图的图片:

enter image description here

这是可以使用Unity实现的,还是我应该使用其他软件来完成这项工作?

我的反应时间变量存储在数组中。

4 个答案:

答案 0 :(得分:2)

您可以使用一些选项在Unity中创建行。

1:LineRenderer:非常难以获得复杂的结果

2:支付Vectrosity:更复杂,更合适的插件。

3:使用平面和一些代码制作自己的图表。我有一个WIP插件做这个方法,我得到了非常好的结果。如果对此有任何疑问,我可以帮助你。

enter image description here

答案 1 :(得分:0)

如果您使用的是标准Unity对象(带有Transform组件),我认为LineRenderer组件可以满足您的需求。

如果您使用的是Unity UI(并且需要一个带有RectTransform的组件),您可以在这里查看:http://forum.unity3d.com/threads/new-ui-and-line-drawing.253772/

看看来自jonbro5556的帖子,他显然是为Unity UI创建了一个线组件(我还没有对它进行过测试,但值得一看)

答案 2 :(得分:0)

您可以尝试动态折线图-资产商店中提供的插件

Dynamic Line Chart

您可以尝试以下github仓库,该仓库能够绘制折线图。

Line Graph

您需要更改LineGraphManager脚本中的以下行以进行实时Feed

void Start(){

        // adding random data
        int index = 120;
        for(int i = 0; i < index; i++){
            GraphData gd = new GraphData();
            gd.marbles = Random.Range(10,47); // insert your data instead of random one
            graphDataPlayer1.Add(gd);
        }

        // showing graph
        ShowGraph();
    }

答案 3 :(得分:0)

因此,我为necro-post感到抱歉,但是我试图为一个项目完成类似的工作,并想出了这个(如下)来绘制一种示波器图。我以为我会发布基本信息。它在可移动的GUI.Window中绘制图形。目前没有“风吹草动”。它只是绘制了大量的随机值,但可以用作其他人的起点。

        using System.Collections.Generic;
        using UnityEngine;

        /// <summary>
        /// Draws a basic oscilloscope type graph in a GUI.Window()
        /// Michael Hutton May 2020
        /// This is just a basic 'as is' do as you wish...
        /// Let me know if you use it as I'd be interested if people find it useful.
        /// I'm going to keep experimenting wih the GL calls...eg GL.LINES etc 
        /// </summary>
        public class Graph : MonoBehaviour
        {

            Material mat;
            private Rect windowRect = new Rect(20, 20, 512, 256);

            // A list of random values to draw
            private List<float> values;

            // The list the drawing function uses...
            private List<float> drawValues = new List<float>();

            // List of Windows
            private bool showWindow0 = false;

            // Start is called before the first frame update
            void Start()
            {
                mat = new Material(Shader.Find("Hidden/Internal-Colored"));
                // Should check for material but I'll leave that to you..

                // Fill a list with ten random values
                values = new List<float>();
                for (int i = 0; i < 10; i++)
                {
                    values.Add(Random.value * 200);
                }
            }

            // Update is called once per frame
            void Update()
            {
                // Keep adding values
                values.Add(Random.value * 200);
            }

            private void OnGUI()
            {
                // Create a GUI.toggle to show graph window
                showWindow0 = GUI.Toggle(new Rect(10, 10, 100, 20), showWindow0, "Show Graph");

                if (showWindow0)
                {
                    // Set out drawValue list equal to the values list 
                    drawValues = values;
                    windowRect = GUI.Window(0, windowRect, DrawGraph, "");
                }

            }


            void DrawGraph(int windowID)
            {
                // Make Window Draggable
                GUI.DragWindow(new Rect(0, 0, 10000, 10000));

                // Draw the graph in the repaint cycle
                if (Event.current.type == EventType.Repaint)
                {
                    GL.PushMatrix();

                    GL.Clear(true, false, Color.black);
                    mat.SetPass(0);

                    // Draw a black back ground Quad 
                    GL.Begin(GL.QUADS);
                    GL.Color(Color.black);
                    GL.Vertex3(4, 4, 0);
                    GL.Vertex3(windowRect.width - 4, 4, 0);
                    GL.Vertex3(windowRect.width - 4, windowRect.height - 4, 0);
                    GL.Vertex3(4, windowRect.height - 4, 0);
                    GL.End();

                    // Draw the lines of the graph
                    GL.Begin(GL.LINES);
                    GL.Color(Color.green);

                    int valueIndex = drawValues.Count - 1;
                    for (int i = (int)windowRect.width - 4; i > 3; i--)
                    {
                        float y1 = 0;
                        float y2 = 0;
                        if (valueIndex > 0)
                        {
                            y2 = drawValues[valueIndex];
                            y1 = drawValues[valueIndex - 1];
                        }
                        GL.Vertex3(i, windowRect.height - 4 - y2, 0);
                        GL.Vertex3((i - 1), windowRect.height - 4 - y1, 0);
                        valueIndex -= 1;
                    }
                    GL.End();

                    GL.PopMatrix();
                }
            }
        }

我希望它很有用(可能不是对OP而是...)

迈克尔