bool lineIntersecCircle(Vector3 ahead, Vector3 ahead2, CircleObs obstacle) { float distance1 = (obstacle._center - ahead).magnitude; float distance2 = (obstacle._center - ahead2).magnitude; return((distance1 <= obstacle._radius) || (distance2 <= obstacle._radius)); }
public CircleObs getClosetObstacle() { Vector3 ahead = this.transform.position + _currentVelocity.normalized * _maxAhead; Vector3 ahead2 = this.transform.position + _currentVelocity.normalized * _maxAhead * 0.5f; CircleObs mostThreatening = null; foreach (GameObject _obstacle in GameObject.FindGameObjectsWithTag("Obstacle")) { CircleObs circleObs = _obstacle.GetComponent <CircleObs>(); bool _isColide = lineIntersecCircle(ahead, ahead2, circleObs); if (_isColide) { if (mostThreatening == null) { mostThreatening = circleObs; } else { float distanceCurrent = (this.transform.position - mostThreatening._center).magnitude; float distanceCek = (this.transform.position - circleObs._center).magnitude; mostThreatening = distanceCek < distanceCurrent ? circleObs : mostThreatening; } } } return(mostThreatening); }
public KinematicData getCollideAvoid() { Vector3 ahead = this.transform.position + _currentVelocity.normalized * _maxAhead * 0.5f; CircleObs _ClosestObsCirle = getClosetObstacle(); KinematicData _SteeringOut = new KinematicData(); //lengkapi .... yang dibawah ini if (_ClosestObsCirle != null) { _SteeringOut._velocity = ahead - _ClosestObsCirle._center; if (_SteeringOut._velocity.magnitude > _maxAvoidanceForce) { _SteeringOut._velocity = _SteeringOut._velocity.normalized; _SteeringOut._velocity *= _maxAvoidanceForce; } } else { _SteeringOut._velocity = Vector3.zero; } return(_SteeringOut); }