1
\$\begingroup\$

2d up down platformer. Character has 2 Rays(one left one right) going down, when either Ray's hit distance hits between -1 and 1 it should call a function which will change character direction from down to up. Works 1, 2, 3, 4, sometimes 6, sometimes into the teens times then character goes through the obstacle got placing character over an obstacle and hitting play with no changes gave a different amount of time before falling through the obstacle. I have tried changing the Time.time in fixedUpdate, placed movement in last update, varying degrees of success, I will post the current version of code, but it has gone through several revisions any ideas accepted. thanks

[RequireComponent (typeof (BoxCollider2D))]
public class YowiController : MonoBehaviour {

  BoxCollider2D yowiCollider;
  Vector2 rayDir, leftRay, rightRay, rayOrigin;

  public AudioSource jumpSound;

  bool jump;
  bool bounce;

  public float upTime;
  float looseTime;

  float bounceCount = 0;
  float gravity = 3f;
  float bounceHeight = 5f;
  float movementSpeed = 2f;
  float bounceTime = .03f;

  void Start () {
    yowiCollider = GetComponent<BoxCollider2D> ();
    rayDir = new Vector2 (0, -1);
    jump = false;
    bounce = false;
  }

  void Update () {
  }

  private void LateUpdate () {
    movement ();
  }

  void movement () {
    drawRays ();
    if (Input.GetKey (KeyCode.RightArrow)) {
      transform.Translate (Vector2.right * Time.deltaTime * movementSpeed);
    }
    if (Input.GetKey (KeyCode.LeftArrow)) {
      transform.Translate (Vector2.left * Time.deltaTime * movementSpeed);
    }
    if (!bounce) {
      transform.Translate (Vector2.down * Time.deltaTime * gravity);
      gravity += .02f;
    } else {
      Bounce ();
    }
  }

  void Bounce () {
    transform.Translate (Vector2.up * Time.deltaTime * bounceHeight);
    looseTime = bounceTime / 2;
    if (upTime < looseTime) {
      bounceHeight += .01f;
      looseTime--;
    } else {
      bounceHeight -= .01f;
    }
  }


  void drawRays () {
    Bounds bounds = yowiCollider.bounds;
    leftRay = new Vector2 (bounds.min.x, bounds.min.y);
    rightRay = new Vector2 (bounds.max.x, bounds.min.y);
    RaycastHit2D leftHit = Physics2D.Raycast (leftRay, rayDir * -1, .05f, 1 << 9);
    RaycastHit2D rightHit = Physics2D.Raycast (rightRay, rayDir * -1, .05f, 1 << 9);
    if (leftHit || rightHit) {
      RayHit (leftHit, rightHit);
    }
  }

  void RayHit (RaycastHit2D leftHit, RaycastHit2D rightHit) {
    if ((leftHit.distance < 1.1f) && (leftHit.distance > -1.1f)) {
      bounce = true;
      StartCoroutine (Bouncing ());
    } else if (rightHit.distance < 1.1f && rightHit.distance > -1.1f) {
      bounce = true;
      StartCoroutine (Bouncing ());
    } else {
      print ("No Joy");
    }
  }

  IEnumerator Bouncing () {
    yield return new WaitForSeconds (bounceTime);
    bounce = false;
  }
}
\$\endgroup\$
  • \$\begingroup\$ You question is very cryptic and hard to read, could you please make complete sentences, this would help us understand the issue. \$\endgroup\$ – Vaillancourt Mar 16 '18 at 0:42
  • \$\begingroup\$ The ray does not consistently hit or miss the object. Place the player above the object with a downward velocity and hit play sometimes the ray sees the obstacle sometimes it doesn't. \$\endgroup\$ – hesitatetowonder Mar 17 '18 at 4:21
0
\$\begingroup\$

At one point I tried switching the rays to the sprite(didn't work well) instead of the collider, so I move the setting the rays origins to start, this had the consequence of the rays not moving at all from their origin. Moved the origin to update and added a second set of rays in a separate function as a "backup". This seemed to do the trick, I commented out the second set of rays function and tested for 30 minutes with no misses, this is the updated code.

[RequireComponent (typeof (BoxCollider2D))]

public class YowiTest : MonoBehaviour {

BoxCollider2D yowiCollider;
RaycastHit2D firstLeftHit, firstRightHit;
RaycastHit2D secondLeftHit, secondRightHit;

Vector2 firstLeftRay, firstRightRay;
Vector2 secondLeftRay, secondRightRay;
Vector2 rayOrigin, velocity, rayDown;

Bounds bounds;

float midPoints;
float gravity = -.06f;
float movementSpeed = .01f;
float jump = .05f;

void Start () {
    yowiCollider = GetComponent<BoxCollider2D> ();
    rayDown = new Vector2 (0, -1);
    midPoints = (bounds.max.x - bounds.min.x) / 4;
}

void Update () {
    bounds = yowiCollider.bounds;
    movement ();
    drawRaysOne ();
    //drawRaysTwo ();
}

void movement () {
    Vector2 input = new Vector2 (Input.GetAxisRaw ("Horizontal"), Input.GetAxisRaw ("Vertical"));
    velocity.x = input.x * movementSpeed;
    velocity.y += gravity * Time.deltaTime;
    transform.Translate (velocity);
}

void drawRaysOne () {
    firstLeftRay = new Vector2 (bounds.min.x, bounds.min.y);
    firstRightRay = new Vector2 (bounds.max.x, bounds.min.y);
    firstLeftHit = Physics2D.Raycast (firstLeftRay, rayDown, .1f, 1 << 9);
    firstRightHit = Physics2D.Raycast (firstRightRay, rayDown, .1f, 1 << 9);
    Debug.DrawRay (firstRightRay, rayDown, Color.white);
    Debug.DrawRay (firstLeftRay, rayDown, Color.white);
    if (firstRightHit || firstLeftHit) {
        print ("First ray hit");
        velocity.y = jump;
    }
}

void drawRaysTwo () {
    secondLeftRay = new Vector2 (bounds.min.x + midPoints, bounds.min.y);
    secondRightRay = new Vector2 (bounds.max.x - midPoints, bounds.min.y);
    secondLeftHit = Physics2D.Raycast (secondLeftRay, rayDown, .1f, 1 << 9);
    secondRightHit = Physics2D.Raycast (secondRightRay, rayDown, .1f, 1 << 9);
    Debug.DrawRay (secondLeftRay, rayDown, Color.blue);
    Debug.DrawRay (secondRightRay, rayDown, Color.blue);
    if (secondRightHit || secondLeftHit) {
        print ("Second ray hit");
        velocity.y = jump;
    }
}

}

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.