【Unity3D自学记录】Unity3D开发之原创开关小部件

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

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

    如图为层级窗口。

                         

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

[csharp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class UISwitch : MonoBehaviour  
  5. {  
  6.     //默认状态是开还是关  
  7.     public bool isOn = false;  
  8.   
  9.     //会自动将sprite的位置移动到原点  
  10.     public bool isAutoAdjustSpritePosition = true;  
  11.   
  12.     //会自动调整sprite的缩放比例  
  13.     public bool isAutoAdjustSpriteScale = true;  
  14.   
  15.   
  16.     //是否自动调整boxcollider:依据图片调整collider的大小  
  17.     public bool isAutoAdjustCollider = true;  
  18.   
  19.   
  20.     //开关关掉时的Sprite  
  21.     public GameObject offSprite;  
  22.   
  23.     //开关打开时的时间接收者  
  24.     public GameObject onSprite;  
  25.   
  26.     //开关关掉的事件接收者  
  27.     public GameObject offEventReceiver;  
  28.   
  29.     //开关打开的事件接收者  
  30.     public GameObject onEventReceiver;  
  31.   
  32.     //开关关掉的事件的方法名  
  33.     public string offFunctionName = "OnSwitchOff";  
  34.   
  35.     //开关打开的时间的方法名  
  36.     public string onFunctionName = "OnSwitchOn";  
  37.   
  38.   
  39.     private Vector3 averageScale;  
  40.   
  41.     // Use this for initialization  
  42.     void Start()  
  43.     {  
  44.   
  45.         //如果没有手动引用,会自动寻找  
  46.         if (offSprite == null) offSprite = transform.FindChild("OffSprite").gameObject;  
  47.         if (onSprite == null) onSprite = transform.FindChild("OnSprite").gameObject;  
  48.   
  49.         if (isAutoAdjustSpritePosition) adjustSpritePosition();  
  50.         if (isAutoAdjustSpriteScale) adjustSpriteScale();  
  51.         if (isAutoAdjustCollider) adjustCollider();  
  52.   
  53.         updateSprite();  
  54.     }  
  55.   
  56.     //将开关图片的localscale平均一下~  
  57.     void adjustSpriteScale()  
  58.     {  
  59.         averageScale = (offSprite.transform.localScale + onSprite.transform.localScale) / 2f;  
  60.         offSprite.transform.localScale = onSprite.transform.localScale = averageScale;  
  61.     }  
  62.   
  63.     //调整到正中间  
  64.     void adjustSpritePosition()  
  65.     {  
  66.         offSprite.transform.localPosition = Vector3.zero;  
  67.         onSprite.transform.localPosition = Vector3.zero;  
  68.     }  
  69.   
  70.   
  71.     //如果没有boxcollider组件,会自动添加一个  
  72.     //另外,将center设置为正中间,size设置为图片的平均localscale  
  73.     void adjustCollider()  
  74.     {  
  75.         if(GetComponent<BoxCollider>()==null)  
  76.         {  
  77.             this.gameObject.AddComponent<BoxCollider>();  
  78.         }  
  79.   
  80.         GetComponent<BoxCollider>().center = Vector3.zero;  
  81.         GetComponent<BoxCollider>().size = averageScale;  
  82.           
  83.     }  
  84.   
  85.     void OnClick()  
  86.     {  
  87.         isOn = !isOn;  
  88.   
  89.         if (isOn)  
  90.         {  
  91.             OnSwitchOn();  
  92.         }  
  93.         else  
  94.         {  
  95.             OnSwitchOff();  
  96.         }  
  97.   
  98.         updateSprite();  
  99.     }  
  100.   
  101.     //切换一下开关图片  
  102.     void updateSprite()  
  103.     {  
  104.         offSprite.SetActive(!isOn);  
  105.         onSprite.SetActive(isOn);  
  106.     }  
  107.   
  108.     void OnSwitchOn()  
  109.     {  
  110.         if (onEventReceiver != null)  
  111.         {  
  112.             onEventReceiver.SendMessage(onFunctionName);  
  113.         }  
  114.     }  
  115.   
  116.     void OnSwitchOff()  
  117.     {  
  118.         if (offEventReceiver != null)  
  119.         {  
  120.             offEventReceiver.SendMessage(offFunctionName);  
  121.         }  
  122.     }  
  123. }  
  


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

             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值