2013-03-18 6 views
0

Так что мне удалось изменить код, который я нашел для луча, чтобы мой враг двигался к координатам моей камеры первого лица. Тем не менее, мне нужно изменить способ, которым лучевое кастинг перемещает противника вокруг препятствий на моей сцене. Я немного запутался в переменных myTransform/transform/target.Изменение скрипта AI с raycasting в Unity

Так что это мой код;

var speed : float = 10.0; 
private var dir : Vector3; 
private var dirFull : Vector3; 
var target : Transform; 
var rotationSpeed = 3; 

var myTransform : Transform; 

function Awake() 
{ 
    myTransform = transform; 
} 


function Start() 
{ 
    target = GameObject.FindGameObjectWithTag("Player").transform; //Target the player 
} 

function FixedUpdate() 
{ 
    // the directional vector to the target 
    dir = (target - transform.position).normalized; 
    var hit : RaycastHit; 

    // more raycasts 
    var leftRay = transform.position + Vector3(-0.125, 0, 0); 
    var rightRay = transform.position + Vector3(0.125, 0, 0); 


    // check for forward raycast 
    if (Physics.Raycast(transform.position, transform.forward, hit, 5))/
    { 
    if (hit.transform != this.transform) 
    { 
     Debug.DrawLine (transform.position, hit.point, Color.white); 

     dir += hit.normal * 20; // 20 is force to repel by 
    } 
    } 


    // check for leftRay raycast 
    if (Physics.Raycast(leftRay, transform.forward, hit, 5)) 
    { 
    if (hit.transform != this.transform) 
    { 
     Debug.DrawLine (leftRay, hit.point, Color.red); 

     dir += hit.normal * 20; // 20 is force to repel by 
    } 
    } 


    // check for rightRay raycast 
    if (Physics.Raycast(rightRay, transform.forward, hit, 5)) 
    { 
    if (hit.transform != this.transform) 
    { 
     Debug.DrawLine (rightRay, hit.point, Color.green); 

     dir += hit.normal * 20; // 20 is force to repel by 
    } 
    } 

    // rotation 
var rot = Quaternion.LookRotation (dir); 

transform.rotation = Quaternion.Slerp (transform.rotation, rot, Time.deltaTime); 

//position 
transform.position += transform.forward * (2 * Time.deltaTime); // 20 is speed 
} 

Я почти уверен, только думаю, что нужно изменить это dir переменной так, что он использует новое преобразование кода. Но, как я уже сказал, меня путают с какой переменной использовать.

EDIT: Я понимаю, что мне нужно изменить код в нижней части обновления, чтобы он учитывал поворот, возникающий, когда препятствие встречается с помощью лучей. Вот почему я думаю, что это просто «дир» и «гниль», которые нужно изменить, а затем использовать в коде положения и вращения.

+0

Я предполагаю, что этот сценарий прикреплен к противнику, а не к игроку. Это верно? – RustyTheBoyRobot

+0

Да, он привязан к врагу. – TJBaldy

+0

Я только что разработал решение. Поставит его как ответ, когда мне позволено (я должен подождать 8 часов, прежде чем отправлять ответ на свой вопрос). – TJBaldy

ответ

0

Все, что я должен был изменить, чтобы получить эту работу, была строка кода;

dir = (target - transform.position).normalized; 

к ...

dir = target.position - myTransform.position; 

Так что я был прав, когда я понял, что это была переменная реж что необходимо изменение.

0

Основная часть функции FixedUpdate() служит для расчета стоимости вашего dir. Однако в конце есть комментарии, которые говорят, что код обновляет позицию, но они не используют рассчитанное значение dir. Я не могу проверить это, но мне кажется, что вам нужно изменить последнюю строку следующим образом:

transform.position += dir * (2 * Time.deltaTime); 

В настоящее время он стоит, этот код игнорирует позицию противника или игрока:

transform.position += transform.forward * (2 * Time.deltaTime); // 20 is speed 

Он просто пытается переместить врага «вперед», который определяется (в Unity documentation) как «Синяя ось преобразования в мировом пространстве».

Если у вас есть код, который вращает враг в направлении dir, похоже, что вам нужно переместить врага в этом направлении.

+0

Не думайте, что это так. Код движения/вращения работает нормально. Это код, который изменяет положение врага, когда он встречает препятствие, которое нуждается в изменении «dir + = hit.normal * 20» – TJBaldy

+0

Тогда где используется 'dir'? Ваш код raycast изменяет только 'dir'. Не имеет значения, какой * код вы используете для установки значения 'dir', если вы никогда не используете' dir'. – RustyTheBoyRobot

+0

Кроме того, как вы можете сказать, что «код движения/вращения работает нормально», если вы говорите, что код для перемещения по препятствиям не работает? – RustyTheBoyRobot

Смежные вопросы