Unity3D NGUI动态创建按钮

原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【119706192 本文链接地址: Unity3D NGUI动态创建按钮


本例仅以熟悉NGUI组件功能为目的,想快捷简便的创建按钮或其它游戏物体请参考 “Unity3D 动态实例化Prefab


以动态创建服务器列表为例。

public UIAtlas mAtlas;
    public UIFont mFont;
    public string mSriteName;
    public GameObject Playerlist;
    /// <summary>
    /// 动态加载一个NGUI按钮
    /// </summary>
    /// <param name="name"></param>
    private void CreateServerButton(string key,string name, int index)
    {
        //获得深度(要创建button的Panle的深度)
        int depth = NGUITools.CalculateNextDepth(PanleMe);
        //创建button物体,命名、设tag、摆所在panle的相对位置。
        GameObject go = NGUITools.AddChild(PanleMe);
        go.name = name;
        go.tag = "trendsButton";
        go.transform.localPosition = new Vector3(-180 + (index % 3) * 180, 140, 0);

        //添加button的背景图片UISprite
        UISprite bg = NGUITools.AddWidget<UISprite>(go);
        bg.type = UISprite.Type.Sliced;
        bg.name = "Background";
        bg.depth = depth;
        //背景图片使用的图集
        bg.atlas = mAtlas;
        //图集中使用的精灵名字
        bg.spriteName = mSriteName;
        bg.transform.localScale = new Vector3(150f, 40f, 1f);
        //跳转位置(必要)
        bg.MakePixelPerfect();

        //如果有字体,添加UILabel
        if (mFont != null)
        {
            UILabel lbl = NGUITools.AddWidget<UILabel>(go);
            lbl.font = mFont;
            lbl.text = name;
            lbl.transform.localScale = new Vector3(22f, 22f, 1f);
            lbl.transform.localPosition = new Vector3(0, 0, -1f);
            lbl.color = Color.black;
            lbl.MakePixelPerfect();
        }
        
        //添加碰撞(有碰撞才能接收鼠标/触摸),大小与Button背景一致
        BoxCollider box = NGUITools.AddWidgetCollider(go);
        box.center = new Vector3(0,0,-1);
        box.size = new Vector3(bg.transform.localScale.x, bg.transform.localScale.y, 0);

        //添加UIButton触发事件的必要组件,并关联之前生成的UISprite
        go.AddComponent<UIButton>().tweenTarget = bg.gameObject;
        //添加动态效果组件(大小、位移、音效)。(可选)
        go.AddComponent<UIButtonScale>();
        go.AddComponent<UIButtonOffset>();
        go.AddComponent<UIButtonSound>();

        /*------ 一下是自己要用到的UIButton功能,可以绑自己需要的组件 ------*/
        //添加一个开启Player list Panel 的按钮事件
        UIButtonTween serverListPanel = go.AddComponent<UIButtonTween>();
        serverListPanel.tweenTarget = PanleNext;
        serverListPanel.playDirection = AnimationOrTween.Direction.Forward;
        serverListPanel.ifDisabledOnPlay = AnimationOrTween.EnableCondition.EnableThenPlay;

        //隐藏自己panel
        UIButtonTween hidemePanel = go.AddComponent<UIButtonTween>();
        hidemePanel.tweenTarget = PanleMe;
        hidemePanel.playDirection = AnimationOrTween.Direction.Reverse;
        hidemePanel.disableWhenFinished = AnimationOrTween.DisableCondition.DisableAfterReverse;

        //添加点击事件,参数是服务器ID(点击获取本服务器ID的下所有角色)
        UIButtonMessage ubm = go.AddComponent<UIButtonMessage>();
        ubm.target = Playerlist;
        //给UIButtonMessage子增加传递‘参数’功能。
        ubm.functionName = "Playerlist";
        ubm.parameterStr = key;
    }

    /// <summary>
    /// 清空动态生成的按钮
    /// </summary>
    void cleantrendsButton()
    {
        GameObject[] tbs = GameObject.FindGameObjectsWithTag("trendsButton");
        for (int i = 0; i < tbs.Length; i++)
        {
            Destroy(tbs[i].gameObject);
        }
    }

Unity3D NGUI动态创建按钮_第1张图片

你可能感兴趣的:(Unity3D NGUI动态创建按钮)