public override ObstacleHit Hit(Vector3 hitPoint, Vector3 direction, Vector3 hitNormal) { ObstacleHit oHit = new ObstacleHit(); oHit.freezeBall = true; LevelManager.Instance.KillBall(); return(oHit); }
public override ObstacleHit Hit(Vector3 hitPoint, Vector3 direction, Vector3 hitNormal) { ObstacleHit oHit = new ObstacleHit(); oHit.newDirection = hitNormal; oHit.newPosition = hitPoint; return(oHit); }
/// <summary> /// The default function that will be called if the object the ball collided with doesn't have an obstacle script. /// </summary> /// <param name="hitPoint"></param> /// <param name="direction"></param> /// <returns></returns> ObstacleHit DefaultObstacleHit(Vector3 hitPoint, Vector3 direction, Vector3 hitNormal) { ObstacleHit oHit = new ObstacleHit(); oHit.newDirection = Vector3.Reflect(direction, hitNormal); oHit.newPosition = hitPoint; return(oHit); }
public override ObstacleHit Hit(Vector3 hitPoint, Vector3 direction, Vector3 hitNormal) { ObstacleHit oHit = new ObstacleHit(); oHit.newDirection = direction; Vector3 localHit = transform.InverseTransformPoint(hitPoint); oHit.newPosition = pairedPortal.TransformPoint(localHit) + oHit.newDirection * 0.1f; return(oHit); }
private void OnTriggerEnter(Collider other) { if (other.CompareTag("Obstacle")) { ObstacleHit?.Invoke(other); } if (other.CompareTag("Coin")) { var coin = other.GetComponent <Coin>(); CoinHit?.Invoke(coin.value); other.gameObject.SetActive(false); AudioManager.Instance.PlaySfx(coin.gem ? "Gem" : "Coin"); FXManager.Instance.PlayFX(coin.gem ? "GemFX" : "CoinFX", coin.transform.position); FXManager.Instance.PlayFX("ValueFX", coin.transform.position + new Vector3(0, 0.2f, 0), $"+{coin.value}"); } }
/// <summary> /// Get the hit data when the line collides with any objects. /// </summary> /// <param name="collidedObstacle"></param> /// <param name="hitPoint"></param> /// <param name="direction"></param> /// <param name="hitNormal"></param> /// <returns></returns> ObstacleHit GetLineObstacleHit(Collider2D collidedObstacle, Vector3 hitPoint, Vector3 direction, Vector3 hitNormal) { Obstacle o = collidedObstacle.GetComponent <Obstacle>(); if (o) { if (o.GetType() == typeof(OKiller) || o.GetType() == typeof(OPortal)) { ObstacleHit oHit = new ObstacleHit(); oHit.freezeBall = true; return(oHit); } return(o.Hit(hitPoint, direction, hitNormal)); } else { return(DefaultObstacleHit(hitPoint, direction, hitNormal)); } }
void PathDrawing(Vector3 initialDirection) { List <Vector3> pathPoints = new List <Vector3>(); Collider2D lastCollider = null; Vector3 curDirection = initialDirection; Vector3 curOriginPos = transform.position; float remainingDistance = maxPathLength; int iterations = 0; while (remainingDistance > 0) { pathPoints.Add(curOriginPos); RaycastHit2D[] hits = Physics2D.CircleCastAll(curOriginPos, radius, curDirection, remainingDistance, lm); RaycastHit2D hit = new RaycastHit2D(); for (int j = 0; j < hits.Length; j++) { if (hits[j].collider != lastCollider) { hit = hits[j]; break; } } Collider2D hitCollider = hit.collider; //If this ray hit an object then save the new info to calculate the next line segment. if (hitCollider != null && hitCollider != lastCollider) { ObstacleHit oHit = GetLineObstacleHit(hitCollider, hit.centroid, curDirection, hit.normal); if (oHit.freezeBall == true) { curOriginPos = hit.point; pathPoints.Add(curOriginPos); break; } curOriginPos = oHit.newPosition; curDirection = oHit.newDirection; lastCollider = hit.collider; remainingDistance -= hit.distance; } //If this ray didn't hit an object, then end the line here. else { //Add the last point (in air, since they ray didn't hit anything). pathPoints.Add(curOriginPos + curDirection * remainingDistance); remainingDistance = 0; break; } iterations++; if (iterations > 20) { Debug.Log("Too many iterations"); break; } } //Draw the path int pointsCount = pathPoints.Count; pathLine.positionCount = pointsCount; pathLine.SetPositions(pathPoints.ToArray()); }
void Traveling() { lastPos = transform.position; transform.Translate(direction * speed * Time.deltaTime); //Debug.DrawLine(lastPos, transform.position); RaycastHit2D[] hits = Physics2D.CircleCastAll(lastPos, radius, direction, Vector3.Distance(lastPos, transform.position), lm); RaycastHit2D hit = new RaycastHit2D(); for (int i = 0; i < hits.Length; i++) { if (hits[i].collider != ignoredCollider) { hit = hits[i]; break; } } Collider2D hitCollider = hit.collider; if (hitCollider != null && hitCollider != ignoredCollider) { CheckPoint cp = hitCollider.GetComponent <CheckPoint>(); if (cp != null) { PlaceOnCP(cp); //A check point was hit. LevelManager.Instance.CheckPointReached(cp); } else { ObstacleHit oHit = GetBallObstacleHit(hitCollider, hit.centroid, direction, hit.normal); if (!oHit.freezeBall) { bool stuck = StuckCheck(oHit.newPosition); lastHitPos = oHit.newPosition; if (!stuck) { transform.position = oHit.newPosition; Shoot(oHit.newDirection); } ignoredCollider = hitCollider; PCamera.Instance.Shake(0.025f, 0.05f); GameObject cPS = Instantiate(collisionPS); cPS.transform.position = hit.point; cPS.transform.forward = hit.normal; } else { traveling = false; } } } }
public virtual ObstacleHit Hit(Vector3 hitPoint, Vector3 direction, Vector3 hitNormal) { ObstacleHit oHit = new ObstacleHit(); return(oHit); }