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

此方法是改变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是一款强大的跨平台开发引擎,可以用于制作各种类型的游戏和交互应用程序。其2D UI和3D场景功能是Unity的两个核心特性。 2D UI即2D用户界面,可以在游戏或应用程序创建各种交互元素,如按钮、文本框、滑块等。通过Unity的UI系统,我们可以轻松地设计和布局用户界面,使其适应不同屏幕大小和分辨率。可以根据需求添加各种转换效果和动画,使界面更加生动和吸引人。 3D场景Unity的另一个重要功能,可以创建逼真的三维环境。开发者可以利用Unity的编辑器工具导入和编辑各种3D模型,如建筑物、道具、角色等。还可以添加光源、投影和特效来增强场景的真实感。在3D场景,我们可以自由移动摄像机,探索虚拟世界的各个角落,并与其的对象进行交互。 Unity2D UI和3D场景功能可以结合使用,使得游戏或应用程序更加丰富和有趣。例如,在一个3D游戏,可以使用2D UI来设计游戏菜单、积分板和任务提示等界面元素。通过2D UI可以方便地与玩家进行交互和显示游戏信息。而3D场景则提供了一个沉浸式的游戏世界,让玩家感受到身临其境的体验。 总之,Unity2D UI和3D场景功能为开发者提供了丰富多样的设计元素和交互方式。无论是开发2D游戏、3D游戏还是其他类型的应用程序,这些功能都能够给用户带来极佳的使用体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值