Страница 1 из 1

Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 02 июл 2012, 14:22
Good1101
Забавы ради написал скрипт для обхода препятствий ботом.
Реализован выбор кратчайшего пути при выборе маршрута для обхода препятствия.
Соответственно кубик заранее маршрута не знает и определяет его сам и корректирует при возникновении на пути препятствия.

HTML код для вашего блога :
Код: Выделить всё
<script language='javascript' type="text/javascript"> document.write("<iframe marginheight='0' src='http://unity3d.ru/distribution/player.php?url=http://gets.elitno.net/WebPlayer.unity3d&w=500&h=500&t=true&preview=1' height='"+(500+30)+"' width='500' frameborder='0' scrolling='no'></iframe>"); </script>


а вот сам скрипт
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class IISoldie : MonoBehaviour
{
    public Transform finih;
    RaycastHit Hit;
    bool stena,  stenaTime;
    Vector3 PovorotDlaObxoda;
    Transform TargetPregrada;
    Vector3 NapravlenieLy4a;
    public Transform[] ForvardRay;
    public Transform[] LeftRay;
    public Transform[] RightRay;
    Transform[] pointRay;
    int distansRay = 3;
    public float speedCube = 3;
    float timeFlag;

    // Use this for initialization
    void Start()
    {

    }
    void Update()
    {
        Debug.Log(Vector3.Distance(finih.position, transform.position));
        //непрерывное движение куба пока то не достигнет цели
        if (Vector3.Distance(finih.position, transform.position) > 3)
        {
            transform.position += transform.forward * speedCube * Time.deltaTime;
        }
        if (!stena)
        {
            //дебаг линия от куба к цели
            Debug.DrawLine(finih.position, transform.position, Color.red);
            //поворот в направлении основной цели
            transform.rotation = Quaternion.Slerp(transform.localRotation, Quaternion.LookRotation(finih.position - transform.position), Time.deltaTime * 2f);
            NapravlenieLy4a = transform.forward;
            pointRay = ForvardRay;
            distansRay = 2;
        }
        else
        {
            // меняем направление луча в случае запуска опции обхода преграды
            NapravlenieLy4a = OptionRay(TargetPregrada, transform);
            //меняем точки пускания лучей на самые ближние к преграде
            pointRay = NapravlenieLy4a == -transform.right ? LeftRay : RightRay;
            distansRay = 4;
        }
        byte rayIntPoint = 0;
        for (int i = 0; i < pointRay.Length; i++)
        {
            //лучи в дебаге
            Debug.DrawRay(pointRay[i].position, NapravlenieLy4a, Color.green);
            //пускаем лучи из выбранных точек
            if (Physics.Raycast(pointRay[i].position, NapravlenieLy4a, out Hit, distansRay))
            {
                if (NapravlenieLy4a == transform.forward)
                {
                    stena = true;
                    TargetPregrada = Hit.transform;
                    //поворачиваем наш кубик к ближайшему краю преграды
                    transform.localRotation = Quaternion.Euler(OptionDirection(TargetPregrada,transform));
                }
                else stena = true;
                break;
            }
            else if (NapravlenieLy4a != transform.forward && !stenaTime )
            {
                rayIntPoint++;
                if (rayIntPoint >= pointRay.Length)
                {
                    //разворачиваем кубик в исходное положение и даем ему 1 секунду чтобы пройти мимо преграды и не цеплятся за края,
                    //далее снова включаем курс на конечную цель
                    timeFlag = Time.time;
                    stenaTime = true;
                    Vector3 povorot = TargetPregrada.rotation.eulerAngles;
                    transform.localRotation = Quaternion.Euler(povorot);
                }
            }
        }
        if (timeFlag + 1 < Time.time && stenaTime)
        {
            stenaTime = false;
            stena = false;
        }  
    }
    //выбор направления обхода препятствия.
    Vector3 OptionDirection(Transform block, Transform myTransform)
    {
      Vector3 vec =  block.transform.rotation.eulerAngles;
      vec.y  = block.transform.position.x < myTransform.position.x ? vec.y += 90 : vec.y -= 90;
      return vec;
    }
    //выбор направлния лучей
   Vector3  OptionRay(Transform block, Transform myTransform)
    {
       Vector3 vec;
     return  vec = TargetPregrada.position.x < myTransform.position.x ? -myTransform.right : myTransform.right;
    }
}

 

И сама сценка прилагается.
Предлагаю если кому то также нечем заняться как и мне, вместе усовершенствовать ИИ и сделать например поиск выхода из сложного лабиринта.

Re: Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 03 июл 2012, 10:30
Neodrop
Кхм.. А чем это лучше родного Поиска Пути? :-?
Или вопрос в Free версии?

Re: Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 03 июл 2012, 12:45
Good1101
По правде сказать я даже не видел стандартного решения, но как опять появится свободное время попробую разобраться и если получится усовершенствовать его.)

Re: Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 03 июл 2012, 15:49
artk
Слишком примитивный алгоритм и ограниченный.
Посмотрите метод потенциальных полей для задач без знания карты. У меня боты умнее, они не знают карту и не запоминают ее. Для нормальных ботов, все же, нужнее не хождение по кратчайшему пути и не по "рельсам", а по всем рандомным и адекватным.

Re: Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 03 июл 2012, 16:46
Good1101
Ну у меня тоже не по рельсам ходят и карты не знают, алгоритм конечно простой, но суть такова что бот идет к цели , например к флажку как в примере выше, и когда встречается на пути препятствие он определяет с какой стороны его будет ближе обойти, обходит и идет дальше к цели.
Попробую допилить конечно раз уж начал))

Re: Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 17 окт 2020, 15:15
Samael-13
подскажите пожалуйста как сделать так что бы мой враг обходил препятствия только по оси у

Re: Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 17 окт 2020, 15:17
waruiyume
Это как?

Re: Скрипт обхода препятствий ботом или ИИ.

СообщениеДобавлено: 17 окт 2020, 23:48
Samael-13
waruiyume писал(а):Это как?
у меня в игре все перемещения в осях x и y. По оси z перемещения я заморозил. Суть игры в том что ракета должна протереть из пункта А в пункт В облетая препятствия. Хочу сделать уровень в котором ракета преследует враг, но не получается сделать чтобы враг облетал препятствия только вверх и вниз.
Короче надо чтоб враг препятствия облетал сверху и снизу.