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); }
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)); } }