轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
阅读:2138回复:4

Unity中展示动态数据波形图

楼主#
更多 发布于:2015-12-02 19:07
实现效果图:

图片:2.png

图片:1.png



图片:23.gif



主要实现功能:
(1)       通过socket获取的数据动态存到本地SQLite;
(2)       SQLite中的数据提取出来并画在面板上;
(3)       面板上的数据展示满足两个功能:a、随着socket接受的数据动态更新;b、滑动滑条查看历史数据,红色指引部分为滑条
PS:不要问我为啥这么SB要在Unity里面搞这个东西。不是我想的,由于项目有一半使用Unity做的三维可视化。
运行条件:socket0.5s发送一个数据包。
 
实现方法流程:

图片:3.png


 
 
具体实现
 
1、首先操作数据库,主要借鉴雨凇博客里面有方法,根据需求封装了几个类:
由于是0.5s动态存储,就没有采用存一次就关掉,那么链接数据库的类做一个单例,在Awake里面执行一次:
public static ConnectDB instance;
    void Awake()
    {      
        instance = this;
        OpenDB("data source=VisualData.db");              
   
}

刚开始采用接收一条存一次,发现有点卡顿,浪费资源,就在类里面做一个批量存储的方法:
 
public SqliteDataReader InsertInto(string tableName, List<Data>
_dataList)
    {
        idNum
= instance.GetCount("DataTable");
        string query = "INSERT INTO " + tableName;
        {
            for (int i = 0; i < _dataList.Count; ++i)
            {
                idNum++;
                _time += _timeDelta;
                query += " select " +
idNum+", "+_time;
                foreach (double _double in _dataList.ToDouble())
                {
                    query += ", " +
_double;
                }
                if (i != _dataList.Count - 1)
                {
                    query += " union all ";
                }
            }
        }
        return ExecuteQuery(query);
   
    }
获取数据库中表格总数:
public int GetCount(string _table)
    {       
        string query = "SELECT COUNT(*) FROM " +
_table;
        dbCommand = dbConnection.CreateCommand();
        dbCommand.CommandText = query;
       //
Debug.Log(dbCommand.ExecuteScalar().ToString());     
        return System.Int32.Parse(dbCommand.ExecuteScalar().ToString());
   
    }

通过偏移量获取数据方法:
public List<DataTable>
GetDataTable(string[] _name, int _position, int _num)
    {
        string query = "SELECT " +  _name[0];
        for (int i = 1; i < _name.Length; i++)
        {
            query += "," +
_name;
        }
        query
+= " FROM DataTable LIMIT " + _position + "," + _num;
        dbCommand = dbConnection.CreateCommand();
        dbCommand.CommandText = query;
        reader = dbCommand.ExecuteReader();
        DataTable tb = new DataTable();
        tb.Load(reader);
        List<DataTable>
_table = new List<DataTable>();       
        return _table;
   
}

2、根据上面对数据库的操作就可以通过滑条或者时间从数据库获取到想要数据,然后就是划线:
采用Vectrosity插件,这个插件蛮强大的。
public void DrawTable(List<Vector2>
_list, string _lineName, int?
_layer = null)
    {
        if (line != null)
        {
            VectorLine.Destroy(ref line);
        }
        if (pointList.Count >= 2)
        {
            line = new VectorLine(_lineName,
ListToArray(pointList), null, 4 *
3000f / Screen.width, LineType.Continuous);
            if (_layer != null)
                line.vectorObject.gameObject.layer = _layer.Value;
            line.Draw();      
        }
   
    }

该插件常用的函数:
new VectorLine(_lineName,
ListToArray(pointList), null, 4 *
3000f / Screen.width, LineType.Continuous)和VectorLine.SetCamera;

大家可以去看一下它的源码,由于项目里面要同时画很多波形图,所以从源码里面单独扩展了了一下SetCamera的方法:
   
void SetLineCamera()
    {
        if (m_Camera == null)
        {
            GameObject obj = new GameObject("123");
            m_Camera = obj.AddComponent<Camera>();
        }
        m_Camera.clearFlags = CameraClearFlags.Skybox;
        m_Camera.orthographic = false;
        m_Camera.fieldOfView = 90f;
        m_Camera.farClipPlane = 2000f;
        m_Camera.nearClipPlane = 0.01f;
        m_Camera.transform.position = new Vector3((float)(Screen.width / 2) - 0.5f, (float)(Screen.height / 2) - 0.5f, 0f);
        m_Camera.transform.eulerAngles = Vector3.zero;
        m_Camera.cullingMask = 1 << m_layer;
        m_Camera.backgroundColor = new Color(0, 0, 0, 0);
        m_Camera.targetTexture = lineTexture;
        m_Camera.depth = 50;
    }

最新喜欢:

AhrenLiAhrenL... kingdong020543kingdo... 归海一啸归海一啸

欢迎分享

归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2015-12-04 10:04
果然技术大牛
AR学院(www.arvrschool.com),从这里感触未来!
轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
板凳#
发布于:2015-12-06 00:08
归海一啸:果然技术大牛回到原帖
,我是靠脸吃饭的
AhrenLi
新手
新手
  • UID375
  • 粉丝0
  • 关注0
  • 发帖数5
地板#
发布于:2016-01-25 12:32
正是我想要的,3Q
轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
4楼#
发布于:2016-01-25 17:20
AhrenLi:正是我想要的,3Q回到原帖
多来网站转转,会有很多意外收获,加油!
游客

返回顶部