// Use this for initialization void Start() { sprite = GetComponent <SsSprite>(); // 0番=ルートパーツを参照する SsPart part = sprite.GetPart(0); // ルートパーツが持つ全ユーザーデータキーの文字列とフレーム位置のペアで辞書を作る SsPartRes res = part._res; int endFrame = res.FrameNum - 1; // 末尾キーから先頭キーに向かって遡る for (int i = res.UserKeys.Count - 1; i >= 0; --i) { SsUserDataKeyFrame userDataKey = (SsUserDataKeyFrame)res.GetKey(SsKeyAttr.User, i); // 文字列が格納されていない場合は無視する if (!userDataKey.Value.IsString) { continue; } var se = new StartEndFrame(); // 1つ右のキーフレーム、または全フレーム数-1を終了フレームとする se.end = endFrame; // "文字列"領域に書かれた文字列をキーにして開始・終了位置フレームを登録する se.start = userDataKey.Time; labelToFrame[userDataKey.Value.String] = se; // このキーフレームの位置-1が1つ左の区間の終了フレームになる endFrame = userDataKey.Time - 1; } // 登録したラベルと区間を列挙する Debug.Log("User data keys..."); foreach (var e in labelToFrame) { Debug.Log("[" + e.Key + "] start:" + e.Value.start + " end:" + e.Value.end); } }
_OnEvent(SsKeyAttr attr) { // take value at just key frame. SsAttrValue[] values = _res.GetAttrValues(attr); if (values.Length == 0) { return; } // ignore within previous frame if ((int)_mgr._animeFrame == (int)_mgr._prevFrame) { return; } // trace each frame from previous frame to current frame. int destFrame = (int)_mgr._animeFrame; int frame = (int)_mgr._prevFrame; for (int i = 0; i < _mgr._playFrameLength; ++i) { frame = _mgr._StepFrameFromPrev(frame); SsAttrValue v; if (frame < values.Length) { // get value at this frame v = values[frame]; } else { // refer to the single value consolidated from multiple keyframes v = values[0]; } // is this a generated value from interpolation? if (!v.HasValue) { // is time just at key? SsKeyFrameInterface key = _res.GetKey(attr, v.RefKeyIndex); if (key.Time == frame) { // OK switch (attr) { case SsKeyAttr.User: SsUserDataKeyFrame userKey = (SsUserDataKeyFrame)key; OnUserDataKey(this, userKey.Value); break; case SsKeyAttr.Sound: SsSoundKeyFrame soundKey = (SsSoundKeyFrame)key; OnSoundKey(this, soundKey.Value); break; default: Debug.LogWarning("Not implemented event: " + attr); break; } } } if (frame == destFrame) { break; } } }