一直在使用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);
- }
- }
- }
好啦,设置好了之后,开关就可以使用了。