private void HandleMovingInput(object sender, EventArgs e) { // AI obstacles avoiding (nikita) float maxDistance = 100f; RaycastHit hit; bool isLeftHit = false; bool isRightHit = false; bool isObstacleOnMyWay = false; bool isEnemyOnForward = false; bool isEnemyOnLeft = false; bool isEnemyOnRight = false; //вводим слои для обнаружения земли и для обнаружения подбираемых\уклоняемых сущностей на трассе LayerMask TrackEntityMask = LayerMask.GetMask("AICastedEntity"); LayerMask groundMask = LayerMask.GetMask("Ground"); LayerMask enemyMask = LayerMask.GetMask("Ship"); if (pilotModelView.ChechpointTarget != null) { // нормализуем вектор направления до чекпоинта, отсекаем ему Y составляющую Vector3 checkpointDirection = new Vector3((pilotModelView.ChechpointTarget - pilotModelView.transform.position).normalized.x, 0, (pilotModelView.ChechpointTarget - pilotModelView.transform.position).normalized.z) * 2f; Vector3 rightDirection = new Vector3(pilotModelView.transform.right.x, 0, pilotModelView.transform.right.z) * 10; Vector3 leftDirection = new Vector3(-pilotModelView.transform.right.x, 0, -pilotModelView.transform.right.z) * 10; //forward cast bool isLandCast = Physics.Raycast(pilotModelView.transform.position + (checkpointDirection + Vector3.up).normalized * 20, Vector3.down, out hit, maxDistance, groundMask); isLandCast = true; if (isLandCast) { // находим расстояние до рейкаста до земли float pilotToCastPointDistance = Vector3.Distance(pilotModelView.transform.position, hit.point) * 2; // смотрим есть ли противник спереди или по бокам isEnemyOnForward = Physics.BoxCast(pilotModelView.transform.position, pilotModelView.transform.lossyScale, hit.point, Quaternion.identity, pilotToCastPointDistance, enemyMask); //isEnemyOnLeft = Physics.BoxCast(pilotModelView.transform.position, pilotModelView.transform.lossyScale, leftDirection, // Quaternion.identity, pilotToCastPointDistance, enemyMask); //isEnemyOnRight = Physics.BoxCast(pilotModelView.transform.position, pilotModelView.transform.lossyScale, rightDirection, // Quaternion.identity, pilotToCastPointDistance, enemyMask); // смотрим есть ли препятствие на пути isObstacleOnMyWay = Physics.BoxCast(pilotModelView.transform.position, pilotModelView.transform.lossyScale / 2, hit.point, out hit, Quaternion.identity, pilotToCastPointDistance, TrackEntityMask); if (isObstacleOnMyWay) { if (hit.collider.tag.Equals("SlowPoint")) { isRightHit = Physics.BoxCast(pilotModelView.transform.position, pilotModelView.transform.lossyScale / 2, (hit.point + rightDirection).normalized, Quaternion.identity, pilotToCastPointDistance, TrackEntityMask); isLeftHit = Physics.BoxCast(pilotModelView.transform.position, pilotModelView.transform.lossyScale / 2, (hit.point + leftDirection).normalized, Quaternion.identity, pilotToCastPointDistance, TrackEntityMask); } } } if (isEnemyOnForward && shipModelView.PrimaryAbility != null) { HandleActionInput(this, Vector3.forward); } //if(isEnemyOnLeft && shipModelView.PrimaryAbility != null) // HandleActionInput(this, Vector3.left); //if(isEnemyOnRight && shipModelView.PrimaryAbility != null) // HandleActionInput(this, Vector3.right); // создание вектора движения и поворота float moveH; if (isObstacleOnMyWay && shipModelView.autoBoostHelper == false) { if (isRightHit == false) { moveH = Vector3.SignedAngle(shipModelView.transform.forward, shipModelView.transform.forward + rightDirection, Vector3.up); } else if (isLeftHit == false) { moveH = Vector3.SignedAngle(shipModelView.transform.forward, shipModelView.transform.forward + leftDirection, Vector3.up); } else { if (runOutDirection == 2) { runOutDirection = UnityEngine.Random.Range(0, 2); } if (runOutDirection == 0) { moveH = Vector3.SignedAngle(shipModelView.transform.forward, shipModelView.transform.forward + leftDirection * 4, Vector3.up); } else { moveH = Vector3.SignedAngle(shipModelView.transform.forward, shipModelView.transform.forward + rightDirection * 4, Vector3.up); } } } else { moveH = Vector3.SignedAngle(shipModelView.transform.forward, aimOffset - shipModelView.transform.position, Vector3.up); } Vector3 direction = new Vector3(moveH / 30, 0, aimInterest); shipModelView.SteeringInput(direction); Debug.DrawLine(shipModelView.transform.position, aimOffset); } }
private void HandleMovingInput(object sender, Vector3 direction) { shipModelView.SteeringInput(direction); directionArrow.ShipDirection = shipModelView.transform; }