static AnimData SampleClip(GameObject go, AnimationClip clip)
    {
        //Debug.Log("Sample motion, Clip:" + clip.name + " GameObject:" + go.name);

        AnimData animData = new AnimData();

        animData.sampleDatas = new List <SampleData>();

        animData.frameRate = IM.Editor.Tools.Convert(clip.frameRate);
        animData.wrapMode  = clip.wrapMode;

        Dictionary <SampleNode, Transform> transforms = new Dictionary <SampleNode, Transform>();

        for (int i = 0; i < (int)SampleNode.Count; ++i)
        {
            string    nodeName  = NODE_NAMES[i];
            Transform transform = GameUtils.FindChildRecursive(go.transform, nodeName);
            transforms.Add((SampleNode)i, transform);
        }

        Transform root = transforms[SampleNode.Root];

        //Debug.Log(clip.averageDuration);
        for (IM.Number t = IM.Number.zero; ; t += SAMPLE_INTERVAL)
        {
            SampleData data = new SampleData();

            float time = Mathf.Min((float)t, clip.averageDuration);
            clip.SampleAnimation(go, time);
            data.time = IM.Editor.Tools.Convert(time);

            data.nodes = new Dictionary <SampleNode, SampleNodeData>();
            for (int i = 0; i < (int)SampleNode.Count; ++i)
            {
                SampleNode node      = (SampleNode)i;
                Transform  transform = transforms[node];
                Vector3    curPos    = transform.position;
                Quaternion curRot    = transform.rotation;

                SampleNodeData nodeData = new SampleNodeData();
                if (node == SampleNode.Root)    //Root节点采样相对于Player的位置
                {
                    nodeData.position  = IM.Editor.Tools.Convert(curPos);
                    nodeData.horiAngle = IM.Editor.Tools.Convert(curRot.eulerAngles.y);
                }
                else    //其他节点采样相对于Root的位置
                {
                    nodeData.position = IM.Editor.Tools.Convert(root.transform.InverseTransformPoint(transform.position));
                }
                //Debug.Log(string.Format("Sample, clip:{0} node:{1} time:{2} pos:{3} angle:{4}",
                //    clip.name, node, time, nodeData.position, nodeData.horiAngle));

                data.nodes.Add(node, nodeData);
            }

            animData.sampleDatas.Add(data);

            if ((float)t >= clip.averageDuration)
            {
                break;
            }
        }


        //Animation event
        animData.eventDatas = new List <AnimEventData>();
        AnimationEvent[] events = AnimationUtility.GetAnimationEvents(clip);
        for (int i = 0; i < events.Length; ++i)
        {
            AnimationEvent evt       = events[i];
            AnimEventData  eventData = new AnimEventData();
            eventData.funcName        = evt.functionName;
            eventData.time            = IM.Editor.Tools.Convert(evt.time);
            eventData.intParameter    = evt.intParameter;
            eventData.floatParameter  = IM.Editor.Tools.Convert(evt.floatParameter);
            eventData.stringParameter = evt.stringParameter;
            animData.eventDatas.Add(eventData);
            evt.messageOptions = SendMessageOptions.DontRequireReceiver;
        }
        AnimationUtility.SetAnimationEvents(clip, events);

        return(animData);
    }
Exemple #2
0
    public void ReadConfig()
    {
        if (isLoadFinish == false)
        {
            return;
        }
        isLoadFinish = false;
        lock (LockObject) { GameSystem.Instance.readConfigCnt += 1; }

        string text = ResourceLoadManager.Instance.GetConfigText(XML_ASSET_NAME);

        if (text == null)
        {
            ErrorDisplay.Instance.HandleLog("LoadConfig failed: " + XML_ASSET_NAME, "", LogType.Error);
            return;
        }

        datas.Clear();
        XmlDocument doc = new XmlDocument();

        doc.LoadXml(text);
        XmlNode root = doc.SelectSingleNode("AnimationSamples");

        foreach (XmlNode motion in root.SelectNodes("Animation"))
        {
            AnimData animData = new AnimData();
            string   name     = motion.Attributes["name"].Value;
            datas.Add(name, animData);

            animData.wrapMode  = (WrapMode)(int.Parse(motion.Attributes["wrapMode"].Value));
            animData.frameRate = IM.Number.Parse(motion.Attributes["frameRate"].Value);

            animData.sampleDatas = new List <SampleData>();
            foreach (XmlNode sample in motion.SelectNodes("Sample"))
            {
                IM.Number  time = IM.Number.Parse(sample.Attributes["time"].Value);
                SampleData data = new SampleData();
                data.time = time;
                animData.sampleDatas.Add(data);

                data.nodes = new Dictionary <SampleNode, SampleNodeData>();
                foreach (XmlNode node in sample.SelectNodes("Node"))
                {
                    SampleNodeData nodeData     = new SampleNodeData();
                    SampleNode     nodeName     = (SampleNode)(int.Parse(node.Attributes["name"].Value));
                    XmlAttribute   attrPosition = node.Attributes["position"];
                    if (attrPosition != null)
                    {
                        nodeData.position = IM.Vector3.Parse(attrPosition.Value);
                    }
                    XmlAttribute attrHoriAngle = node.Attributes["hori_angle"];
                    if (attrHoriAngle != null)
                    {
                        nodeData.horiAngle = IM.Number.Parse(attrHoriAngle.Value);
                    }
                    data.nodes.Add(nodeName, nodeData);
                }
            }
            animData.duration = animData.sampleDatas[animData.sampleDatas.Count - 1].time;

            animData.eventDatas = new List <AnimEventData>();
            foreach (XmlNode evt in motion.SelectNodes("Event"))
            {
                AnimEventData eventData = new AnimEventData();
                eventData.time     = IM.Number.Parse(evt.Attributes["time"].Value);
                eventData.funcName = evt.Attributes["func"].Value;
                XmlAttribute attrIntParam = evt.Attributes["int_param"];
                if (attrIntParam != null)
                {
                    eventData.intParameter = int.Parse(attrIntParam.Value);
                }
                XmlAttribute attrStringParam = evt.Attributes["string_param"];
                if (attrStringParam != null)
                {
                    eventData.stringParameter = attrStringParam.Value;
                }
                XmlAttribute attrFloatParam = evt.Attributes["float_param"];
                if (attrFloatParam != null)
                {
                    eventData.floatParameter = IM.Number.Parse(attrFloatParam.Value);
                }
                animData.eventDatas.Add(eventData);
            }
            //按事件时间排序
            animData.eventDatas.Sort((d1, d2) => d1.time < d2.time ? -1 : (d1.time > d2.time ? 1 : 0));
        }
    }