当前位置:   article > 正文

虚拟仿真项目部分常用方法总结

虚拟仿真

一:设备认知

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

2:创建一个RawImage来显示相机对模型的渲染结果,将上一步创建的RenderingTexture赋值给RawImage,
在这里插入图片描述
3:创建一个Image,位置、大小与RawImage一样,将其调成完全透明,再将控制模型的脚本挂在上面,以及添加EventTrigger组件,如下图所示:
在这里插入图片描述
控制模型脚本如下:

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;
    }
  • 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

二:2D鼠标拖拽

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

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;
    }
}
  • 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

三:鼠标点击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;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

四:UI的自适应处理

1:将canvas的UIScaleMode设为ScaleWithScreenSize,并设定好分辨率。
2:UI设置好锚点后,然后将此面板的四个锚点分别设置在面板的四个顶点上,将面板包裹住,如下图所示:
在这里插入图片描述

五:UI的排版小技巧

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/590278
推荐阅读
相关标签
  

闽ICP备14008679号