unity开发之原创开关小部件

来源:互联网 发布:002174游族网络雪球 编辑:程序博客网 时间:2024/05/19 20:46

            一直在使用ngui做ui,不过发现尽然没有一个开关部件。开关应该算是比较常用的部件了,尽然没有,感觉有点小不科学,于是自己写了一个简单开关小部件。哎,现在还不会写插件,等自己功力长进了,就自己改ngui的代码,在widget里加入swtch开关好了。

             现在的话,就只能用最原始的方法创建一个开关咯。创建一个空的gameobject,并命名为Switch,然后需要加上我自己写的UISwitch组件(下面会有uiswitch的代码)。然后以Switch为父节点,加上两个sprite,分别作为开关打开和关闭时显示的sprite。这两个sprite最好命名为OffSprite和OnSprite,因为我的代码是按照这两个名字来查找的,如果不想拘泥于命名,也可以直接手动拖拽引用到UISwitch组件上。

    如图为层级窗口。

                         

          下面详述了uiswitch代码,实现了一点简单的功能,基本够用。             

using UnityEngine;using System.Collections;public class UISwitch : MonoBehaviour{    //默认状态是开还是关    public bool isOn = false;    //会自动将sprite的位置移动到原点    public bool isAutoAdjustSpritePosition = true;    //会自动调整sprite的缩放比例    public bool isAutoAdjustSpriteScale = true;    //是否自动调整boxcollider:依据图片调整collider的大小    public bool isAutoAdjustCollider = true;    //开关关掉时的Sprite    public GameObject offSprite;    //开关打开时的时间接收者    public GameObject onSprite;    //开关关掉的事件接收者    public GameObject offEventReceiver;    //开关打开的事件接收者    public GameObject onEventReceiver;    //开关关掉的事件的方法名    public string offFunctionName = "OnSwitchOff";    //开关打开的时间的方法名    public string onFunctionName = "OnSwitchOn";    private Vector3 averageScale;    // Use this for initialization    void Start()    {        //如果没有手动引用,会自动寻找        if (offSprite == null) offSprite = transform.FindChild("OffSprite").gameObject;        if (onSprite == null) onSprite = transform.FindChild("OnSprite").gameObject;        if (isAutoAdjustSpritePosition) adjustSpritePosition();        if (isAutoAdjustSpriteScale) adjustSpriteScale();        if (isAutoAdjustCollider) adjustCollider();        updateSprite();    }    //将开关图片的localscale平均一下~    void adjustSpriteScale()    {        averageScale = (offSprite.transform.localScale + onSprite.transform.localScale) / 2f;        offSprite.transform.localScale = onSprite.transform.localScale = averageScale;    }    //调整到正中间    void adjustSpritePosition()    {        offSprite.transform.localPosition = Vector3.zero;        onSprite.transform.localPosition = Vector3.zero;    }    //如果没有boxcollider组件,会自动添加一个    //另外,将center设置为正中间,size设置为图片的平均localscale    void adjustCollider()    {        if(GetComponent<BoxCollider>()==null)        {            this.gameObject.AddComponent<BoxCollider>();        }        GetComponent<BoxCollider>().center = Vector3.zero;        GetComponent<BoxCollider>().size = averageScale;            }    void OnClick()    {        isOn = !isOn;        if (isOn)        {            OnSwitchOn();        }        else        {            OnSwitchOff();        }        updateSprite();    }    //切换一下开关图片    void updateSprite()    {        offSprite.SetActive(!isOn);        onSprite.SetActive(isOn);    }    void OnSwitchOn()    {        if (onEventReceiver != null)        {            onEventReceiver.SendMessage(onFunctionName);        }    }    void OnSwitchOff()    {        if (offEventReceiver != null)        {            offEventReceiver.SendMessage(offFunctionName);        }    }}
  


好啦,设置好了之后,开关就可以使用了。

             

0 0