一:设备认知

1:先单独创建一个相机,对需要进行设备认知的模型进行单独渲染;然后创建一个RenderingTexture来接收其渲染结果。如下图所示:

网上 虚拟仿真 MySQL 虚拟仿真的流程_网上 虚拟仿真 MySQL

2:创建一个RawImage来显示相机对模型的渲染结果,将上一步创建的RenderingTexture赋值给RawImage,

网上 虚拟仿真 MySQL 虚拟仿真的流程_UI_02


3:创建一个Image,位置、大小与RawImage一样,将其调成完全透明,再将控制模型的脚本挂在上面,以及添加EventTrigger组件,如下图所示:

网上 虚拟仿真 MySQL 虚拟仿真的流程_UI_03


控制模型脚本如下:

private float m_fDeltaX;
    private float m_fDeltaY;
    public float m_fSpeed = 0;
    public bool isClick = false;

    //初始旋转
    private Vector3 startRotate;
    public Vector3 startScale;
    /// 起始位置
    private Vector3 StartPosition;
    /// 鼠标按下的之前位置
    private Vector3 previousPosition;
    /// 鼠标按下之后的滑动距离
    private Vector3 offset;
    /// 鼠标抬起后距离初始位置的位置
    private Vector3 finalOffset;
    float scale = 1f;
    //需要控制的物体
    public GameObject obj;
     void Start()
    {
        m_fSpeed = 1000;
        startRotate = obj.transform.localEulerAngles;
      
    }


    void Update()
    {
       
        if (Input.GetMouseButton(0) && isClick)
        {
            if (Input.GetMouseButtonDown(0))    // Input.GetMouseButtonDown(0) 当0键被按下一次
            {
                StartPosition = Input.mousePosition;
                previousPosition = Input.mousePosition;
            }
            if (Input.GetMouseButton(0))       // Input.GetMouseButton(0) 当0键被按住持续侦测(包含down和up各一次)
            {
                offset = Input.mousePosition - previousPosition;
                previousPosition = Input.mousePosition;
                Vector3 Xoffset = new Vector3(offset.x, offset.y, 0);
                obj.transform.Rotate(Vector3.Cross(Xoffset, Vector3.forward).normalized, offset.magnitude * 0.5f, Space.World);
            }
        }
        if (isClick)
        {
            if (Input.GetAxis("Mouse ScrollWheel") != 0)//这个是鼠标滚轮响应函数
            {
                //滚轮响应一次就让scale自增或自减,注意,滚轮函数是有返回值的,
                //返回是float型的!这个由滚轮向前(正数)还是向后(负数)滚决定
                scale += Input.GetAxis("Mouse ScrollWheel");
                obj.transform.localScale = new Vector3(1 * scale, 1 * scale, 1 * scale);//改变物体大小
            }
        }
    }
    public void OnMouseDown()
    {
        isClick = true;
    }
    public void OnMouseUp()
    {
        isClick = false;
    }

二:2D鼠标拖拽

在需要进行拖拽功能的Image上添加BoxCollider,然后将控制拖拽的脚本挂载上去即可实现拖拽功能,如下图所示:

网上 虚拟仿真 MySQL 虚拟仿真的流程_unity_04


拖拽脚本如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;


public class DragPanel : MonoBehaviour, IDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        float x = Input.mousePosition.x;
        float y = Input.mousePosition.y;
        //物体拖拽的一个范围  根据实际项目分辨率自行合理设置即可
        x = Mathf.Clamp(x, 100, 1800);
        y = Mathf.Clamp(y, 100, 900);

        transform.position = new Vector3(x, y);
    }

    private Vector3 StartPos;

    private void Start()
    {
        StartPos = transform.localPosition;
    }

    public void ChangePos()
    {
        transform.localPosition = StartPos;
    }
}

三:鼠标点击3D物体

Ray ray;
    RaycastHit hit;
    GameObject obj;
    // Update is called once per frame
    void Update()
    {
        if (EventSystem.current.IsPointerOverGameObject()) return;

        Ray ray = Camera.main.GetComponent<Camera>().ScreenPointToRay(Input.mousePosition);
        if (Camera.main.gameObject.activeSelf == false) return;
        if (Physics.Raycast(ray, out hit, 1000, 1 << 9))//9代表检测的物体层级
        {
            obj = hit.collider.gameObject;
        }
    }

四:UI的自适应处理

1:将canvas的UIScaleMode设为ScaleWithScreenSize,并设定好分辨率。

2:UI设置好锚点后,然后将此面板的四个锚点分别设置在面板的四个顶点上,将面板包裹住,如下图所示:

网上 虚拟仿真 MySQL 虚拟仿真的流程_unity_05

五:UI的排版小技巧

1:如果一个父物体下有多个子物体,比如说背包系统按钮这种,那么可以通过给父物体添加GridLayoutGroup组件,然后设置其对应参数,实现排版自由:
重要参数
Padding:内边距(子物体与父物体的间隔距离)
CellSize:控制子物体的宽高尺寸
StartCornor:第一个元素的位置锚点
StartAxis:元素排列的一个轴向,水平排列还是竖直排列。
Spqcing:元素之间的间隔距离
ChildAlignment:对齐方式
Constraint:对行数和列数的要求