Тема: AI в Unity3D
Показать сообщение отдельно
Старый 04.11.2011, 23:40   #1
pie
ПроЭктировщик
 
Аватар для pie
 
Регистрация: 04.11.2011
Сообщений: 176
Написано 19 полезных сообщений
(для 64 пользователей)
AI в Unity3D

Итак. Использовал Ваш урок на сайт как основу. Перевел код на JavaScripts. Вот что получилось.

// Make sure there is always a character controller
@script RequireComponent (CharacterController);

// скорость ходьбы и скорость поворота в секунду
var moveSpeed : float = 2;
var turnSpeed : float = 90;

private var _controller : CharacterController;
private var _thisTransform : Transform;
private var _playerTransform : Transform;

function Start()
    {
        // Получаем контроллер
        _controller = GetComponent(CharacterController);

        // Получаем компонент трансформации объекта, к которому привязан данный компонент
        _thisTransform = transform;

        // Получаем компонент трансформации игрока
        if (_playerTransform == null && GameObject.FindWithTag("Player"))
			_playerTransform = GameObject.FindWithTag("Player").transform;
    }

// Все что связано с физикой выполняем в FixedUpdate
function Update()
    {
        // направление на игрока
        var playerDirection : Vector3 = (_playerTransform.position - _thisTransform.position).normalized;

        // угол поворота на игрока
        var angle : float = Vector3.Angle(_thisTransform.forward, playerDirection);

        // максимальный угол поворота на текущем кадре
        var maxAngle : float = turnSpeed * Time.deltaTime;

        // Вычисляем прямой поворот на игрока
        var rot : Quaternion = Quaternion.LookRotation(_playerTransform.position - _thisTransform.position);

        // поворачиваем врага на игрока с учетом скорости поворота
        if (maxAngle < angle)
        {
            _thisTransform.rotation = Quaternion.Slerp(_thisTransform.rotation, rot, maxAngle / angle);
        }
        else
        {
            _thisTransform.rotation = rot;
        }

        // если дистанция до игрока больше трех метров
        if (Vector3.Distance(_playerTransform.position, _thisTransform.position) > 3.0f)
        {
            // двигаемся к игроку
            _controller.Move(_thisTransform.forward * moveSpeed * Time.deltaTime);
        }
        else // если меньше или равна трем метрам
        {
            // здесь например стреляем в игрока
        }

        // гравитация
        _controller.Move(Vector3.down * 10.0f * Time.deltaTime);
    }
Вопрос в следующем. Как можно убрать что бы enemy не поворачивался к игроку, как бы, "вверх-вниз"
(Offline)
 
Ответить с цитированием