Exemple #1
0
    // Update is called once per frame
    void Update()
    {
        switch (state)
        {
        case State.None:
            nextState = State.Restart;
            break;

        case State.Idle:
            if (isDragging)
            {
                nextState = State.Dragging;
            }
            break;

        case State.Dragging:
        {
            DoDragging();
            var color = Color.white;
            if (IsInAttachRange())
            {
                color = Color.green;
                if (!isDragging)
                {
                    nextState    = State.Attaching;
                    attachTarget = finishedPositon;
                    gameSceneControl.PlaySound(GameSceneControl.SoundEffect.Attach);
                }
            }
            else
            {
                if (!isDragging)
                {
                    nextState = State.Idle;
                    gameSceneControl.PlaySound(GameSceneControl.SoundEffect.Release);
                }
            }
            GetComponent <Renderer>().material.color = color;
            break;
        }

        case State.Attaching:
            var distance = attachTarget - transform.position;
            distance *= 0.5f;
            float minMoveDistance = AttachSpeedMin * Time.deltaTime;
            float maxMoveDistacne = AttachSpeedMax * Time.deltaTime;
            if (distance.magnitude < minMoveDistance)
            {
                transform.position = attachTarget;
            }
            else if (distance.magnitude > maxMoveDistacne)
            {
                distance *= maxMoveDistacne / distance.magnitude;
            }

            transform.position = transform.position + distance;

            if (Vector3.Distance(transform.position, attachTarget) < 0.0001f)
            {
                nextState = State.Finished;
            }
            break;
        }

        if (nextState != State.None)
        {
            switch (nextState)
            {
            case State.Idle:
                SetHeightOffset(heightOffset);
                break;

            case State.Restart:
                transform.position = startPositon;
                nextState          = State.Idle;
                break;

            case State.Dragging:
                BeginDragging();
                puzzleControl.PickPiece(this);
                gameSceneControl.PlaySound(GameSceneControl.SoundEffect.Grab);
                break;

            case State.Finished:
                transform.position = finishedPositon;
                puzzleControl.FinishPiece(this);
                GetComponent <Renderer>().material.color = Color.white;
                break;
            }
            state     = nextState;
            nextState = State.None;
        }
    }