• 最近接触了unity3D的一个小功能,用按钮实现Panel的切换,搜索了很多博客,发现很多用的animator,自己又没接触过这个东西,所以想用一个脚本直接实现按钮切换的功能,接下来我详细介绍一下。 图一 ...

    最近接触了unity3D的一个小功能,用按钮实现Panel的切换,搜索了很多博客,发现很多用的animator,自己又没接触过这个东西,所以想用一个脚本直接实现按钮切换的功能,接下来我详细介绍一下。

                                                 

                                                  图一    主界面图

    图一是我工程的主界面截图,我一共放置了两个Panel,分别是Panel1和Panel2,以及两个按钮,分别是PUbtn和PDbtn,这两个按钮实现的功能分别是上一页和下一页的功能。

                  

    算了不放图几图几了,又不是写论文,上图是告诉你先找到Assets文件夹,然后再其中新建一个自己的文件夹,这是为了独立自己的模块,比如我新建的文件夹是Zolo,在里面新建Scripts文件夹,到这步我们就可以添加脚本了。

    这是第一个panel,看下面的图。

    这是第二个panel,看下面的图。

    上一页和下一页两个按钮就是实现这两个panel的切换的。

    在刚刚新建的Scripts文件夹里新建一个脚本,名字任意取,这里给出示例。

    新建完C#脚本后,这个时候点击上面的Canvas。

                            

    然后将新建的脚本放到图中的位置,选中你的Canvas,然后将脚本拖拽过去,直到出现设置Size的窗口。

    然后设置Size为你所拥有的panel数目,比如这里我有两个,就设置为2,那么下面就会产生Element1和Element2,这时分别把panel放到对应的element中去。

    再选中button元素,按照下图中顺序操作。

    每个步骤解释如下:

    1:添加上图组件

    2:将Canvas整个拖动过来放到里面

    3:添加新建的脚本

    这样除了代码基本的操作都做完了,接下来是代码部分,主要就是两个重要的函数,一个是向上翻页,一个是向下翻页。

    向上翻页的函数:

     public void UpPage()
        {
            if (x>0)
            {
                currentPage.SetActive(false);
                currentPage = page[x - 1];
                x -= 1;
                currentPage.SetActive(true);
            }
        }

    向下翻页的函数:

        public void DownPage()
        {
            if (x < page.Length-1)
            {
                currentPage.SetActive(false);
                currentPage = page[x + 1];
                x += 1;
                currentPage.SetActive(true);
            }
    
        }

    将上面的代码分别和上一页、下一页按钮绑定就能实现上下页跳转的功能了。代码很简单,这里我就不解释了。

    这种方法对于Panel比较多的情况还是比较方便的,唯一麻烦的地方就在于需要手动拖动panel到element中去,这还是可以接受的,当然用脚本控制也可以实现,后续我会摸索用循环的方式将面板自动添加到element中去。

     

    注意一下,如果遇到按钮点击没反应的情况,不妨检查工程是否存在EventSystem,这是一个花了我两个小时解决的问题,最后请教大佬才解决。

    【以上是我这次的分享,欢迎指正】

    展开全文
  • unity3d Panel之间的转换

    2015-07-16 19:13:33
    效果展示: 如上图,点击入口弹出绿色Panel,点击出口关闭Panel。 代码事例: using UnityEngine; using UnityEngine.UI;...using System.Collections;...public class SelectLevelMgr : MonoBehav

    效果展示:


    如上图,点击入口弹出绿色Panel,点击出口关闭Panel。


    代码事例:

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


    public class SelectLevelMgr : MonoBehaviour {


        Transform panel;
    // Use this for initialization
    void Start () {


                //Obtain EntryBtn Button component
                var EntryBtn = gameObject.GetComponent<Button>();
                //Obtain canvas:Cav_Level
                var canvas = GameObject.Find("Cav_Level");
                //Obtain Panel:Pal_Green
                panel = canvas.transform.FindChild("Pal_Green");
                //get by the transform obtain :tansCloseBtn
                Transform transCloseBtn = canvas.transform.FindChild("Pal_Green/Btn_Close");
                //Obtain 'cpb' Button component
                var cpb = transCloseBtn.GetComponent<Button>();
            
                /**
                * 点击事件监听方法
                * */


                if (EntryBtn != null)
                {
                    EntryBtn.ButtonClickEvent = DoEntry;
                }


                if (cpb != null)
                {
                    cpb.ButtonClickEvent = ClosePanel;
                }


            }



    // Update is called once per frame
    void Update () {

    }




        /**
         * 点击事件触发方法
         * */
        public void DoEntry(BaseEventData eventData)
        {
                if (panel != null)
                {
                    panel.gameObject.SetActive(true);           
                }
        }


        public void ClosePanel(BaseEventData eventData)
        {
            if (panel != null)
            {
                panel.gameObject.SetActive(false);
            }
        }
     
    }


    展开全文
  • UIPanel is a component that collects and manages all widgets underneath it. UIPanel is responsible for creating the actual draw calls using the widget's geometry. Without panels, nothing can b

    原文:http://www.tasharen.com/forum/index.php?topic=6705.0

    NGUI讨论群:333417608

    概述


    UIPanel用来收集和管理它下面所有widget的组件。通过widget的geometry创建实际的draw call。没有panel所有东西都不能够被渲染出来。如果你对Unity熟悉,你可以把UIPanel当做Renderer。



    所有panel都有一个Depth值,会影响所有它包含的widget。如果你的UI有很多窗口,那么最好每个窗口有一个panel。Panel上的depth权重会远远高于每一个widget的depth权重,所以保证panel不要使用同样的depth。如果使用同样的depth在panel上,那么draw call会被自动拆分来保证渲染顺序,所以会增加更多的draw call。
    • Alpha属性影响所有在panel下面的widget。所以可以用它来淡出整个窗口。
    • 如果你的UI需要被灯光影响,需要勾选上Normals
    • 如果创建了一个有很多geometry的scrollable panel,你需要勾选Cull选项来减少三角形的数目。这样也可能降低性能,因为widget的可视性需要每次update都检验一次。
    • 勾选Static选项来告诉NGUI这个panel下面的widget不会被移动,这样可以提高性能。NGUI会忽略所有的position/rotation/scale改变。所以在运行时移动widget不会有效——所以小心使用。
    • 如果要调试由panel创建的draw calls,Show All选项可能帮助到你。你会看到由panel创建的所有draw call,以渲染顺序排序。每个draw call会包括它使用到material的详细信息,那个widget用的这个material,甚至可以让你关闭某些draw call来让你查询某些问题。
    Panel会根据dimensions自动Clip所有它的子节点。使用这个功能需要选择Clipping下拉列表中的任意选项,之后调整Scene View中紫色矩形的尺寸,就像调整widget的尺寸一样。通过这样做你可以把一个panel放到Scroll View中,让他轻松的拖拽。

    注意clipping的panel不能嵌套。每个panel只能clip自己管理的widget,如果一个panel在另外一个panel里面,只有一个会影响到里面的widget。这个限制以后会去掉。

    默认NGUI中panel的Render Queues从3000开始往上增加。你可以通过Render Q来修改。如果你想在两个panel中间增加粒子,只要修改两个panel的render queue一个高于粒子,一个低于粒子即可。如果想要让所有的draw call使用和NGUI 2.x版本的渲染方式一样,使用z轴而不是depth。那么给panel的Render Q指定为Explicit。(NGUI 2.x用的是3000)。

    如果你找和Anchors相关的文档,可以看基类——UIRect。

    小贴士

    一个动力学Rigidbody会自动增加到你的panel上,因为对于Unity来说这样会提升性能。移动静态的collider会有很多消耗性能的操作,但是移动rigidbody就不会。

    类文档

    http://tasharen.com/ngui/docs/class_u_i_panel.html

    展开全文
  • ![![图片说明](https://img-ask.csdn.net/upload/201502/07/1423289082_755912.png)图片说明]... 这是窗口核心代码 是互相承托的 麻烦哪位大神帮我翻译一下 我不懂!!!!讲解一下 最好!!麻烦你们了
  • 在项目中经常需要制作的是页签按钮和界面...1.打开虐我千百遍的unity,新建项目,在2D模式下制作以下界面:(我在按钮上和panel上分别写了123表示3个不同的按钮和tabbtn)2.撸代码,我的思路是用list存贮tabbtn和pa...

    在项目中经常需要制作的是页签按钮和界面,对于我这个小白而言,美好的想法是,先依托于ugui写出来页面的逻辑,再移植到项目框架中...

    遂卒...

    但是在过程中保留了ugui制作基本页签界面的思路,和大家分享。

    1.打开虐我千百遍的unity,新建项目,在2D模式下制作以下界面:


    (我在按钮上和panel上分别写了123表示3个不同的按钮和tabbtn)


    2.撸代码,我的思路是用list存贮tabbtn和panel,为tabbtn添加监听事件,使之一一对应。

    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class TabControl : MonoBehaviour {
       
        [SerializeField]
        private List<Button> tabBtns;
        [SerializeField]
        private Button tab1;
        [SerializeField]
        private Button tab2;
        [SerializeField]
        private Button tab3;
        [SerializeField]
        private List<GameObject> viewObjects;
    
        private void Awake()
        {
            tabBtns = new List<Button>();
            viewObjects = new List<GameObject>();
            tab1 = GameObject.Find("Canvas/LeftBtns/TabBtn1").GetComponent<Button>();
            tab2 = GameObject.Find("Canvas/LeftBtns/TabBtn2").GetComponent<Button>();
            tab3 = GameObject.Find("Canvas/LeftBtns/TabBtn3").GetComponent<Button>();
            AddTabBtns(tab1);
            AddTabBtns(tab2);
            AddTabBtns(tab3);
    
            GameObject ob1 = GameObject.Find("Canvas/LeftBtns/TabBtn1/Panel1");
            GameObject ob2 = GameObject.Find("Canvas/LeftBtns/TabBtn2/Panel2");
            GameObject ob3 = GameObject.Find("Canvas/LeftBtns/TabBtn3/Panel3");
            AddViewObjects(ob1);
            AddViewObjects(ob2);
            AddViewObjects(ob3);
            Debug.Log(ob1.name + (viewObjects.Count()).ToString());
            ob1.SetActive(false);
            ob2.SetActive(false);
            ob3.SetActive(false);
        }
        private void Start()
        {
            
            
            foreach (Button tab in tabBtns)
            {
                AddTabBtnListener(tab); 
            }
            if (tabBtns.Count > 0)
            {
                // SelectTabBtn(tabBtns[0]);
                viewObjects[0].SetActive(true);
            }
            else
            {
                Debug.LogError("No exist tabBtns");
            }
        }
        public void AddTabBtns(Button tabBtn)
        {
            tabBtns.Add(tabBtn);
        }
    
        public void AddViewObjects(GameObject viewObject)
        {
            viewObjects.Add(viewObject);
        }
    
        private void AddTabBtnListener(Button tabBtn)
        {
            tabBtn.onClick.AddListener(() => SelectTabBtn(tabBtn));
        }
    
        private void SelectTabBtn(Button tabBtn)
        {
            
            for (int i = 0; i < tabBtns.Count(); i++)
            {
                bool isSelect = (tabBtns[i] == tabBtn);
                tabBtns[i].interactable = !isSelect;
                if(isSelect)
                {
                    viewObjects[i].SetActive(true);
                }
                for (int j = 0; j < viewObjects.Count(); j++)
                {
                    if ((j!= i)&&isSelect)
                    {
                        viewObjects[j].SetActive(false);
                    }
                }
            }
        }
    }

    3.调试,制作完成。

    除此之外,还可以用ngui里面的Toggle和ugui里面的Toggle控件直接实现,网上有很多教程不再赘述。

    PS:感谢大佬的分享,为渣渣奔提供思路~

    展开全文
  • 效果可以看下面的图,实现...设置panel的瞄点为左上角,设置point值 X:0,Y:1,按钮的图右下角放置,瞄点为panel的右下角,按钮挂载当前脚本,赋值panel对象即可 设置.png using UnityEngine; using UnityE...

    效果可以看下面的图,实现窗口的拖拽放大缩小


    img_eee62c48dc5a710d5f9f0071067f5fde.gif
    测试.gif

    设置panel的瞄点为左上角,设置point值 X:0,Y:1,按钮的图右下角放置,瞄点为panel的右下角,按钮挂载当前脚本,赋值panel对象即可


    img_ad8ee691c16fa83b93625c2994d6779d.png
    设置.png
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    /// <summary>
    /// unity实现窗口的放大缩小
    /// </summary>
    public class ResizePanel : MonoBehaviour, IPointerDownHandler, IDragHandler
    {
    
        // 控制的面板
        public RectTransform panelRectTransform;
        // 最小缩放
        public Vector2 minSize = new Vector2(120, 120);
        // 最大缩放
        public Vector2 maxSize = new Vector2(800, 600);
        private Vector2 originalLocalPointerPosition;
        private Vector2 originalSizeDelta;
    
    
        public void OnPointerDown(PointerEventData data)
        {
            originalSizeDelta = panelRectTransform.sizeDelta;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, data.position, data.pressEventCamera, out originalLocalPointerPosition);
        }
    
        public void OnDrag(PointerEventData data)
        {
            if (panelRectTransform == null)
                return;
    
            Vector2 localPointerPosition;
            RectTransformUtility.ScreenPointToLocalPointInRectangle(panelRectTransform, data.position, data.pressEventCamera, out localPointerPosition);
            Vector3 offsetToOriginal = localPointerPosition - originalLocalPointerPosition;
    
            Vector2 sizeDelta = originalSizeDelta + new Vector2(offsetToOriginal.x, -offsetToOriginal.y);
            sizeDelta = new Vector2(
                Mathf.Clamp(sizeDelta.x, minSize.x, maxSize.x),
                Mathf.Clamp(sizeDelta.y, minSize.y, maxSize.y)
            );
    
            panelRectTransform.sizeDelta = sizeDelta;
        }
    }
    
    展开全文
  • (想要实现的功能是:在一个主Canvas下有多个面板,通过点击某一个面板下的按钮切换到另外一个面板,... 首先,写一个PanelInstance.cs,为每个要管理的panel添加这个脚本,PanelInstance.cs的代码示例如下:(Pa...
  • Unity3D常见面试题

    2017-08-11 20:20:00
    Unity3D常见面试题
  • 大家晚上好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/...所以,今天的博客的主题就是《Unity3D游戏开发之跑酷游戏项目讲解》。从博主自身来考虑这件事情,当你选择做自己热爱的事情的时
  • unity版本:4.5 NGUI版本:3.6.5  参考链接:http://tieba.baidu.com/p/3206366700,作者:百度贴吧 水岸上  动态载入NGUI控件,这里用Panel为例说明。 1、如何创建NGUI控件的预设:  在要保存prefab文件的...
  • unity3d 各大插件评测

    2018-01-30 15:00:43
    原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 引言:想用Unity3D制作优秀的游戏,插件是必不可少的。工欲善其事必先利其器。本文主旨是告诉使用Unity3D引擎的同学们如何根据需求选择适当的工具...
  • Unity3d实战之Unity3d网络游戏实战篇(2):代码资源分离的界面系统 阅读文章前请细读以下几点: 学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版。 本文是作者在学习过程中遇到的认为值得记录的点,...
  • unity3d里显示圆形的背景。有两种方式,一种是在GUI上显示,通常是用在UI上。另外一种是通过3D的Plane显示,这种时候用在游戏场景里,例如做游戏的小地图。然后,ngui的方式也比较简单。
  • 程序中的每个界面都有很多共性,比如每个界面都会有进入动画和退出动画(即使是硬切换没有任何动画,也至少有进入动作和退出动作,需要SetActive)。为了方便管理每个界面,把更多的精力放在将动画处理得更加平滑和...
  • Unity Canvas vs Panel

    2019-08-11 06:05:47
    Unity guys specifically gave a performance talk about UI Canvases on some of the past Unite(s). You won't have trouble finding it on Unity's YouTube channel (edit: here it is -Unite Europe 2017...
  • Unity3d实战之Unity3d网络游戏实战篇(13):登录&amp;注册面板 学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版社 本文是作者在学习过程中遇到的认为值得记录的点,因此引用的代码等资源基本出资...
  • WinForm内嵌Unity3D

    2015-11-17 18:08:18
    Unity3D可以C#脚本进行开,使用vstu2013.msi插件,可以实现在VS2013中的调试。在开发完成后,由于项目需要,需要将Unity3D嵌入到WinForm中。WinForm中的UnityWebPlayer Control可以载入Unity3D。先看效果图。 一、...
  • 首先是DragUI 1.打开Unity新建场景,在Hierarchy面板上新建panel。 2.调整锚点如图并更改大小。
  • unity3d强制转换

    2017-08-08 09:00:27
    private string a="";  private float b;  private void Start()  {  a = b.ToString();//转字符串  b = int.Parse(a);//转int  b = float.Parse(a);//转float  } ...注:转st
  • winform内嵌.exe的方式都大同小异,只不过这里记录一下Unity3D的设置,如果需要程序之间通讯,可以用socket,winform程序开服务器,unity程序客户端连接,这里不再搬砖了。 一、首先是unity build设置 canvas...
1 2 3 4 5 ... 20
收藏数 2,781
精华内容 1,112
热门标签