Exemple #1
0
    // 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);
        }
    }
Exemple #2
0
    _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;
            }
        }
    }