public void doFrame(float t) { if (skeletonRoot == null) { Debug.LogError("no skeleton root"); return; } if (nifanimation == null || activeAnimation == -1) { setActiveAnimation(getIdleAnimIndex()); if (nifanimation == null) { return; } } //Debug.Log("using anim :" + this.nifanimation.) /** For each sequence, evaluate it with the current time and apply the result to the related bone */ foreach (NiSequenceData data in nifanimation.nifSequences) { for (int i = 0; i < data.seqEvalIDList.Count; i++) { int evalID = (int)data.seqEvalIDList[i]; NIFObject evalObjA = nifanimation.getObject(evalID); if (nifanimation.getObject(evalID) is NiBSplineCompTransformEvaluator) { NiBSplineCompTransformEvaluator evalObj = (NiBSplineCompTransformEvaluator)evalObjA; string boneName = nifanimation.getStringFromTable(evalObj.m_kAVObjectName); GameObject go; // cache game objects for bones boneMap.TryGetValue(boneName, out go); if (go == null) { Transform bone = skeletonRoot.transform.FindDeepChild(boneName); if (bone == null) { // Debug.LogWarning("unable to find bone in skeleton for " + boneName); continue; } go = boneMap[boneName] = bone.gameObject; //GameObject.Find(boneName); } if (go == null) { // Debug.Log("unable to get gameobject for bone " + boneName); continue; } int splineDataIndex = evalObj.splineDataIndex; int basisDataIndex = evalObj.basisDataIndex; if (splineDataIndex != -1 && basisDataIndex != -1) { NiBSplineData splineObj = (NiBSplineData)nifanimation.getObject(splineDataIndex); NiBSplineBasisData basisObj = (NiBSplineBasisData)nifanimation.getObject(basisDataIndex); if (evalObj.m_kRotCPHandle != 65535) { float[] afValues = new float[4]; // get the rotation values for the given time 't' splineObj.getCompactValueDegree3(t, afValues, 4, basisObj, evalObj.m_kRotCPHandle, evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.ROTATION_OFFSET], evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.ROTATION_RANGE]); // apply the rotation to the bone go.transform.localRotation = new Quaternion(afValues[1], afValues[2], afValues[3], afValues[0]); } if (evalObj.m_kTransCPHandle != 65535) { // get the position values for the given time 't' float[] afValues = new float[3]; float offset = evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.POSITION_OFFSET]; float range = evalObj.m_afCompScalars[(int)NiBSplineCompTransformEvaluator.COMP_.POSITION_RANGE]; splineObj.getCompactValueDegree3(t, afValues, 3, basisObj, evalObj.m_kTransCPHandle, offset, range); go.transform.localPosition = new Vector3(afValues[0], afValues[1], afValues[2]); } } //Debug.Log("drawLine", go); Debug.DrawLine(go.transform.position, go.transform.parent.position); } else { Debug.LogWarning("Unknown animation type:" + evalObjA.GetType()); } } } }