Home > Blockchain >  OnTriggerStay is one physics update late, and it caused object to cancel its velocity
OnTriggerStay is one physics update late, and it caused object to cancel its velocity

Time:04-20

I have a character, he can move and jump. I need to check if it is grounded, so I made a trigger box collider as a characters component, and I use OnTriggerStay and OnTriggerExit to check if it is grounded, but when I use OnTriggerStay (it fixes with OnTriggerEnter, but I need to use OnTriggerStay), the exit of collision with object that the character is standing on is detected one physics update late, and when it is detected, the upward velocity appears to become 0, and the character starts falling. Here is my code:

using System.Collections;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float speed = 4.0f;
    public float jumpSpeed = 8.0f;
    private bool doJump = false;
    private Rigidbody rb;
    bool isGrounded = false;
    private float x, z;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        x = Input.GetAxis("Horizontal");
        z = Input.GetAxis("Vertical");
        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartCoroutine(Jump());
        }
    }

    void FixedUpdate()
    {
        if (isGrounded)
        {
            //this is movement
            rb.velocity = (transform.right * x) * speed * Time.fixedDeltaTime   (transform.forward * z) * speed * Time.fixedDeltaTime;
        }
        if (isGrounded && doJump)
        {
            doJump = false;
            rb.AddForce(0, jumpSpeed, 0, ForceMode.VelocityChange);
        }
    }

    IEnumerator Jump()
    {
        //need the coroutine to make the player jump even if space pressed a bit earlier than
        //the character landed
        doJump = true;
        yield return new WaitForSeconds(0.15f);
        doJump = false;
    }

    private void OnTriggerStay(Collider other)
    {
        if (other != this.gameObject)
        {
            isGrounded = true;
        }
    }
    private void OnTriggerExit(Collider other)
    {
        if (other != this.gameObject)
        {
            isGrounded = false;
        }
    }
}

I tried to not use coroutine for jumping but it doesn't help. What helps is:

  1. Deleting the movement line;
  2. Using OnTriggerEnter instead of OnTriggerStay;

CodePudding user response:

I am not sure but I think if you initialize your physics component in the Start function instead of the Awake function then it might work.

CodePudding user response:

I think you are trying to implement "Pre_Update" function, I have found this solution maybe you can use it:

https://answers.unity.com/questions/614343/how-to-implement-preupdate-function.html

  • Related