当前位置:   article > 正文

unity|从数据库中读取信息 鼠标悬停显示文字/图片 (GUI)_unity鼠标检测ui显示图片

unity鼠标检测ui显示图片

一、效果图

鼠标悬停在3D物体上(带有碰撞体的物体),用GUI显示
这里的MHQX_1304和图片都是从数据库里取出来的
在这里插入图片描述

1、需要显示信息的物体

  • 给物体添加碰撞体
  • 将名字命名为数据库里的主键或者是唯一的就好(因为要根据名字去数据库里搜索)

在这里插入图片描述

2、代码分解

1、GUI显示信息(部分)

原理:鼠标发出一条射线,碰撞检测
调用方式:showName()

private void showName(){
        Ray ray = _camera.ScreenPointToRay(Input.mousePosition);    //定义一条射线,这条射线从摄像机屏幕射向鼠标所在位置
        RaycastHit hit;    //声明一个碰撞的点
        GUI.skin.label.fontSize = 24;       //字体大小
       
        if (Physics.Raycast(ray, out hit))
        {    
            //如果真的发生了碰撞,ray这条射线在hit点与物体碰撞了
            GUI.Label(new Rect(Input.mousePosition.x + 15, Screen.height - Input.mousePosition.y, 200, 100), "显示的信息"); 
            
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2、读数据(部分)

引用集
using MySql.Data.MySqlClient;
using System.Data;

全局变量
private string device_id=null;
private string qr_code= null;
Database db;
DataSet ds = new DataSet();//数据库链接

调用方式
link(“XFS_1301”);//消防栓编号

private Boolean link(string name) 
{
    db = new Database();
    string str = "select * from build_device where device_id='" + name +  "'";//SQL语句 根据物体的编号从数据库中select相对应的记录
    try
    {
        MySqlDataReader sdr = db.Query(str);
        Debug.Log(str);
        if (sdr.Read())
        {
            int id = sdr.GetInt32(sdr.GetOrdinal("Id"));
            device_id = sdr.GetString(sdr.GetOrdinal("device_id"));//取出此条记录的device_id字段的数据
            return true;
        }
        else
        {
            sdr.Close();
            return false;
        }
    }
    catch (Exception e1)
    {
        Debug.Log("发生异常中断,错误原因:\n" + e1);
        return false;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

3、连接数据库、数据库配置信息(完整)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
using System.Data;


class Database
{
/*
这里修改数据库信息
Database      数据库名称
User ID       用户
Password 	  密码
Host		  主机
Port          端口号
*/
    public string connectionString = "User ID=root;Database=fire; Password=123456; Host=127.0.0.1; Port= 3306;Protocol=TCP; Compress=false; Pooling=true; Min Pool Size=0;Max Pool Size=100; Connection Lifetime=0;Charset=utf8 ";
    MySqlConnection connection = null;
    DataSet ds1 = new DataSet();
    public Database()
    {
        connection = new MySqlConnection(connectionString);
        connection.Open();
    }

    public MySqlDataReader Query(string str)
    {
        MySqlDataReader sdr = null;
        try
        {
            MySqlCommand cmd = new MySqlCommand(str, connection);
            cmd.CommandTimeout = 50;
            sdr = cmd.ExecuteReader();
        }
        catch (Exception e1)
        {
           // MessageBox.Show(e1.Message);
        }

        return sdr;
    }

    ~Database()
    {
        connection.Close();
    }

    public int NonQuery(string str)
    {
        int num = 0;
        try
        {
            MySqlCommand cmd = new MySqlCommand(str, connection);
            cmd.CommandTimeout = 50;
            num = cmd.ExecuteNonQuery();
        }
        catch (Exception e1)
        {
            //MessageBox.Show(e1.Message);
        }
        return num;
    }
    public DataSet Dataset(string str, string tablename)
    {
        MySqlCommand cmd = new MySqlCommand(str, connection);
        MySqlDataAdapter sda = new MySqlDataAdapter();
        sda.SelectCommand = cmd;
        DataSet ds = new DataSet();
        sda.Fill(ds, tablename);
        return ds;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

4、挂在摄像机上的代码(完整)

using MySql.Data.MySqlClient;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using UnityEngine;
using UnityEngine.UI;

public class GetTag : MonoBehaviour
{
    private Camera _camera;
    private string device_id=null;
    private string qr_code= null;
    private Texture2D imageTexture;
    // Start is called before the first frame update

    Database db;
    DataSet ds = new DataSet();//数据库链接

    void Start()
    {
        _camera = GetComponent<Camera>();//获取场景中摄像机对象的组件接口
    }

    // Update is called once per frame
    void Update()
    {

    }
    void OnGUI()
    {
        showName();
    }

    private void showName(){
        Ray ray = _camera.ScreenPointToRay(Input.mousePosition);    //定义一条射线,这条射线从摄像机屏幕射向鼠标所在位置
        RaycastHit hit;    //声明一个碰撞的点
        GUI.skin.label.fontSize = 24;       //字体大小
       
        if (Physics.Raycast(ray, out hit))
        {    
            //如果真的发生了碰撞,ray这条射线在hit点与物体碰撞了
            
            if (Showindex(hit.transform.name) == true)
            {             
                LoadByWWW();
                GUI.Label(new Rect(Input.mousePosition.x + 15, Screen.height - Input.mousePosition.y, 200, 100), device_id); 
                GUI.Label(new Rect(Input.mousePosition.x + 15, Screen.height - Input.mousePosition.y+30, 300, 300), imageTexture);
                //GUI.Label(new Rect(Input.mousePosition.x + 15, Screen.height - Input.mousePosition.y, 300, 300), imageTexture);
            }
        }
    }
    private Boolean Showindex(string name) {
        db = new Database();
        string str = "select * from build_device where device_id='" + name +  "'";//SQL语句 根据物体的编号从数据库中select相对应的记录
        try
        {
            MySqlDataReader sdr = db.Query(str);
            Debug.Log(str);
            if (sdr.Read())
            {
                int id = sdr.GetInt32(sdr.GetOrdinal("Id"));
                device_id = sdr.GetString(sdr.GetOrdinal("device_id"));
                qr_code = sdr.GetString(sdr.GetOrdinal("qr_code"));
                return true;
            }
            else
            {
                Debug.Log("鼠标不在有碰撞体的物体上");
                sdr.Close();
                return false;
            }
        }
        catch (Exception e1)
        {

            Debug.Log("发生异常中断,错误原因:\n" + e1);
            return false;
        }
    }
    private void LoadByWWW()
    {
        StartCoroutine(Load());
    }
    IEnumerator Load()
    {
        WWW www = new WWW(qr_code);//请求WWW
        yield return www;
        if (www != null && string.IsNullOrEmpty(www.error))
        {
            imageTexture = www.texture;//获取Texture
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

总结

  • 将3和4的代码放入Project->Assets->Scripts
  • 将4代码挂在摄像机上
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/668234
推荐阅读
相关标签
  

闽ICP备14008679号