How can I activate my script after wait half second ?

  private void FixedUpdate()
        {


            if (ProMouse.LeftButton.IsPressed && grapplingRope.Grappling)
            {


                grappleHolder.rotation = Quaternion.Lerp(grappleHolder.rotation, Quaternion.LookRotation(-(grappleHolder.position - _hit)), rotationSmooth * Time.fixedDeltaTime);


                var distance = Vector3.Distance(player.transform.position, _hit);
                if (!(distance >= minPhysicsDistance) || !(distance <= maxPhysicsDistance)) return;

// I want delay at right here. I want to activate other things after half second. Thanks for help

                player.playerRigidBody.velocity += pullForce * Time.fixedDeltaTime * yMultiplier * Mathf.Abs(_hit.y - player.transform.position.y) * (_hit - player.transform.position).normalized;
                player.playerRigidBody.velocity += pushForce * Time.fixedDeltaTime * player.transform.forward;



            }
            else
            {
                grappleHolder.localRotation = Quaternion.Lerp(grappleHolder.localRotation, Quaternion.Euler(0, 0, 0), rotationSmooth * Time.fixedDeltaTime);
            }
        }

You can either create your own timer and count the time difference to when you set it each frame, and activate your code after the desired amount of time has passed, or you can use Invoke to execute a method with some delay. Unity - Scripting API: MonoBehaviour.Invoke

That works. The doc rather enigmatically says, “For better performance and maintability, use Coroutines instead.” I don’t see why that’s really any better, but if you want to use a coroutine, one way would be like this:

private void FixedUpdate()
{
    if (ProMouse.LeftButton.IsPressed && grapplingRope.Grappling)
    {
        grappleHolder.rotation = Quaternion.Lerp(grappleHolder.rotation, Quaternion.LookRotation(-(grappleHolder.position - _hit)), rotationSmooth * Time.fixedDeltaTime);
        var distance = Vector3.Distance(player.transform.position, _hit);
        if (!(distance >= minPhysicsDistance) || !(distance <= maxPhysicsDistance)) return;

        StartCoroutine(SetVelocities(.5f));
    }
    else
    {
        grappleHolder.localRotation = Quaternion.Lerp(grappleHolder.localRotation, Quaternion.Euler(0, 0, 0), rotationSmooth * Time.fixedDeltaTime);
    }
}

private IEnumerator SetVelocities(float delay)
{
    yield return new WaitForSeconds(delay);

    player.playerRigidBody.velocity += pullForce * Time.fixedDeltaTime * yMultiplier * Mathf.Abs(_hit.y - player.transform.position.y) * (_hit - player.transform.position).normalized;
    player.playerRigidBody.velocity += pushForce * Time.fixedDeltaTime * player.transform.forward;
}

Coroutines are not synchronized with the physics loop, though, so changing a Rigidbody’s velocity with them might lead to unpredictable results in collision detection or other physics issues. To avoid that, I like Yoreki’s suggestion of a timer you maintain yourself. You could make a list of them and have each one associated with a method. On each FixedUpdate call, decrement the time remaining for each member of the list, and execute the associated methods for any members whose time remaining has reached zero (or less), then remove those members from the list. That way, any physics you do is still actually being done in FixedUpdate.

I solved problem thank you.