unity中将3D场景中的3DUI界面转换为2DUI界面(方法一)

Unity之XR Interaction Toolkit 射线拖拽3DUI VR项目里正常情况有放置两种3DUI的方式!1.固定在某个位置不动(这个没什么好稀奇的,正常搭建3dUI即可)2.3DUI跟随操作者,并且可以改变跟随速度、距离、以及多少角度后刷新跟随等等第二种方式只需要添加nteraction Toolkit官方提供的代码即可:LazyFollow如果遇到向手柄射线拖动UI ,随意放置位置,怎么实现?好记性不如烂笔头! 阅读详情

此方法是改变3D场景中3DUI界面的父类,实现点击3DUI界面呈现在屏幕上。

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

public class MachineInfoUICon : MonoBehaviour
{
    private EventTrigger m_eventTrigger;
    private GameObject m_machineInfoCanvas;
    private GameObject m_machineInfoParent;
    private GameObject m_machineInfoPanel;

    private GameObject m_UIObj;

    void Start()
    {

        m_machineInfoCanvas = GameObject.Find("MachineInfoCanvas");
        m_machineInfoParent = m_machineInfoCanvas.transform.FindChild("machineInfoParent").gameObject;
        m_machineInfoPanel = m_machineInfoCanvas.transform.FindChild("machineInfoPanel").gameObject;
        m_machineInfoPanel.SetActive(false);

        //效果1时下面一行注释,效果2下面一行显示,不写下面一行也可以
        //m_machineInfoCanvas.GetComponent<CanvasScaler>().scaleFactor = 0.01f;

        if (GameObject.Find("jiali_QF_Aircontrol(Clone)") != null)
        {
            m_UIObj = GameObject.Find("jiali_QF_Aircontrol(Clone)/Sensor/" + this.gameObject.transform.parent.name);
            //Debug.LogError("空压机" + this.gameObject.transform.parent.name);
        }

        //AddTriggersListener(this.gameObject, EventTriggerType.PointerEnter, Enter);
        AddTriggersListener(this.gameObject, EventTriggerType.PointerClick, Click);
        //屏幕分辨率
        CommonFunc.Instance().ScreenUISelfAdptationFunc(m_machineInfoParent, 5);
        CommonFunc.Instance().ScreenUISelfAdptationFunc(m_machineInfoPanel, 5);

    }
  
    void Update()
    {

        if (Input.GetMouseButtonDown(0))
        {
            if (m_machineInfoState == MachineInfoState.click)
            {
                //Debug.LogError("鼠标点击");
                m_machineInfoState = MachineInfoState.exit;
            }

        }


        if (m_machineInfoState == MachineInfoState.enter)
        {
            //效果1------改变物体的大小Scale属性
            m_machineInfoPanel.SetActive(true);
            this.gameObject.transform.parent = m_machineInfoParent.transform;
            this.gameObject.transform.localPosition = Vector3.zero;
            this.gameObject.transform.localRotation = Quaternion.identity;
            this.gameObject.transform.localScale = new Vector3(0.65f, 0.65f, 1);
            m_machineInfoState = MachineInfoState.click;

            ////效果2------改变Canvas的大小scaleFactor属性
            //m_machineInfoCanvas.GetComponent<CanvasScaler>().scaleFactor += Time.deltaTime * 10f;
            //if (m_machineInfoCanvas.GetComponent<CanvasScaler>().scaleFactor >= 1)
            //{
            //    m_machineInfoCanvas.GetComponent<CanvasScaler>().scaleFactor = 1;

            //    m_machineInfoPanel.SetActive(true);
            //    this.gameObject.transform.parent = m_machineInfoParent.transform;
            //    this.gameObject.transform.localPosition = Vector3.zero;
            //    this.gameObject.transform.localRotation = Quaternion.identity;
            //    this.gameObject.transform.localScale = new Vector3(0.65f, 0.65f, 1);

            //    m_machineInfoState = MachineInfoState.click;

            //}

        }
        else if (m_machineInfoState == MachineInfoState.click)
        {

            //if (Input.GetMouseButtonDown(0))
            //{
            //    Debug.LogError("鼠标点击");

            //    m_machineInfoState = MachineInfoState.exit;

            //}

        }
        else if (m_machineInfoState == MachineInfoState.exit)
        {
            //效果1------改变物体的大小Scale属性
            m_machineInfoPanel.SetActive(false);
            this.gameObject.transform.parent = m_UIObj.transform;
            this.gameObject.transform.localPosition = Vector3.zero;
            this.gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);
            this.gameObject.transform.localScale = Vector3.one;
            m_machineInfoState = MachineInfoState.end;

            ////效果2------改变Canvas的大小scaleFactor属性
            //m_machineInfoCanvas.GetComponent<CanvasScaler>().scaleFactor -= Time.deltaTime * 10f;
            //if (m_machineInfoCanvas.GetComponent<CanvasScaler>().scaleFactor <= 0.01f)
            //{
            //    m_machineInfoCanvas.GetComponent<CanvasScaler>().scaleFactor = 0.01f;

            //    m_machineInfoPanel.SetActive(false);
            //    this.gameObject.transform.parent = m_UIObj.transform;
            //    this.gameObject.transform.localPosition = Vector3.zero;
            //    this.gameObject.transform.localRotation = Quaternion.Euler(0, 0, 0);
            //    this.gameObject.transform.localScale = Vector3.one;

            //    m_machineInfoState = MachineInfoState.end;
            //}
        }
        else if (m_machineInfoState == MachineInfoState.end)
        {

        }
    }

    public void Enter(BaseEventData arg0)
    {

        //Debug.LogError("Enter");
        m_machineInfoState = MachineInfoState.enter;

    }
    public void Click(BaseEventData arg0)
    {

        //Debug.Log("Click");
        m_machineInfoState = MachineInfoState.enter;

    }
    /// <summary>
    /// 为obj添加Eventrigger监听事件  
    /// </summary>
    /// <param name="obj">添加监听的对象</param>
    /// <param name="eventType">添加的监听类型</param>
    /// <param name="action">触发的函数</param>
    private void AddTriggersListener(GameObject obj, EventTriggerType eventType, UnityAction<BaseEventData> action)
    {
        m_eventTrigger = obj.GetComponent<EventTrigger>();
        if (m_eventTrigger == null)
        {
            m_eventTrigger = obj.AddComponent<EventTrigger>();
        }
        if (m_eventTrigger.triggers.Count == 0)
        {
            m_eventTrigger.triggers = new List<EventTrigger.Entry>();
        }
        //定义所要绑定的事件类型   
        EventTrigger.Entry entry = new EventTrigger.Entry();
        //设置事件类型    
        entry.eventID = eventType;
        //定义回调函数    
        UnityAction<BaseEventData> callback = new UnityAction<BaseEventData>(action);
        //设置回调函数    
        entry.callback.AddListener(callback);
        //添加事件触发记录到GameObject的事件触发组件    
        m_eventTrigger.triggers.Add(entry);
    }
    public static Vector3 WorldToUIPoint(Canvas canvas, Transform worldGo)
    {
        Vector3 v_v3 = Camera.main.WorldToScreenPoint(worldGo.position);
        Vector3 v_ui = canvas.worldCamera.ScreenToWorldPoint(v_v3);
        Vector3 v_new = new Vector3(v_ui.x, v_ui.y, canvas.GetComponent<RectTransform>().anchoredPosition3D.z);
        return v_new;
    }

    public MachineInfoState m_machineInfoState = MachineInfoState.start;
    public enum MachineInfoState
    {
        start,
        enter,
        click,
        exit,
        end
    }

}

 

[Unity][NGUI]3DUI如何实现 参考NGUI 阅读详情

相关推荐

unity新输入系统3DUI无响应

World Space UI点击无响应

JZAA_111_7的博客 1333

unity3D和2D项目编辑器内切换

新建一个unity的工程不小心把2D项目工程建成了3D工程。建错了,怎么办?

alayeshi的专栏 2122

Unity之2DUI和3DUI混合开发

基本概念是建立两个canvas,一个是放置UI,一个是放置3D模型,并且两个canvas的“RenderMode”都设置为“Screen Space Camera”,并且“Render Camera”都设置为同一个“Camera”。在此渲染模式下,画布的行为与场景中的所有其他对象相同。通常的做法是直接修改Canvas的“Plane Distance”属性值,但我的3DUI的一部分模型是显示在2DUI的后面,一部分显示在2DUI的前面,我的做法是直接修改模型坐标的”Z”值,如下图陨石显示在UI的后面。

xiaobao4106的专栏 1717

Unity_2D游戏实例从零讲起(3)——基本菜单UI的实现

Unity3D_2D游戏实例从零讲起(3)——基本菜单UI的实现   游戏除了基本的画面渲染,操作对象等等,还需要各种UI菜单来辅助玩家,或是引导,或是做游戏设置。比如,登录菜单,图片的显示,人物血条等等。                                                     游戏——辐射4的UI界面   为什么要有单独的UI制作系统呢? UI是任

Jerish的博客 3万+

【虚拟仿真】Unity3D中实现2DUI显示在3D物体旁边

这篇文章来实现2DUI显示在3D物体旁边,当我们需要在3D模型旁边显示2DUI的时候,比如人物的对话、物体旁边的说明面板会用到。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1185

【虚拟仿真】Unity3D中实现3DUI,并且实现Button、InputField、Toggle等事件绑定

最近在项目中需要用到3DUI的展示,之前一般会用TextMeshPro进行展示:但是,后面又需要添加按钮、Toggle等,就捣鼓了一下,走通了。这篇文章就将这些内容整理一下。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 1486

unity中将3D场景中的3DUI界面转换为2DUI界面(方法二)

此方法是将世界坐标转换为屏幕坐标,并实现UI的缩放移动效果,具体情况具体分析。 应用于3D场景中有很多3DUI界面,功能如下所示。【效果&gt;&gt;&gt;&gt;从哪里来到哪里去&lt;&lt;&lt;&lt;】 点击3DUI界面转换为2DUI界面,并放大移动到屏幕中心显示 点击已点击过3DUI界面或其它3DUI界面,显示的2DUI界面缩小回原处并放大新点击的3DUI界面 给2D...

螞蟻的日常 4640

Unity3D 画面扭曲切换效果脚本

Unity3D 画面扭曲切换效果脚本 DreamWipe.js 1. var camera1 : Camera; 2.var camera2 : Camera; 3.var fadeTime = 4.0; 4.var waveScale = .07; // Higher numbers make the effect more exaggerated. Can be negative, .5/-.5 is the max 5.var waveFrequency = 25.0; // Higher numbers make more waves in the effect 6.private var inProgress = false; 7.private var swap = false; 8. 9.function Start () { 10. ScreenWipe.use.InitializeDreamWipe(); 11.} 12.function Update () { 13. if (Input.GetKeyDown("space")) { 14. DoFade(); 15. } 16.} 17.function DoFade () { 18. if (inProgress) return; 19. inProgress = true; 20. 21. swap = !swap; 22. yield ScreenWipe.use.DreamWipe (swap? camera1 : camera2, swap? camera2 : camera1, fadeTime, waveScale, waveFrequency); 23. 24. inProgress = false; 25.}

Unity工程3D和2D开发模式切换

在新建工程时,经常会选择默认的3D工程,但是如果想做2D游戏又不小心选了3D工程,可以通过如下方式更改: Edit > Project Settings > Editor > DefaultBehaviorMode 改成2D ...

yf391005的博客 8725

Unity3D Shader实现贴图切换效果

主要为大家详细介绍了Unity3D Shader实现贴图切换效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

别再调参了!用Simulink手把手教你搞定FOC电机速度环PI控制器(附模型下载)

本文详细介绍了如何使用Simulink搭建FOC电机速度环PI控制器,通过模最优准则和系统化调试方法,避免传统手动调参的繁琐过程。文章包含从传递函数推导到参数自动整定的完整流程,并提供了实战调试技巧与异常处理指南,帮助工程师快速实现电机控制系统的稳定运行。

weixin_42519985的博客 412

Unity3D中2DUI跟随场景中3D物体

平面UI跟随场景中的3D物体类似于血条的跟随效果。 经过几种方案的对比发现把3D物体的坐标转化为平面坐标的方案是最行之有效的方法。 下面直接上代码 public class FollwScript : MonoBehaviour { public Transform gob3d;//3d物体 public RectTransform imageRec;//2dUI public Ve

逆袭的博客 5478

python毕设 基于Web的中药材信息查询系统程序+论文

***(程序+源码+数据库+调试部署+开发环境)论文文档1,文末可获取,系统界面在最后面。****

m0_74825541的博客 1257

记录习惯【Unity 3D中3D场景下嵌套2D Canvas并实现窗口缩放】

实现的功能是在3D场景中嵌套2DUI,Unity可窗口化,按比例缩放。 (本文不牵扯技术性脚本和代码) 首先建立新项目,这里使用Unity2020.3.16f1c1(中文)建立URP项目,使用自带场景进行实施。 可以看到这里有一个主相机,我们建立一个副相机,display层2; 紧接着我们设置一下固定的分辨率,1920*1080 两个场景的分辨率设置完成之后,在副相机底下新建canvas,对cavas进行设置 注意上中Canvas所需设置,然后双击副相机内的canvas.

NS_Speak(IVAV) 6080

MATLAB PDE工具箱电磁场仿真平行电容板及电偶极子详解

首先打开matlab,在命令行输入pdetool打开PDE工具箱 工具箱的功能我就不赘述了,大概就是以有限元的数值计算方法,计算二阶偏微分方程,因此可以解决电磁场、热力学等问题。 首先点击左上角按钮,画三个矩形 画完一个后可以双击矩形编辑,参数如下: 其中R1表示上极板,R2表示下极板,R3表示整个空间区域。 在上方Set formula为R3-R2-R1,表示求解区域是整个空间区域减去两个极板。下拉框选择Electrostatics表示求解的是静电场问题。 接下来点击上方菜单栏中的这个按钮,表

weixin_42845306的博客 1万+

1.1.4 运用防火墙实现入侵防御

摘要:本文详细介绍了某公司网络拓扑中防火墙FW1的配置过程。主要内容包括:1)通过web界面登录防火墙;2)配置三个接口的IP地址及所属安全区域;3)创建两个入侵防御配置文件(anti_untrust和anti_trust);4)配置安全策略untrust2dmz和trust2dmz,分别允许公网/内网访问WWW服务器;5)保存配置。操作步骤配有详细截图说明,涉及接口配置、安全区域划分、入侵防御策略设定等关键环节,最终实现内外网对服务器Server1的安全访问控制。(149字)

Ljs040411的博客 2130

【Unity】关于EventSystem在3D场景中的应用

[Unity]关于EventSystem在3D场景中的应用概述在UI上的应用可变动的地方在3D场景中的应用 Unity官方文档相对于这一部分的解释: 中文文档:https://connect.unity.com/doc/Manual/EventSystem(感觉这个加载速度很随缘) 英文文档:我是参看编辑器自带的,网址的话大家自行百度,搜索词:unity manual。 其实官方文档对于这一部分的...

我不写博客谁写博客之自我提升 640

如何使你的直流电机闭环?(PID讲解)

看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

a2001444的博客 1万+

Unity3d NGUI的使用(八)(NGUI 2DUI与3DObjects共存)

NGUI是一款主打2dui界面或者动画的插件,如果直接在UIRoot里加入3d的物体或者粒子是不会显示出来的 主要原因是2d UI是用正交相机来投射加入NGUI定制相机使得投射范围在一个方形可视范围内 在z轴的视觉表现上被忽略

Unity3d 攻城师一枚 5095

麒麟KylinV10系统yum源更换全攻略:从官方源到第三方仓库的保姆级教程

本文详细介绍了麒麟KylinV10系统yum源的更换与优化方法,包括官方源配置、第三方仓库集成及RPM包管理技巧。通过实战案例和命令示例,帮助用户快速解决软件依赖问题,提升系统管理效率。特别适合需要在国产操作系统上进行开发的工程师参考。

weixin_30752699的博客 647

dolphinscheduler服务注册中心源码解析(一)服务注册与发现整体设计

下一篇文章我们开始讲解dolphinscheduler基于Zookeeper实现注册中心的源码解析。

最爱嫣夜来 374

mesh渲染到ui_Creator3D:太厉害了!3D模型原来可以这样显示在2DUI上

国庆,中秋收假了,菜鸟在这里给大家道声祝福:同时可能不少人都已经知道,就在放假前,Creator3D 1.2.0 正式版 已经发布。菜鸟后边的自学demo也将全部用1.2.0,大家在打开demo时一定要注意版本奥。前言今天菜鸟分享一个小的技术点:3D模型应该怎样显示到2D的ui层上边。最近逛论坛经常看见有关于这个问题的帖子,正好菜鸟后边也要用到,那就提前研究一下。下边将实现的两种方式简单说明一下。...

weixin_39640265的博客 495

第14.10章 高翔博士最新开源框架Lightning-LM源码解读(十):在线定位run_loc_online涉及到的核心模块总结

本文对Lightning-LM激光SLAM定位框架进行了全面剖析。该框架是一个轻量高效的激光雷达建图与定位系统,支持3D SLAM、动态图层管理等功能。文章首先介绍了项目概况和源码结构,包括核心模块如定位系统(loc_system)、激光匹配(lidar_loc)和位姿图优化(pose_graph)等。接着详细解析了各模块的关键函数和运行流程,如数据接收处理、NDT匹配和位姿优化等。最后总结了学习该框架所需的C++知识要点,包括智能指针、多线程编程等现代C++特性。该分析为SLAM开发者提供了实用的架构参考

行知SLAM 799

《Unity 3D NGUI 实战教程》一2.6 2DUI和3DUI的工作原理

本节书摘来异步社区《Unity 3D NGUI 实战教程》一书中的第2章,第2.6节,作者: 高雪峰 责编: 张涛,更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.6 2DUI和3DUI的工作原理 Unity 3D NGUI 实战教程 2.6.1 2DUI的工作原理 先创建一个2DUI(创建方法上文已讲过),然后在2DUI的“根”UIRoot下...

weixin_34290000的博客 352

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Unity3DUI通用弹窗类资源文件介绍:Unity 3D UI 弹窗解决方案

Unity3DUI通用弹窗类资源文件介绍:Unity 3D UI 弹窗解决方案 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在游戏和应用开发中,弹窗是提供用户交互和信息提示的重要方式。Unity3DUI通用弹窗类资源文件正是为了满足开发者对弹窗功能的需求而设计。它提供了一套灵活、可复用的弹窗解决方案,使开发者能够轻松实现各类临时性信息的展示,从而提升开发效率。 项目...

gitblog_06750的博客 724

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: unity 中GraphMaker插件的常用属性设置
下一篇: unity中DatePicker和Calendar
科幻之眼
博客等级 码龄9年 101粉丝 153原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值