尝试自己写一个工具类实现UGUI的按钮功能

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.Events;
public class UIMain : MonoBehaviour
{
    public Button button;
    void Start()
    {
        EventTriggerListener.Get(button.gameObject).onClick = OnButtonClick;
    }
    private void OnButtonClick(GameObject go)
    {        //在这里监听按钮的点击事件		
        if (go == button.gameObject) { Debug.Log("DoSomeThings"); }
    }
}
上面这个脚本挂在一个空物体上,在图形界面给button这个变量赋值就可以使用了。
using UnityEngine;using System.Collections;using UnityEngine.EventSystems;public class EventTriggerListener : UnityEngine.EventSystems.EventTrigger{ public delegate void VoidDelegate(GameObject go); public VoidDelegate onClick; public VoidDelegate onDown; public VoidDelegate onEnter; public VoidDelegate onExit; public VoidDelegate onUp; public VoidDelegate onSelect; public VoidDelegate onUpdateSelect;

    static public EventTriggerListener Get(GameObject go)
    {
        EventTriggerListener listener = go.GetComponent<EventTriggerListener>();
        if (listener == null) listener = go.AddComponent<EventTriggerListener>();
        return listener;
    }
    public override void OnPointerClick(PointerEventData eventData)
    {
        if (onClick != null) onClick(this.gameObject);
    }
    public override void OnPointerDown(PointerEventData eventData)
    {
        if (onDown != null) onDown(gameObject);
    }
    public override void OnPointerEnter(PointerEventData eventData)
    {
        if (onEnter != null) onEnter(gameObject);
    }
    public override void OnPointerExit(PointerEventData eventData)
    {
        if (onExit != null) onExit(gameObject);
    }
    public override void OnPointerUp(PointerEventData eventData)
    {
        if (onUp != null) onUp(gameObject);
    }
    public override void OnSelect(BaseEventData eventData)
    {
        if (onSelect != null) onSelect(gameObject);
    }
    public override void OnUpdateSelected(BaseEventData eventData)
    {
        if (onUpdateSelect != null) onUpdateSelect(gameObject);
    }
}
 
上面这个类继承UnityEngine.EventSystems.EventTrigger类后重写该类里的一些方法,这个父类实现了Button里所有的接口(应该是吧,反正我看一般需要的都实现了)。下面那些对方法的覆写,就相当于在绑定委托。
Get方法的功能是获取一个游戏对象上的此功能组件,如果没有就加一个这个组件,同时将该组件返回。
 
这样就可以用一个简单的工具类自己实现按钮的功能了。
 
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我正在帮您寻找相关资源并准备回答您的问题。 以下是一个抗锯齿的 Unity UGUI Shader 实现的示例代码: ``` Shader "Custom/UGUI-AntiAliasing" { Properties { _MainTex ("Texture", 2D) = "white" {} _Color ("Color", Color) = (1,1,1,1) _Multiplier ("Multiplier", Range(0, 1)) = 0.5 _Outline ("Outline", Range(0, 1)) = 0.2 } SubShader { Tags {"Queue"="Transparent" "RenderType"="Transparent"} LOD 100 Pass { ZWrite Off Cull Off Fog { Mode Off } Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; fixed4 color : COLOR; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float4 color : COLOR; }; sampler2D _MainTex; float _Multiplier; float _Outline; fixed4 _Color; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; o.color = v.color * _Color; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * i.color; float dist = length(ddx(i.vertex.xy) + ddy(i.vertex.xy)); float alpha = smoothstep(_Outline-_Multiplier, _Outline, dist); col.a *= alpha; return col; } ENDCG } } FallBack "UI/Default" } ``` 您可以将上述代码保存到一个`.shader` 文件中,再将其添加到您的 Unity 项目中,即可使用此Shader。 请注意:Shader中的`_Multiplier`和`_Outline`参数是用来控制描边和抗锯齿程度的。您可以根据自己的需求进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值