这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地github中文官网网页
  • 我的个人博客
  • QQ群:1040082875

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

前段时间分享了UGUI的每个组件的属性和使giti轮胎用方法,比如Text、Button、开源代码网站githubImage、ToggleGitHub、InputField、Scrogit教程llView等等。

接着分享了UGUI的一些原理,开源阅读比如说UG开源代码网站githubUI的渲染模式、UGUI的缩放计github官网算、UGUI的描点定位、UGUI的自动布局等等。

相信大家看完后会对UGUI有一个比较全面的认识了。

下面,就继续开源节流是什么意思分享UGUI的UI组件进行应用的3d模型可以导入su吗实例。

二、介绍及效果图

童鞋给我带来了一个问题,能不能在UI上显示3D模型,并且还可以交互,而且还要弹窗口。

那就分享一下如何弹窗显示模型吧giticomfort是什么轮胎

这里主要是使用UGUI的RawImage显示纹理组件来映射摄像机的信息到UI上,然后交互还是跟模型交互3d模型怎么转成su模型,但是在UI上就好像是控制UI一样。

效果图:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互

源代码: download.csdn.net/download/q7…

三、实现

33d模型素材网站-1gitee、搭建场景

我们首先搭建一个UI场景:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
4个Image添加Button组件,用来响应点击事件:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
将4个Imagitige改变一下名字,这在后giti轮胎面的代码编写的时候会用到:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
先将摄像机的位置移3d模型软件动到(0,1,-10)并且旋转归零:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
然后将枪摆放到合适的位置:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
因为,将枪的位置旋转和缩放都改变了,这在旋转对象的时候会出现旋转问题,所以需要给它们3d模型各自设置一个旋转为0的父物体:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互

3-23d模型素材网站、设置弹窗

接下来,就需要设置一个层级最高的Panel作为弹窗口,也就是将弹窗Panelgithub永久回家地址放到最后渲染:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
设置弹窗的UI:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
UI就随便摆,最重要的是要有一个RawImage用来显示模型,然后新建一个Render Textu开源软件rgit教程e:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
将新建的Teture对象,拖入摄开源代码网站github像机组件的TargetTexture属性:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
之后,将Teture对象拖入UI的RawImage对象的Texture属性:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
可以看到,在UI中已经能看到摄像机中的图像了:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
为了展示更好,设置一下Main Camera的属性:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互

3-3、编写UI响应代码

新建脚本BugiteettonManager.cs:

using UnityEngine;
using UnityEngine.UI;
public class ButtonManager : MonoBehaviour
{
    public Button btn1;
    public Button btn2;
    public Button btn3;
    public Button btn4;
    public Button CloseBtn;
    public GameObject popupPanel;//弹窗
    public GameObject[] Gun;//四个模型
    // Start is called before the first frame update
    void Start()
    {
        btn1.onClick.AddListener(()=>BtnOnClickEvent(btn1.name));
        btn2.onClick.AddListener(()=>BtnOnClickEvent(btn2.name));
        btn3.onClick.AddListener(()=>BtnOnClickEvent(btn3.name));
        btn4.onClick.AddListener(()=>BtnOnClickEvent(btn4.name));
        CloseBtn.onClick.AddListener(ClosePanel);
        popupPanel.SetActive(false);
    }
    private void BtnOnClickEvent(string btnName)
    {
        popupPanel.SetActive(true);
        for (int i = 0; i < Gun.Length; i++)
        {
            Gun[i].SetActive(false);
        }
        switch (btnName)
        {
            case "gun1":
                Gun[0].SetActive(true);
                break;
            case "gun2":
                Gun[1].SetActive(true);
                break;
            case "gun3":
                Gun[2].SetActive(true);
                break;
            case "gun4":
                Gun[3].SetActive(true);
                break;
            default:
                break;
        }
    }
    private void ClosePanel()
    {
        popupPanel.SetActive(false);
    }
}

将脚本拖到相机上,并将对应的对象拖到对应的卡槽中:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
运行开源矿工程序,可以看到效果:
【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互
提示: 如果提示没有摄像机渲染,可以3d模型制作再新建一个Came开源阅读app下载安装ra即可。

3-4、实现模型交互

接下来实现模型的拖动、放大、旋转等交互 新建脚本ModelManager.cs:

using UnityEngine;
public class ModelManager : MonoBehaviour
{
    private Vector2 tempXY;
    private Vector2 targetAngles;
    private Vector3 currentAngles;
    public GameObject Gun;//同一个父物体
    public float rotateSpeed = 1;
    public float moveSpeed = 1;
    public Camera userCamera;
    void Update()
    {
        ModelControl();
    }
    public void ModelControl()
    {
        if (Input.GetMouseButton(0))
        {
            tempXY.x -= -Input.GetAxis("Mouse X") * moveSpeed;
            tempXY.y += Input.GetAxis("Mouse Y") * moveSpeed;
            Vector3 temp = new Vector3(tempXY.x, tempXY.y, 0);
            Gun.transform.position = temp;
        }
        else if (Input.GetMouseButton(1))
        {
            targetAngles.y -= Input.GetAxis("Mouse X") * rotateSpeed;
            currentAngles = Vector3.Lerp(currentAngles, targetAngles, Time.deltaTime / 0.2f);
            Gun.transform.eulerAngles = currentAngles;
        }
        else if (Input.GetAxis("Mouse ScrollWheel") != 0)
        {
            //鼠标滚动滑轮 值就会变化
            if (Input.GetAxis("Mouse ScrollWheel") < 0)
            {
                //范围值限定
                if (userCamera.fieldOfView <= 100)
                    userCamera.fieldOfView += 2;
                if (userCamera.orthographicSize <= 20)
                    userCamera.orthographicSize += 0.5F;
            }
            //Zoom in  
            if (Input.GetAxis("Mouse ScrollWheel") > 0)
            {
                //范围值限定
                if (userCamera.fieldOfView > 16)
                    userCamera.fieldOfView -= 2;
                if (userCamera.orthographicSize >= 1)
                    userCamera.orthographicSize -= 0.5F;
            }
        }
    }
}

将4个枪的父物体设置为同一个父物体:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互

将这个脚本附到MainCamera身上,将对应的参数拖进去:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互

效果如图:

【Unity3D-UGUI应用篇】(四)使用UGUI弹窗显示模型及弹窗模型交互

四、后言

模型的移动、旋转,跟子级父级的位置旋转有很大的关联,子级的位置或者父级的位置旋转没有设置好。 会有各gitlab种各样的GitHub不对应的情况,比如说子物体没有按照自身的Git坐标旋转,绕父物体的坐标旋转,或者移动的时候模型会先自动移动到中心位置,然后移动。

这样情况下最好的解决方案就是: 1、将父物体和子物体的坐标都归零 。 2、子物体保存自3d模型软件己的旋转位置即可。