예제 #1
0
    public static void Add(Transform aTransform, JuiceType aType, AnimationCurve aCurve, float aStart = 0, float aEnd = 1, float aDuration = 1, bool aRelative = false, Action aCallback = null)
    {
        JuiceData data = new JuiceData();

        data.transform = aTransform;
        data.type      = aType;
        data.curve     = aCurve;
        data.start     = aStart;
        data.duration  = aDuration;
        data.startTime = Time.time;
        data.end       = aEnd;
        data.relative  = aRelative;
        data.callback  = aCallback;
        Instance.list.Add(data);
        data.Update();
    }
예제 #2
0
    public bool Update()
    {
        if (transform == null)
        {
            return(true);
        }
        float percent = Mathf.Min((Time.time - startTime) / duration, 1f);
        float value   = start + curve.Evaluate(percent) * (end - start);

        if (relative)
        {
            float prevPercent = Mathf.Max(0, Mathf.Min(((Time.time - Time.deltaTime) - startTime) / duration, 1f));
            value = value - (start + curve.Evaluate(prevPercent) * (end - start));
        }

        JuiceType t       = type;
        bool      doPos   = false;
        bool      doScale = false;
        bool      doRot   = false;
        Vector3   pos     = relative ? Vector3.zero : transform.localPosition;
        Vector3   scale   = relative ? Vector3.zero : transform.localScale;
        Vector3   rot     = relative ? Vector3.zero : transform.eulerAngles;

        // translation
        if ((t & JuiceType.TranslateX) > 0)
        {
            pos.x = value;
            doPos = true;
        }
        if ((t & JuiceType.TranslateY) > 0)
        {
            pos.y = value;
            doPos = true;
        }
        if ((t & JuiceType.TranslateZ) > 0)
        {
            pos.z = value;
            doPos = true;
        }

        // scale
        if ((t & JuiceType.ScaleX) > 0)
        {
            scale.x = value;
            doScale = true;
        }
        if ((t & JuiceType.ScaleY) > 0)
        {
            scale.y = value;
            doScale = true;
        }
        if ((t & JuiceType.ScaleZ) > 0)
        {
            scale.z = value;
            doScale = true;
        }

        // rotation
        if ((t & JuiceType.RotationX) > 0)
        {
            rot.x = value;
            doRot = true;
        }
        if ((t & JuiceType.RotationY) > 0)
        {
            rot.y = value;
            doRot = true;
        }
        if ((t & JuiceType.RotationZ) > 0)
        {
            rot.z = value;
            doRot = true;
        }

        if (doPos && relative)
        {
            transform.localPosition += pos;
        }
        else if (doPos)
        {
            transform.localPosition = pos;
        }

        if (doScale && relative)
        {
            transform.localScale += scale;
        }
        else if (doScale)
        {
            transform.localScale = scale;
        }

        if (doRot && relative)
        {
            transform.localEulerAngles += rot;
        }
        else if (doRot)
        {
            transform.localEulerAngles = rot;
        }

        return(percent >= 1.0f);
    }