Lua监听AniamtionEvent

using System;
using UnityEngine;
//using LuaInterface;
//using UnityEngine.Events;
using System.Collections.Generic;

namespace LuaFramework
{
    [RequireComponent(typeof(Animator))]
    public class AnimEventListener : MonoBehaviour
    {

        private Animator animator;

        private Dictionary<string, AnimEvent> eventsMap;

        public delegate void ObjectDelegate(object arg0);

        public class AnimEvent
        {
            public object arg0;
            private event ObjectDelegate m_animEvent;
            public AnimEvent(object arg0, ObjectDelegate callback)
            {
                this.arg0 = arg0;
                m_animEvent += callback;
            }

            public void Invoke()
            {
                Invoke(arg0);
            }

            public void Invoke(object arg)
            {
                if (m_animEvent != null)
                {
                    m_animEvent(arg);
                }
            }

            public void AddListener(ObjectDelegate callback)
            {
                m_animEvent += callback;
            }

            public void RemoveListener(ObjectDelegate callback)
            {
                m_animEvent -= callback;
            }

            public void RemoveAllListeners()
            {
                m_animEvent = null;
            }

        }

        public static AnimEventListener Get(GameObject go)
        {
            if (go == null)
                return null;

            AnimEventListener listener = go.GetComponent<AnimEventListener>();

            if (listener == null)
                listener = go.AddComponent<AnimEventListener>();
            return listener;
        }

        public bool AddEvent(string animName, float time, ObjectDelegate callback)
        {

            AnimationClip[] clips = animator.runtimeAnimatorController.animationClips;
            AnimationClip target = null;

            for (int i = 0; i < clips.Length; i++)
            {
                if (animName == clips[i].name)
                {
                    target = clips[i];
                    break;
                }
            }
            if (target == null)
                return false;

            AnimEvent eventParam = null;
            string animEventName = string.Format("{0}_{1}", animName, time.ToString());
            if (!eventsMap.TryGetValue(animEventName, out eventParam))
            {
                AnimationEvent animEvent = new AnimationEvent();
                animEvent.time = time;
                animEvent.functionName = "OnAnimEvent";
                animEvent.stringParameter = animEventName;
                eventParam = new AnimEvent(animEvent, callback);

                eventsMap[animEventName] = eventParam;

                target.AddEvent(animEvent);
            }
            else
            {
                eventParam.AddListener(callback);
            }
            return true;
        }

        public void RemoveEvent()
        {

        }

        void Awake()
        {
            animator = GetComponent<Animator>();
            eventsMap = new Dictionary<string, AnimEvent>();
        }

        public void OnAnimEvent(AnimationEvent animEvent)
        {
            if (animEvent == null) return;
            AnimEvent eventParam = null;

            if (eventsMap.TryGetValue(animEvent.stringParameter, out eventParam))
            {
                eventParam.Invoke();
            }

        }

    }
}

  

时间: 2024-11-09 00:16:29

Lua监听AniamtionEvent的相关文章

基于Lua插件化的Pcap流量监听代理

1.前言 我们在实际工作中,遇到了一个这样的用例,在每天例行扫描活动中,发现有些应用系统不定期的被扫挂,因为我们不是服务的制造者,没有办法在不同的系统里打印日志,所以我们就想用一个工具来获取特定服务的输入数据流.我们如果不在IDS上看应用的服务,可以直接针对服务所在服务位置,针对应用端口进行,有针对性的监听分析. Tshark和tcpdump.windump这些监听工具提供了比较丰富的命令行参数来监听流量数据.wireshark.burpsuite这些工具也提供相应的lua.python脚本的机

toLua消息监听和发送(区别于LuaframeWork框架自带的Events.lua)

基于uLua/toLua的Luaframework的lua框架的事件系统 github地址:https://github.com/jarjin/LuaFramework_NGUI 用法与Luaframework框架自带的Events.lua的用法一致,解决了回调时报错不抛错误的问题. local _Events = {} local EventDispatcher = {} function EventDispatcher:ctor( ) _Events = {} end --[[ 表结构 {

quick-cocos2d-x android返回键监听并实现原生退出对话框

这两天终于闲了一下,就顺手又把quick捡起来又学了学,一直都觉得quick比cocos2dx那套lua绑定要方便许多,今天试了下android返回键的监听,还是挺好弄的,所以就有了这篇. 首先说明一下使用的quick版本--2.2.5. 直接上代码 function MainScene:addBackEvent() if device.platform == "android" then self.touchLayer = display.newLayer() self.touchL

关于 Android ios cocos2d 中的广播监听

1. 关于广播监听 第一次使用是在Android中,broadcast.主要用在2个activity之间进行传递数据,发出一个广播,对这个广播有兴趣的就去监听它,做出相应的回应即可.主要是传递数据,触发机制比较好,跟全局变量或者单例有点像,但是使用场合有区别,比如2个activity之间传递数据,activity这种有生命周期的弄成全局变量和单例就不合适了. 2.Android的广播 发送广播: Intent intent = new Intent("OUR_BLE_CENTRAL_MANAGE

toLua消息监听和发送(LuaframeWork)

基于uLua/toLua的Luaframework的lua框架的事件系统 github地址:https://github.com/jarjin/LuaFramework_NGUI Luaframework为了我写好了消息的监听和发送,也就是观察者模式的使用方式. 如下图: eventlib是消息处理的一个库. enents是作者为使我们更方便,仿造的C#的消息模式. 我们去调用这个事件系统的使用方式如下: local EventTest = require "events" funct

wriesharek同时监听多个端口

之前的文章<wireshark解析自定义的protobuf协议> ,当时只监听了一个端口,而如果游戏同时有二个 socket 连接,比如一个是网关另外一个是其它的,怎么办呢? for i,port in ipairs(tcp_port) do tcp_port_table:add(port, m_MeteoricProto) end 参考链接:https://wiki.wireshark.org/Lua/Examples#Using_Lua_to_register_protocols_to_m

使用 mysql-proxy 监听 mysql 查询

什么是 mysql-proxy? mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server. 它使用mysql协议,任何使用mysql-client的上游无需修改任何代码,即可迁移至mysql-proxy上. mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层: 进一步的,mysql-proxy可以分析与修改请求.拦截查询和修改结果,需要通过编写Lua脚本来完成. mysql-pr

Unity3D热更新之LuaFramework篇[04]--自定义UI监听方法

时隔一个多月我又回来啦! 坚持真的是很难的一件事,其它事情稍忙,就很容易说服自己把写博客的计划给推迟了. 好在终于克服了自己的惰性,今天又开始了. 本篇继续我的Luaframework学习之路. 一.规范开发模式 此前的示例中,动态加载的panel都默认以GuiCamera为父节点,且面板的大小设置得有些随意,为方便后续开发,现做一些调整和规范. 1.设定本项目的开发分辨率为1334x750(Game视图分辨率也设置为这个大小): 2.调整相机,将原有的GuiCamera从Canvas下拖离出来

Android 监听ListView、GridView滑动到底部

// 监听listview滚到最底部mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (view.get