Пример #1
0
    private void HandleGetBombProcess(PushableObject pushable)
    {
        ChangeState(Action.ForcedMove);
        forcedMoveObject = pushable;
        forcedMoveObject.SetPositionLock(true);           // 在此过程中被移动的物体锁定
        Vector3 bombPosition = pushable.transform.position;

        // 人物旋转到可以拿起炸弹的方向
        Vector3 bombDir = bombPosition - transform.position;

        bombDir.y = 0f;
        bombDir.Normalize();
        forcedStartRotation = transform.rotation;
        forcedEndRotation   = Quaternion.LookRotation(bombDir, Vector3.up);

        // 计算旋转之后的搬运点位置
        float   carryPointDist    = (pushController.bombCarryPoint.position - transform.position).magnitude;
        Vector3 rotatedCarryPoint = bombDir * carryPointDist + transform.position;
        Vector3 dist = bombPosition - rotatedCarryPoint;

        dist.y        = 0f;
        forcedMoveDir = dist.normalized;

        float rotateTime = 1.0f / playerRotationSpeed;
        float moveTime   = dist.magnitude / playerForcedMovingSpeed;

        totolTime       = rotateTime > moveTime ? rotateTime : moveTime;
        forcedMoveTimer = 0f;
    }
Пример #2
0
    void OnTriggerEnter2D(Collider2D other)
    {
        PushableObject pushableObject = GameObject
                                        .Find("PushableObject")
                                        .GetComponent <PushableObject>();

        pushableObject.ResetPuzzle();
    }
    // Bloco de funcoes referente a acao de empurrar objetos
    public void GrabObject(GameObject heldObject)
    {
        FMODUnity.RuntimeManager.PlayOneShot(voiceAylaShortActions, transform.position);
        currentObject            = heldObject;
        currPushableObjectScript = currentObject.GetComponent <PushableObject>();

        currPushableObjectScript.Grab(grabPosition);
    }
Пример #4
0
 void AttachPushable(PushableObject pushable)
 {
     pushable.transform.parent = transform;
     attachedPushable          = pushable;
     attachedPushable.GetPlatformTrigger()?.Decrement();
     SetSpeed(moveSpeedWhenPushing);
     base.SpecialAction();
 }
Пример #5
0
 private void OnTriggerExit(Collider other)
 {
     if (other.CompareTag("Bomb") || other.CompareTag("Player"))
     {
         PushableObject pushable = other.gameObject.GetComponent <PushableObject>();
         pushableInRange.Remove(pushable);
     }
 }
    private IEnumerator RunBridge(PushableObject p_objectToMove)
    {
        p_objectToMove.m_isOnBridge = true;

        p_objectToMove.gameObject.layer = m_transparentLayer;

        float t1 = 0;

        while (t1 < m_bridgeMoveTime)
        {
            t1 += Time.fixedDeltaTime;

            float progress = t1 / m_bridgeMoveTime;

            Vector3 targetPosition = Vector3.Lerp(transform.position, m_otherBridge.transform.position, progress);

            p_objectToMove.PhysicsSeekTo(targetPosition);

            yield return(new WaitForFixedUpdate());
        }

        float t2 = 0;

        Vector3 endTargetPos = m_otherBridge.transform.position + (Vector3.up * p_objectToMove.transform.localScale.y);

        while (t2 < m_endMoveTime)
        {
            t2 += Time.fixedDeltaTime;

            float progress = t2 / m_endMoveTime;

            Vector3 targetPosition = Vector3.Lerp(m_otherBridge.transform.position, endTargetPos, progress);

            p_objectToMove.PhysicsSeekTo(targetPosition);

            yield return(new WaitForFixedUpdate());
        }

        //p_objectToMove.m_velocity = Vector3.right * 30;

        PushGun pushGun = p_objectToMove.gameObject.GetComponent <PushGun>();

        if (pushGun == null)
        {
            p_objectToMove.gameObject.layer = m_moveableLayer;
        }
        else
        {
            p_objectToMove.gameObject.layer = 13;
        }



        //p_objectToMove.m_isOnBridge = false;
    }
    private void OnTriggerStay(Collider other)
    {
        PushableObject po = other.gameObject.GetComponent <PushableObject>();

        if (po != null && other.attachedRigidbody.velocity == Vector3.zero)
        {
            anim1.enabled  = true;
            anim2.enabled  = true;
            po.canBePushed = false;
        }
    }
Пример #8
0
    void DetachPushable()
    {
        if (attachedPushable == null)
        {
            return;
        }
        attachedPushable.transform.parent = attachedPushable.GetInitialParent;
        attachedPushable.GetPlatformTrigger()?.Decrement();
        attachedPushable = null;

        SetSpeed(initialmovementSpeed);
    }
        protected override bool ExtendedPushConditionsValid(GameObject inGameObject)
        {
            var actionStateMachine = PushableObject.GetComponent <IActionStateMachineInterface>();

            if (actionStateMachine != null)
            {
                return(actionStateMachine.IsActionStateActiveOnTrack(EActionStateMachineTrack.Locomotion,
                                                                     EActionStateId.Dead));
            }

            return(false);
        }
Пример #10
0
    private void MoveObjects(LayerMask p_mask)
    {
        if (!m_pushLocked)
        {
            Collider[] colliders = Physics.OverlapSphere(transform.position, 1f, p_mask);

            if (colliders.Length > 0)
            {
                PushableObject pushable = colliders[0].gameObject.GetComponent <PushableObject>();
                pushable.PushObject(m_velocity);
            }
        }
    }
Пример #11
0
    private void OnTriggerExit(Collider other)
    {
        PushableObject pushableObject = other.gameObject.GetComponent <PushableObject>();

        if (pushableObject != null)
        {
            pushableObject.SetPlatformTrigger(null);
            NumPushingObjects--;
        }
        if (other.gameObject.GetComponent <CharachterModel>())
        {
            NumPushingObjects--;
        }
    }
    private void OnTriggerEnter(Collider other)
    {
        if (CheckCollisionLayer(m_bridgeMoveableObjects, other.gameObject))
        {
            PushableObject pushTarget = other.gameObject.GetComponent <PushableObject>();

            if (!m_isBeingCarried)
            {
                if (!pushTarget.m_isOnBridge)
                {
                    StartCoroutine(RunBridge(pushTarget));
                }
            }
        }
    }
Пример #13
0
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log(other.name);
        PushableObject pushableObject = other.gameObject.GetComponent <PushableObject>();

        if (pushableObject != null)
        {
            pushableObject.SetPlatformTrigger(this);
            NumPushingObjects++;
        }

        if (other.gameObject.GetComponent <CharachterModel>())
        {
            NumPushingObjects++;
        }
    }
Пример #14
0
    void StartPushingEnd()
    {
        PushableObjectPad pad      = pushableObject.GetComponent <PushableObjectPad>();
        PushableObject    pushable = pushableObject.transform.parent.GetComponent <PushableObject>();

        pushingSpeed = pushingSpeed * pushable.speedMult;
        Vector3 endPos          = rb.position + pad.endPosOffset;
        float   inverseMoveTime = pushingSpeed / pad.endPosOffset.magnitude;

        pushable.Push(pad.endPosOffset, inverseMoveTime);
        StartCoroutine(SmoothMovement((bool done) => {
            anim.SetTrigger("stopPushing");
            GameSound.Stop("Push");
        }, endPos, inverseMoveTime));

        GameSound.Play("Push");
    }
Пример #15
0
    public void VerticalAttack()
    {
        UpdateRaycastOrigins();
        // float originalMoveAmountX = moveAmount.x;
        Collider2D           otherCollider   = null;
        HashSet <Collider2D> attackedEnemies = new HashSet <Collider2D>();

        float directionY = Mathf.Sign(attack.direction.y);

        for (int i = 0; i < verticalRayCount; i++)
        {
            Vector2 rayOrigin = (directionY == -1) ? raycastOrigins.bottomLeft : raycastOrigins.topLeft;
            rayOrigin += Vector2.right * (verticalRaySpacing * i);
            RaycastHit2D hit = Physics2D.Raycast(rayOrigin, Vector2.up * directionY, range, collisionMask);

            Debug.DrawRay(rayOrigin, Vector2.up * directionY * range, Color.yellow);

            if (hit)
            {
                if (hit.distance == 0)
                {
                    continue;
                }

                otherCollider = hit.collider;
            }

            if (otherCollider != null && otherCollider.gameObject != this.gameObject && !attackedEnemies.Contains(otherCollider)) // && otherCollider.tag == "Pushable"
            {
                attackedEnemies.Add(otherCollider);
                Destructable destructable = otherCollider.gameObject.GetComponent <Destructable>();
                if (destructable)
                {
                    destructable.Damage(damage);
                }


                if (otherCollider.tag == "Pushable")
                {
                    PushableObject pushable = otherCollider.gameObject.GetComponent <PushableObject>();
                    pushable.Launch(new Vector2(pushForce.x, pushForce.y * directionY));
                }
            }
        }
    }
Пример #16
0
        private void Start()
        {
            _connector      = SelectableObject.GetAsChild(gameObject, ESwitchableObjectId.ELEVATOR_CALLER_CONNECTOR);
            _panel          = SelectableObject.GetAsChild(_connector.gameObject, ESwitchableObjectId.ELEVATOR_CALLER_PANEL);
            _commonWires    = SelectableObject.GetAsChild(_connector.gameObject, ESwitchableObjectId.ELEVATOR_CALLER_WIRES);
            _button         = SelectableObject.GetAsChild <PushableObject>(_panel.gameObject, "button");
            _connectorWires = _connector.transform.Find("connector_static_wires").gameObject;

            _connector.Clicked += OnConnectorClicked;
            _connector.Closed  += OnConnectorClosed;

            _panel.Clicked += OnPanelClicked;
            _panel.Closed  += OnPanelClosed;
            _panel.OpenAnimationCompleted += OnPanelOpenAnimationCompleted;

            _commonWires.Opened += OnWiresConnectedWithTape;

            _button.Opened += OnButtonClicked;
        }
Пример #17
0
    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        if (!bearTriesToPush)
        {
            return;
        }
        if (attachedPushable != null)
        {
            return;
        }


        PushableObject pushableObject = hit.gameObject.GetComponent <PushableObject>();

        if (pushableObject != null)
        {
            AttachPushable(pushableObject);
        }
    }
Пример #18
0
    /// <summary>
    /// 开始推动物体或结束推动物体
    /// 如果已经有正在推动的物体,则会放下它,否则会接近最近的一个可被推动的物体尝试开始推动
    /// </summary>
    public void ChangePushState()
    {
        if (CheckAnimatorState("Push Idle", "Push Run") &&
            pushController.GetCarriedType() == CarryType.Player)               // 只有推动的是冰冻的队友时才能放下
        {
            // 放下正在推动的物体
            StopPushing();
        }


        if (CheckAnimatorState("Idle", "Run"))
        {
            PushableObject pushable = pushController.GetPushableInRange();
            if (pushable != null)
            {
                HandleGetBombProcess(pushable);
            }
        }
    }
Пример #19
0
    public void Kick(float bombShootSpeed, float rotateTime, float kickDelay, Vector3 forwardDir)
    {
        if (carriedObject != null && !waitForCarrying)
        {
            if (carriedObject.type != PushableObject.CarryType.Bomb)
            {
                return;
            }

            Bomb bomb = carriedObject.GetComponent <Bomb>();
            if (bomb != null)
            {
                StartCoroutine(RotateToTarget(bomb, forwardDir, rotateTime));
                PhotonView bombView = PhotonView.Get(bomb);
                bomb.DelayShoot(forwardDir * bombShootSpeed, kickDelay);
                bomb.Detach();
                bombView.RPC("DelayShoot", RpcTarget.Others, forwardDir * bombShootSpeed, kickDelay);
                bombView.RPC("Detach", RpcTarget.Others);
                carriedObject = null;
            }
        }
    }
Пример #20
0
    public void Push()
    {
        Vector3 pushD        = playerT.rotation.eulerAngles;
        float   handPosition = this.GetComponent <CapsuleCollider>().radius;
        Vector3 hitBox       = new Vector3(0.2f, 0.2f, 0.2f);

        Collider[] pushableObjects;
        if (facing == Direction.Up)
        {
            pushableObjects = Physics.OverlapBox(
                new Vector3(playerT.position.x + handPosition, playerT.position.y, playerT.position.z), hitBox);
        }
        else if (facing == Direction.Down)
        {
            pushableObjects = Physics.OverlapBox(
                new Vector3(playerT.position.x - handPosition, playerT.position.y, playerT.position.z), hitBox);
        }
        else if (facing == Direction.Left)
        {
            pushableObjects = Physics.OverlapBox(
                new Vector3(playerT.position.x, playerT.position.y, playerT.position.z + handPosition), hitBox);
        }
        else
        {
            pushableObjects = Physics.OverlapBox(
                new Vector3(playerT.position.x, playerT.position.y, playerT.position.z - handPosition), hitBox);
        }
        foreach (Collider c in pushableObjects)
        {
            Debug.Log(c.gameObject.name);
            PushableObject pB = c.gameObject.GetComponent <PushableObject>();
            if (pB != null && !pB.beingPushed)
            {
                pB.BePushed(facing);
            }
        }
    }
Пример #21
0
 private void FixedUpdate()
 {
     // 处理强制移动(走向被推动的物体)
     if (curState == Action.ForcedMove)
     {
         if (forcedMoveObject == null)
         {
             ResetStateIfNotConstrained();
             forcedMoveTimer = 0f;
         }
         else
         {
             if (forcedMoveTimer < totolTime)
             {
                 playerRigidbody.velocity = forcedMoveDir * playerForcedMovingSpeed;
                 playerRigidbody.MoveRotation(Quaternion.Slerp(forcedStartRotation, forcedEndRotation, forcedMoveTimer * playerRotationSpeed));
                 forcedMoveTimer += Time.fixedDeltaTime;
             }
             else
             {
                 forcedMoveTimer          = 0f;
                 playerRigidbody.velocity = Vector3.zero;
                 if (forcedMoveObject != null)
                 {
                     forcedMoveObject.SetPositionLock(false);                            // 解除锁定
                     pushController.AttachPushable(forcedMoveObject);
                     ChangeState(Action.Pushing);
                     forcedMoveObject = null;
                 }
                 else
                 {
                     ResetStateIfNotConstrained();
                 }
             }
         }
     }
 }
Пример #22
0
    // Update is called once per frame
    void Update()
    {
        //PushableObject pushScript;
        LiftableObject        liftScript  = null;
        EnvironmentalPushable envPushable = null;

        pushBoxController = null;

        if (characterControl != null && characterControl.lockMovement == true)
        {
            dropObject();
        }


        //Raycasting (4 directions) ----------------------------
        RaycastHit rayHit;

        if (Physics.Raycast(transform.position + new Vector3(0, 1, 0), transform.forward + new Vector3(0, -0.5f, 0), out rayHit, 1.2f, rayMask))
        {
            pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>();
            liftScript        = rayHit.collider.gameObject.GetComponent <LiftableObject>();
            envPushable       = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>();
        }

        if ((pushBoxController == null && liftScript == null && envPushable == null) &&
            Physics.Raycast(transform.position + new Vector3(0, 1, 0) + 0.25f * transform.right, transform.forward + new Vector3(0, -0.5f, 0) + 1.5f * transform.right, out rayHit, 1.2f, rayMask))
        {
            pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>();
            liftScript        = rayHit.collider.gameObject.GetComponent <LiftableObject>();
            envPushable       = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>();
        }

        if ((pushBoxController == null && liftScript == null && envPushable == null) &&
            Physics.Raycast(transform.position + new Vector3(0, 1, 0) - 0.25f * transform.right, transform.forward + new Vector3(0, -0.5f, 0) - 1.5f * transform.right, out rayHit, 1.2f, rayMask))
        {
            pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>();
            liftScript        = rayHit.collider.gameObject.GetComponent <LiftableObject>();
            envPushable       = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>();
        }

        if (optionalCam != null)
        {
            if ((pushBoxController == null && liftScript == null && envPushable == null) &&
                Physics.Raycast(optionalCam.transform.position, optionalCam.transform.forward, out rayHit, (Vector3.Distance(transform.position, optionalCam.transform.position) + 1.3f), rayMask))
            {
                pushBoxController = rayHit.collider.gameObject.GetComponent <PushableObject>();
                liftScript        = rayHit.collider.gameObject.GetComponent <LiftableObject>();
                envPushable       = rayHit.collider.gameObject.GetComponent <EnvironmentalPushable>();
            }
        }

        Debug.DrawRay(transform.position + new Vector3(0, 1, 0) + 0.25f * transform.right, (transform.forward + new Vector3(0, -0.5f, 0) + 1.5f * transform.right).normalized * 1.2f, Color.magenta);
        Debug.DrawRay(transform.position + new Vector3(0, 1, 0) - 0.25f * transform.right, (transform.forward + new Vector3(0, -0.5f, 0) - 1.5f * transform.right).normalized * 1.2f, Color.magenta);
        if (optionalCam != null)
        {
            Debug.DrawRay(optionalCam.transform.position, (optionalCam.transform.forward).normalized * (Vector3.Distance(transform.position, optionalCam.transform.position) + 1.2f), Color.green);
        }
        Debug.DrawRay(transform.position + new Vector3(0, 1, 0), (transform.forward + new Vector3(0, -0.5f, 0)).normalized * 1.2f, Color.magenta);


        //-------------------------------------------------------


        //Raycast resolution ----------------------
        if (liftScript != null && characterControl.lockMovement != true)
        {
            objectToLift = liftScript.gameObject;
            nextToPickup = true;
        }
        else
        {
            if (!holdingPickup)
            {
                objectToLift = null;
            }
            nextToPickup = false;

            if (pushBoxController != null)
            {
                objectToPush   = pushBoxController.gameObject;
                nextToPushable = true;
            }
            else
            {
                if (!pushingObject)
                {
                    objectToPush = null;
                }
                nextToPushable = false;

                if (envPushable != null)
                {
                    nextToEnvPushable = true;
                }
                else
                {
                    nextToEnvPushable = false;
                }
            }
        }
        //-----------------------------------------



        if (objectToLift != null)
        {
            if (nextToPickup && !holdingPickup && !pushingObject && !objectToLift.GetComponent <LiftableObject>().beingCarried)
            {
                prompt.SetActive(true);
                if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact"))
                {
                    //lerpingPickup = true;
                    objectToLift.GetComponent <LiftableObject>().beingCarried = true;
                    LiftObject();
                }
            }
        }

        if (nextToPushable && !holdingPickup && !pushingObject)
        {
            prompt.SetActive(true);
            if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact"))
            {
                transitioning = true;
                pushingObject = true;
                characterControl.lockMovement = true;
                characterControl.pushing      = true;
                //character.pushingObject = true;
                objectToPush.GetComponent <Rigidbody>().mass = 200f;
                //gameObject.GetComponent<MoveBehaviour>().pushing = true;

                //objectToPush.GetComponent<Rigidbody>().isKinematic = true;
                //Physics.IgnoreCollision(objectToPush.GetComponent<Collider>(), gameObject.transform.parent.GetComponent<Collider>());
                //pushPos.position = objectToPush.transform.position;
                pushBoxController.beingPushed = true;
                float tempDist     = Vector3.Distance(transform.position, pushBoxController.pushPoints[0].position);
                int   nearestPoint = 0;
                for (int i = 0; i < pushBoxController.pushPoints.Length; i++)
                {
                    if (Vector3.Distance(transform.position, pushBoxController.pushPoints[i].position) < tempDist)
                    {
                        tempDist     = Vector3.Distance(transform.position, pushBoxController.pushPoints[i].position);
                        nearestPoint = i;
                    }
                }
                pushPoint = pushBoxController.pushPoints[nearestPoint];
            }
        }


        if (nextToEnvPushable && !holdingPickup && !pushingObject)
        {
            if (envPushable.animPlayed == false)
            {
                prompt.SetActive(true);
                if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact"))
                {
                    envPushable.PlayAnim();
                    prompt.SetActive(false);
                }
            }
        }

        if ((!nextToPickup && !nextToPushable && !nextToEnvPushable) || holdingPickup || pushingObject)
        {
            prompt.SetActive(false);
        }

        if (holdingPickup && !transitioning)
        {
            if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact"))
            {
                //lerpingPickup = false;
                dropObject();
            }
        }

        if (pushingObject && !transitioning)
        {
            //print(pushPos.position);

            if (Input.GetKeyDown(KeyCode.E) || Input.GetButtonDown("Interact"))
            {
                pushingObject                 = false;
                characterControl.pushing      = false;
                characterControl.lockMovement = false;

                objectToPush.GetComponent <Rigidbody>().mass = 100000;
                //gameObject.GetComponent<MoveBehaviour>().pushing = false;

                //Physics.IgnoreCollision(objectToPush.GetComponent<Collider>(), gameObject.transform.parent.GetComponent<Collider>(), false);
            }
            else
            {
                if (Vector3.Distance(transform.position, new Vector3(pushPoint.position.x, transform.position.y, pushPoint.position.z)) > 0.03f && characterControl.lockMovement)
                {
                    transform.position = Vector3.Lerp(transform.position, new Vector3(pushPoint.position.x, transform.position.y, pushPoint.position.z), 0.5f);
                    Physics.IgnoreCollision(objectToPush.GetComponent <Collider>(), gameObject.transform.GetComponent <Collider>());
                    //play moving anim here
                }
                else
                {
                    Physics.IgnoreCollision(objectToPush.GetComponent <Collider>(), gameObject.transform.GetComponent <Collider>(), false);
                    if (characterControl.lockMovement)
                    {
                        characterControl.lockMovement = false;
                        transform.LookAt(new Vector3(objectToPush.transform.position.x, transform.position.y, objectToPush.transform.position.z));
                    }
                    else
                    {
                        transform.LookAt(new Vector3(objectToPush.transform.position.x, transform.position.y, objectToPush.transform.position.z));
                        if (Vector3.Distance(pushPos.position, new Vector3(pushPoint.position.x, pushPos.position.y, pushPoint.position.z)) > 1.5f)
                        {
                            pushingObject                 = false;
                            characterControl.pushing      = false;
                            characterControl.lockMovement = false;

                            objectToPush.GetComponent <Rigidbody>().mass = 100000;
                        }
                    }
                }
            }
        }

        if (holdingPickup && lerpingPickup)
        {
            objectToLift.transform.LookAt(liftPos.position + transform.forward);
            objectToLift.transform.position = Vector3.Lerp(objectToLift.transform.position, liftPos.position, liftSpeed);
        }

        /*if (pushingObject)
         * {
         *  //objectToPush.transform.position = Vector3.Lerp(objectToPush.transform.position, pushPos.position, 5);
         * }*/

        transitioning = false;
    }
Пример #23
0
 private void Awake()
 {
     movementController = gameObject.GetComponent <PushableObject>();
 }
Пример #24
0
 /// <summary>
 /// 主动解除现在正在推的物体
 /// </summary>
 public void DetachCurrentPushing()
 {
     carriedObject = null;
 }
Пример #25
0
 /// <summary>
 /// 让PushController获得推动的物体
 /// </summary>
 public void AttachPushable(PushableObject pushable)
 {
     carriedObject = pushable;
     pushable.Attach(playerController);
 }
Пример #26
0
    /* ====================================== *
    *                 UPDATE                 *
    * ====================================== */
    void Update()
    {
        //grounded = Physics2D.Linecast (transform.position, groundCheck.position, ground);
        //ContactFilter2D filter;
        //filter
        RaycastHit2D[] hitObjects = new RaycastHit2D[20];
        grounded = (groundCollider.Cast(Vector2.zero, hitObjects) > 0) ? true : false;

        direction = new Vector3(0, 0, 0);

        if ((Input.GetKeyDown(moveRightKey) || Input.GetKeyDown(moveRightAlternativeKey)) && !isPreparingToJump)
        {
            facingRight = true;
        }
        if ((Input.GetKeyDown(moveLeftKey) || Input.GetKeyDown(moveLeftAlternativeKey)) && !isPreparingToJump)
        {
            facingRight = false;
        }

        if ((Input.GetKey(moveRightKey) || Input.GetKey(moveRightAlternativeKey)) && !isPreparingToJump)
        {
            moving = true;
        }
        else if ((Input.GetKey(moveLeftKey) || Input.GetKey(moveLeftAlternativeKey)) && !isPreparingToJump)
        {
            moving = true;
        }
        else
        {
            moving = false;
        }

        anim.SetBool("isMoving", moving);
        anim.SetBool("isGrounded", grounded);
        anim.SetBool("isHanging", hanging);

        if ((airControl && !grounded) || grounded)
        {
            transform.localScale = (facingRight ? new Vector3(1, 1, 1) : new Vector3(-1, 1, 1));
            direction           += (moving ? new Vector3(transform.localScale.x, 0, 0) : Vector3.zero);
        }

// =============== PUSH DEBUG ===================
        Debug.DrawLine(transform.position, transform.position + Vector3.right * 2f);
// ============ ENDOF PUSH DEBUG ================

        if (Input.GetKey(crouchKey) || Input.GetKey(crouchAlternativeKey))
        {
            currentMoveSpeed       = crouchSpeed;
            walkCollider.enabled   = false;
            crouchCollider.enabled = true;
        }
        else if (Input.GetKeyDown(pushKey) || Input.GetKeyDown(pushAlternativeKey))
        {
            RaycastHit2D hit = Physics2D.Raycast(transform.position, (facingRight) ? Vector3.right : Vector3.left, 2f, pushableLayers);
            if (hit != null)
            {
                PushableObject pushObject = hit.transform.gameObject.GetComponent <PushableObject>();

                if (pushObject != null)
                {
                    pushObject.Push(transform.position);
                    anim.SetTrigger("push");
                }
            }
        }
        else
        {
            currentMoveSpeed       = moveSpeed;
            walkCollider.enabled   = true;
            crouchCollider.enabled = false;

            if ((Input.GetKeyDown(jumpKey) || Input.GetKeyDown(jumpAlternativeKey)) && grounded)
            {
                isPreparingToJump = true;
                currentJumpForce  = minJumpForce;
                currentTime       = 0f;
                currentTicks      = 0f;
            }

            bool forceJump = false;

            if ((Input.GetKey(jumpKey) || Input.GetKey(jumpAlternativeKey)) && isPreparingToJump)
            {
                currentTime += Time.deltaTime;

                if (currentTime >= (jumpPrepareTime / numberOfTicks))
                {
                    currentJumpForce += (maxJumpForce - minJumpForce) / numberOfTicks;
                    currentTicks++;
                    //Debug.Log("TICK-TACK");
                    currentTime = 0f;
                }

                if (currentTicks == numberOfTicks)
                {
                    forceJump = true;
                }
            }

            if (((Input.GetKeyUp(jumpKey) || Input.GetKeyUp(jumpAlternativeKey)) && grounded && isPreparingToJump) || forceJump)
            {
                isPreparingToJump = false;
                isJumping         = true;
            }
        }
    }
 public void ReleaseObject()
 {
     currPushableObjectScript.Release();
     currPushableObjectScript = null;
 }
 // Start is called before the first frame update
 void Start()
 {
     objectScript = transform.parent.gameObject.GetComponent <PushableObject>();
 }