神临的uLua学习(三)

这几天过圣诞,各种送礼,各种收礼,感觉 过节==消费,哎…….

下面继续关于uLua的使用学习笔记,这次要写的是一个复杂度高的脚本了,是关于如何在uLua中使用委托的方式.
14.LuaDelegate_1(这是uLua委托的主要程序)

const string script = @"
        local func1 = function() print('测试委托1'); end
        local func2 = function(gameObj) print('测试委托2:>'..gameObj.name); end

        function testDelegate(go) 
            local ev = go:AddComponent(TestDelegateListener.GetClassType());

            ---直接赋值模式---
            ev.onClick = func1;

            ---C#的加减模式---
            local delegate = DelegateFactory.TestLuaDelegate_VoidDelegate(func2);
            ev.onEvClick = ev.onEvClick + delegate;
            --ev.onEvClick = ev.onEvClick - delegate;
        end
    ";

    void Start () {
        LuaScriptMgr mgr = new LuaScriptMgr();
        mgr.Start();
        mgr.DoString(script);

        LuaFunction f = mgr.GetLuaFunction("testDelegate");
        f.Call(gameObject);     //将自己对象传给lua
    }

这里是相关的两个类

public class TestDelegateListener : MonoBehaviour
{
    public Action onClick = null;
    public TestLuaDelegate.VoidDelegate onEvClick = null;

    // Update is called once per frame
    void OnGUI() {
        if (GUI.Button(new Rect(10, 10, 200, 20), "测试委托1")) {
            if (onClick != null) onClick();
        }
        if (GUI.Button(new Rect(10, 50, 200, 20), "测试委托2")) {
            if (onEvClick != null) onEvClick(gameObject);
        }
    }
}
public class TestLuaDelegate : MonoBehaviour {
    public delegate void VoidDelegate(GameObject go);
    public VoidDelegate onClick;
}

委托这里有些复杂,但很重要,需要自己理解+实践.

15.LuaDelegate_2(这里是委托的第二种方式)

 private string script =
    @"                  
            function DoClick1(go)
                print('click1 on ', go.name)
            end

            function DoClick2(go)
                print('click2 on ', go.name)
            end

            local click2 = nil

            function AddDelegate(listener)                     
                listener.OnClick = DoClick1
                click2 = DelegateFactory.Action_GameObject(DoClick2)                
                listener.OnClick = listener.OnClick + click2                                    
            end

            function RemoveDelegate(listener)                
                listener.OnClick = listener.OnClick - click2       
                return delegate         
            end
    ";

    //需要删除的转LuaFunction为委托,不需要删除的直接加或者等于即可
    void Start()
    {
        LuaScriptMgr mgr = new LuaScriptMgr();
        mgr.Start();
        mgr.DoString(script);
        TestEventListener listener = gameObject.AddComponent<TestEventListener>();         

        LuaFunction func = mgr.GetLuaFunction("AddDelegate");
        func.Call(listener);                
        listener.OnClick(gameObject);
        func.Release();

        Debug.Log("---------------------------------------------------------------------");        
        func = mgr.GetLuaFunction("RemoveDelegate");
        func.Call(listener);
        listener.OnClick(gameObject);
        func.Release();        
    }

以及他的辅助类

public class TestEventListener : MonoBehaviour
{
    public Action<GameObject> OnClick = null;
}

相对来说第二种方式代码量要少一些.

虽然说是圣诞节,但是心情确实比较差.不过回头想一下也没有必要,各行各业都有它自己的难出吧,理解真的很重要.

就像写到这里了,谢谢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值