Unity: Скрипт EvasiveManeuver.cs для обучающего проекта Space Shooter tutorial

Страница обучающего курса: Space Shooter tutorial
Курс написан для Unity 4.x, поэтому для Unity 5.x пришлось переписывать почти все скрипты. Кое-что я добавил свое (например поддержку игрового контроллера и «режим бога», чтобы легче было отлаживать). Режим отладки включается только чекбоксом из Unity Editor, при этом в консоль выводятся данные через Debug.Log. Помимо этого в игре реализована Пауза. Отдельное замечу, что все исправленные скрипты работают с расширенной версией урока, поэтому скорее всего не подойдут для первых уроков, где еще нет некоторых элементов типа вражеских кораблей, подвижного фона и т.п.

 

using UnityEngine;
using System.Collections;

public class EvasiveManeuver : MonoBehaviour
{
    public Boundary boundary;
    public float tilt;
    public float dodge;
    public float smoothing;
    public Vector2 startWait;
    public Vector2 maneuverTime;
    public Vector2 maneuverWait;

    private float currentSpeed;
    private float targetManeuver;

    private Rigidbody rb;

    private Transform playerTransform;

    GameObject go;

    void Start ()
    {
        rb = GetComponent<Rigidbody>();
        currentSpeed = rb.velocity.z;

        go = GameObject.FindGameObjectWithTag("Player");
        if (go != null)
        {
            playerTransform = go.transform;
            StartCoroutine(Evade());
        }
    }

    IEnumerator Evade ()
    {
        yield return new WaitForSeconds (Random.Range (startWait.x, startWait.y));
        while (true)
        {
            if (playerTransform != null)
            {
                targetManeuver = playerTransform.position.x;
            }
            yield return new WaitForSeconds (Random.Range (maneuverTime.x, maneuverTime.y));
            targetManeuver = 0;
            yield return new WaitForSeconds (Random.Range (maneuverWait.x, maneuverWait.y));
        }
    }
    
    void FixedUpdate ()
    {
        float newManeuver = Mathf.MoveTowards(rb.velocity.x, targetManeuver, Time.deltaTime * smoothing);
        rb.velocity = new Vector3(newManeuver, 0.0f, currentSpeed);
        rb.position = new Vector3
            (
            Mathf.Clamp(rb.position.x, boundary.xMin, boundary.xMax),
            0.0f,
            Mathf.Clamp(rb.position.z, boundary.zMin, boundary.zMax)
            );
        rb.rotation = Quaternion.Euler(0, 0, rb.velocity.x * -tilt);
    }
}