void Start()
    {
        transform.localScale = new Vector3(0, 0, 1);
        phase        = LifeCyclePhase.APPEARING;
        creationTime = Time.time;

        // Set up pulsing
        pulse = GetComponent <Pulsing>();
        if (pulse != null)
        {
            pulse.enabled = false;
        }
    }
        public override string GetStepParameters()
        {
            var parameters = new List <string>();

            parameters.Add(GlobalId != null ? GlobalId.ToStepValue() : "$");
            parameters.Add(OwnerHistory != null ? OwnerHistory.ToStepValue() : "$");
            parameters.Add(Name != null ? Name.ToStepValue() : "$");
            parameters.Add(Description != null ? Description.ToStepValue() : "$");
            parameters.Add(ObjectType != null ? ObjectType.ToStepValue() : "$");
            parameters.Add(Identification != null ? Identification.ToStepValue() : "$");
            parameters.Add(LifeCyclePhase != null ? LifeCyclePhase.ToStepValue() : "$");
            parameters.Add(PredefinedType.ToStepValue());

            return(string.Join(", ", parameters.ToArray()));
        }
    void Update()
    {
        if (phase == LifeCyclePhase.ACTIVE)
        {
            float timeAlive = Time.time - creationTime;
            if (GameManager.instance.playMode != GameManager.PlayMode.TUTORIAL &&
                timeAlive > minLifetime && Random.value < (timeAlive - minLifetime) / lifetimeVariability)
            {
                // Begin the disappearing phase
                phase = LifeCyclePhase.DISAPPEARING;

                if (pulse != null)
                {
                    pulse.enabled = false;
                }

                if (listener != null)
                {
                    listener.OnLifecycleDisappear();
                }
            }
            else if (listener != null)
            {
                listener.ActiveUpdate();
            }
        }
        else if (phase == LifeCyclePhase.APPEARING)
        {
            // Appear
            if (transform.localScale.x < staticScale)
            {
                Vector3 scale = transform.localScale;
                scale.x += appearRate;
                scale.y += appearRate;
                transform.localScale = scale;
            }
            else
            {
                // Appearing phase has completed
                phase = LifeCyclePhase.ACTIVE;

                if (pulse != null)
                {
                    pulse.enabled = true;
                }

                if (listener != null)
                {
                    listener.OnLifecycleActive();
                }
            }
        }
        else
        {
            // Disappear
            if (transform.localScale.x > 0)
            {
                Vector3 scale = transform.localScale;
                scale.x -= disappearRate;
                scale.y -= disappearRate;
                transform.localScale = scale;
            }
            else
            {
                Destroy(gameObject);
            }
        }
    }