Проблемы с рейкастированием в Unity 3

Я пытаюсь написать свой ИИ простым способом. ИИ делает рейкаст спереди, слева и справа от него. Затем он принимает случайное направление таким образом, который не содержит элемента «Граница».

Во-первых, мой Update() проверяет, не пора ли вычислить новое направление. Если это так, он вычисляет новое направление, затем движется к нему.

Я использую следующий код для перемещения:

Debug.DrawLine(transform.position, transform.position + transform.forward, Color.yellow);
Debug.DrawLine(transform.position, transform.position + transform.right, Color.yellow);
Debug.DrawLine(transform.position, transform.position - transform.right, Color.yellow);
    //DEBUGS START AND END POSITION ARE CORRECT

var startTime;
if (Time.time > nextUpdate) {
    Debug.Log("New check");

    var dirWay = MoveDirection();
    //if (dirWay == 0)
        //rot = Quaternion.Euler(0, 0, 0);
    if (dirWay == 1) {
        rot = Quaternion.Euler(0, 90, 0);
    }
    if (dirWay == 2) {
        rot = Quaternion.Euler(0, -90, 0);
    }
    if (dirWay == 3) { //backwards
        rot = Quaternion.Euler(0, 180, 0);
    }
    nextUpdate = Time.time + walkTime; //for example, 2: Every 2 seconds an update
    direction.y = 1;
    direction.y = 1.5 - transform.position.y;
    transform.rotation = transform.rotation * rot;
    transform.position = transform.position + transform.forward + transform.forward;
    //Plus 2 * transform.forward because it moves 2 places
} 

Функция MoveDirection проверяет наличие препятствий с помощью рейкастинга. Мой ИИ перемещается на правильное расстояние в правильное время, но проходит сквозь стены. Это означает, что мой raycasting неверен. Я использую следующий код:

var obstacles = ["Border", "Boundary", "BoundaryFlame"]; 
var frontAvailable = true;
var leftAvailable = true;
var rightAvailable = true;
var hitFront: RaycastHit;
if (Physics.Raycast(transform.position, transform.position + transform.forward, hitFront, 1.9)) {
    for (var i = 0; i < obstacles.length; i++)
    {
        if (hitFront.collider.gameObject.name.IndexOf(obstacles[i]) > -1)
        {
            frontAvailable = false;
        }
    }
}
var hitLeft: RaycastHit;
if (Physics.Raycast(transform.position, transform.position - transform.right, hitLeft, 1.9)) {
    for (var j = 0; j < obstacles.length; j++)
    {
        if (hitLeft.collider.gameObject.name.IndexOf(obstacles[j]) > -1)
        {
            leftAvailable = false;
        }
    }
}
var hitRight: RaycastHit;
if (Physics.Raycast(transform.position, transform.position + transform.right, hitRight, 1.9)) {
    for (var k = 0; k < obstacles.length; k++)
    {
        if (hitRight.collider.gameObject.name.IndexOf(obstacles[k]) > -1)
        {
            rightAvailable = false;
        }
    }
}

Итак, прав ли я, что когда я хочу проверить 2 единицы перед ИИ (transform.forward с точки зрения ИИ, а не глобального представления!), я должен использовать: Physics.Raycast(transform.position, transform.position + transform.forward, hitFront, 1.9) ?


person Joetjah    schedule 26.01.2013    source источник


Ответы (1)


http://docs.unity3d.com/Documentation/ScriptReference/Physics.Raycast.html

Итак, прав ли я, что когда я хочу проверить 2 единицы перед ИИ (transform.forward с точки зрения ИИ, а не глобального представления!), я должен использовать: Physics.Raycast(transform.position, transform. position + transform.forward, hitFront, 1.9) ?

у вас должен быть Physics.Raycast(transform.position,transform.forward,hitFront, 1.9);

person Shredder2500    schedule 01.02.2013
comment
Вы не можете умножить это. Я пробовал использовать Vector3.Scale, но это тоже бесполезно. - person Joetjah; 25.02.2013
comment
о, извините, я действительно не думал. во-первых, вам действительно не нужен transform.position, вам нужен только transform.forward * a float. это просто поместит позицию прямо перед вашим преобразованием, как бы далеко ни было значение с плавающей запятой - person Shredder2500; 03.03.2013
comment
Отредактировал ответ на правильный. transform.forward в основном то же самое, что и transform.rotation * vector3.forward, а vector3.forward — то же самое, что и new Vector3(0,0,1) - person Shredder2500; 03.03.2013
comment
Я попробую это вечером. Звучит разумно! - person Joetjah; 04.03.2013