float GetDistanceToInteractable(Vector2 interPos, Controller2D boxController) { float dist = 0; if ((interPos.y - boxController.box.bounds.size.y / 2) < (transform.position.y - controller.box.bounds.size.y / 2)) { //chacter staat hoger castInfo i = controller.HorizontalCast(Mathf.Abs(transform.position.x - interPos.x) * Mathf.Sign(interPos.x - transform.position.x), transform.position, pushObject); if (i.hasHit) { dist = i.hitDistance; } } else { //box staat hoger castInfo i = boxController.HorizontalCast(Mathf.Abs(interPos.x - transform.position.x) * Mathf.Sign(transform.position.x - interPos.x), interPos, gameObject); if (i.hasHit) { dist = -i.hitDistance; } } return(dist); }
public castInfo VerticalCast(float distance, Vector2 origin) { float s = skinWidth * 2; castInfo info = new castInfo(); info.hitNormal = Vector2.up; info.hitDistance = distance; Vector2 size = (Vector2)box.bounds.size - (Vector2.one * s * 2); Vector2 direction = Vector2.up * Mathf.Sign(distance); RaycastHit2D hit = Physics2D.BoxCast(origin, size, 0, direction, Mathf.Abs(distance) + s, collisionMask); if (hit) { info.hitDistance = (hit.distance - s) * Mathf.Sign(distance); info.hitObject = hit.transform.gameObject; info.hasHit = true; info.hitNormal = hit.normal; } return(info); }
void Update() { if (controller.collisions.above || controller.collisions.below) { if (controller.collisions.slidingDownMaxSlope) { velocity.y += controller.collisions.slopeNormal.y * -gravity * Time.deltaTime; } else { velocity.y = 0; } } transform.localScale = (Mathf.Sign(velocity.x) * scale.x * Vector2.right) + scale.y * Vector2.up; Vector2 input = new Vector2(Mathf.Sign(target.transform.position.x - transform.position.x), 0); velocity.x = input.x * moveSpeed; velocity.y -= gravity; castInfo i = controller.HorizontalCast((velocity.x * 3) * Time.deltaTime, transform.position); if (i.hasHit && Vector2.Angle(i.hitNormal, Vector2.up) > controller.maxAngle) { velocity.y = jumpVelocity; } controller.Move(velocity * Time.deltaTime); }
void PushBox(GameObject box, castInfo info) { Controller2D boxController = box.GetComponent <Controller2D>(); if (Input.GetAxisRaw("Fire1") != 0 && controller.VerticalCast(-1, transform.position).hasHit&& box != null) { float dist = GetDistanceToInteractable(box.transform.position, boxController); if (Mathf.Abs(Mathf.Abs(dist) - distToInteractble) < 0.1f && velocity.x != 0) { if (Mathf.Sign(transform.position.x - box.transform.position.x) == Mathf.Sign(velocity.x)) { //Pulling controller.Move(velocity * Time.deltaTime); float m = GetDistanceToInteractable(box.transform.position, boxController); if (m == 100) { DisconectFromInteractable(); return; } boxController.Move(Vector2.right * -(m - (distToInteractble * Mathf.Sign(m))) - (Vector2.up * Time.deltaTime)); } else { //Pusing boxController.Move((Vector2.right * velocity.x - Vector2.up) * Time.deltaTime); float m = GetDistanceToInteractable(box.transform.position, boxController); if (m == 100) { DisconectFromInteractable(); return; } controller.Move(((Vector2.right * (m - (distToInteractble * Mathf.Sign(m)))) + (Vector2.up * velocity.y * Time.deltaTime))); } } if (dist != distToInteractble) { float d = (Mathf.Abs(dist) - distToInteractble) * 30; controller.Move(((Vector2.right * Mathf.Sign(box.transform.position.x - transform.position.x) * d) - Vector2.up * gravity) * Time.deltaTime); } } else { Debug.Log("kak"); DisconectFromInteractable(); } }
// Update is called once per frame void Update() { if (controller.collisions.above || controller.collisions.below) { if (controller.collisions.slidingDownMaxSlope) { velocity.y += controller.collisions.slopeNormal.y * -gravity * Time.deltaTime; } else { velocity.y = 0; } } Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); velocity.x = input.x * moveSpeed; velocity.y -= gravity; castInfo side = controller.HorizontalCast(checkDistance * Mathf.Sign(velocity.x), transform.position); if (side.hitObject != null && Input.GetAxisRaw("Fire1") != 0) { if (side.hitObject.tag == "box") { pushObject = side.hitObject; } } if (pushObject != null) { PushBox(pushObject, side); return; } if (Input.GetAxisRaw("Jump") != 0 && controller.collisions.below) { velocity.y = jumpVelocity; } controller.Move(velocity * Time.deltaTime); }
public castInfo HorizontalCast(float distance, Vector2 origin, GameObject searchObject) { float s = skinWidth * 2; castInfo info = new castInfo(); info.hitNormal = Vector2.up; info.hitDistance = distance; info.hasHit = false; Vector2 size = (Vector2)box.bounds.size - (Vector2.one * s * 2); Vector2 direction = Vector2.right * Mathf.Sign(distance); RaycastHit2D[] hits = Physics2D.BoxCastAll(origin, size, 0, direction, Mathf.Abs(distance) + s, collisionMask); RaycastHit2D hit = new RaycastHit2D(); bool hasHit = false; for (int i = 0; i < hits.Length; i++) { if (hits[i].transform.gameObject == searchObject) { hit = hits[i]; hasHit = true; break; } } if (hasHit) { info.hitDistance = (hit.distance - s) * Mathf.Sign(distance); info.hitObject = hit.transform.gameObject; info.hasHit = true; info.hitNormal = hit.normal; } return(info); }