unity开发之原创开关小部件

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

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

    如图为层级窗口。

              unity开发之原创开关小部件_第1张图片           

          下面详述了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()==null)
        {
            this.gameObject.AddComponent();
        }

        GetComponent().center = Vector3.zero;
        GetComponent().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);
        }
    }
}
  


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

        unity开发之原创开关小部件_第2张图片     unity开发之原创开关小部件_第3张图片

你可能感兴趣的:(unity)