Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Raycast For Unity3d

Raycast For Unity3d

Поделиться

Страницы: 1 2 Следующая

FeralCombatПользовательwww15 мая 201723:08#0
Ребята! Всем привет! Помогите пожалуйста - столкнулись с проблемой! Не можем повесить скрипт Raycast, который будет кидать луч и отслеживать дистанцию с объекта на объект. Внимание: не с контроллера и не с ИИ. А с движущегося объекта на любой объект. Ставим скрипт, с контроллера и он не фурычит. Может подскажет кто нибудь что нибудь полезное!
TokarnПостоялецwww15 мая 201723:38#1
Скрипт в студию
FeralCombatПользовательwww15 мая 201723:39#2
Tokarn
какой именно? Объекта в который пытаемся запулить Raycast?
FeralCombatПользовательwww15 мая 201723:44#3
Tokarn
Вот сюда нужно влепить Raycast, который будет постоянно бросаться на все объекты, на определённой дистанции.
// Patrol.cs
using UnityEngine;
using System.Collections;


public class Patrol : MonoBehaviour {
  Animator anim;
  public Transform target;
  public Transform[] points;
  private int destPoint = 0;
  private UnityEngine.AI.NavMeshAgent agent;


  void Start () {
   
    agent = GetComponent<UnityEngine.AI.NavMeshAgent>();
    anim = GetComponent<Animator> ();


    agent.autoBraking = false;

    GotoNextPoint();
  }


  void GotoNextPoint() {
 
    if (points.Length == 0)
      return;

 
    agent.destination = points[destPoint].position;

    destPoint = (destPoint + 1) % points.Length;
  }


  void Update () {
 

    Vector3 fwd = transform.TransformDirection(Vector3.forward);

    if (agent.remainingDistance < 0.5f)
      GotoNextPoint();
  }
}

Правка: 15 мая 2017 23:48

TokarnПостоялецwww15 мая 201723:48#4
FeralCombat
Смысл этот код кидать, если проблема явно либо в том, что коллайдера нет на объекте-цели, либо косяк в коде именно райкаста?
TokarnПостоялецwww15 мая 201723:50#5
Физика райкаста такова, что швыряя его, он должен откуда то выходить и в сторону какого-то вектора направляться, можно так же дистанцию назначить, чтобы не собирать лишнюю инфу, или даже в функциональных целях (допустим радиус атаки)
FeralCombatПользовательwww15 мая 201723:53#6
Tokarn
я кидал этот с мануала, по крайней мере там написанно что он должен работать именно так. Я куб поставил, мешколаидер прицепил к нему, но всё равно не пашет.. я что то не так делаю?
using UnityEngine;

public class RaycastExample : MonoBehaviour
{
 

  void FixedUpdate()
  {
    RaycastHit hit;

    if (Physics.Raycast(transform.position, -Vector3.up, out hit))
      print("Found an object - distance: " + hit.distance);
  }
}

FeralCombatПользовательwww15 мая 201723:56#7
Tokarn
сможешь помочь состряпать? Моих знаний ещё не хватает, чтобы понять причину :(
TokarnПостоялецwww16 мая 20170:03#8
В фиксед апдейте нужно код размещать, если на этом строиться физическое поведение объекта. Лучше просто в апдейт кидать, причем еще сделать куллдаун, если не требуется частый вызов райкаста
Смотри логика такова:
Ты задаешь переменную hit типа RaycastHit, чтобы потом с нее взять показания (например имя объекта в кого он попал, либо точка попадания (hit.point)) и использовать ее в дальнейшем в коде
Затем ты проверяешь, если райкаст брошеный с позиции transform.position (местоположение объекта на который прикреплен скрипт), в сторону (у тебя вниз бросается, т.е. по вектору x=0,y= -1, z=0), [при этом в переменную hit записывается инфо о попадании луча] попадает в коллайдер, пишется "найдено пересечение с объектом на такой то дистанции"
FeralCombatПользовательwww16 мая 20170:10#9
Tokarn
ага, точно он же вниз направлен потмоу что минус вектор, а как тупо его направить во все стороны? всмысле я понял что Вектор надо исправить, только не могу понять что дописать к нему, помимо того что минус стереть и up в какой

Правка: 16 мая 2017 0:13

TokarnПостоялецwww16 мая 20170:37#10
using UnityEngine; //подключаем пространство имен движка юньки для обращения к основным функциям движка.

public class RaycastExample : MonoBehaviour { //объявляем публичный класс, называя его RaycastExample, при этом он наследует функции класса MonoBehaviour (те самые Update(), OnCollisionEnter() и тд.)
public float rayDist = 10.0f //объявляем публичную переменную типа float (число с плавающей точкой), которая будет задавать дальность райкаста. Так же тут задал значение по умолчанию 10 юнитов.
public float rayRecast = 1.0f; //объявляем публичную (публичность нужна для редактирования её через инспектор) переменную float, которая будет задавать время между райкастами. Так же тут задал значение по умолчанию 1 сек.
private float rayCurTime = 0.0f; //объявляем приватную переменную float, для служебных целей (отмеривание оставшегося времени между райкастами). Задал значение по умолчанию.

void Update(){ //каждый кадр
  if(rayCurTime <= Time.time){ //проверяем прошло ли время с последнего райкаста, если да то выполняем
    RaycastHit hit; //внутри функции объявляем переменную hit, типа RaycastHit для сохранения данных попадания луча, чтобы их использовать в дальнейшем.
    if(Physics.Raycast(transform.position, transform.forward, out hit, rayDist)){ //если райкаст, брошенный из объекта на котором скрипт, в направлении вперед, относительно направления взгляда объекта (ось Z считается вперед), на дистанцию, заданную в переменной rayDist [выводим данные попадания в переменную hit], попадает в коллайдер
      Debug.Log(transform.name + " попал в " + hit.name) //чтобы убедиться что все работает пишем в консольке сообщение при попадании луча в коллайдер объекта.
    }
   
    rayCurTime = Time.time + rayRecast; //обновляем куллдаун
  }
}

Вроде ничего не напутал, без визуала писал

Правка: 16 мая 2017 0:45

TokarnПостоялецwww16 мая 20170:40#11
Если хочешь во все стороны это уже не райкаст нужен. Райкаст это луч, а тебе видать сфера нужна. Тогда используй либо триггер-коллайдер, либо Physics.SphereCast
https://docs.unity3d.com/ScriptReference/Physics.SphereCast.html
FeralCombatПользовательwww16 мая 20177:13#12
Tokarn
Спасибо, человек! Будем пилить, результат объявим!
FeralCombatПользовательwww16 мая 201722:40#13

Tokarn
Привет! Твой способ не сработал, но всё равно, спасибо что откликнулся и потратил своё время на наш злое..ий скрипт. Зато заработало вот это:
public class RayK : MonoBehaviour {
  // Use this for initialization
  void Start () {

  }
 
  // Update is called once per frame
  void Update () {

    RaycastHit hit;
    Vector3 forward = transform.TransformDirection(Vector3.forward) * 100;
    Debug.DrawRay(transform.position, forward, Color.green);

    Ray ray = new Ray (transform.position, forward);
    if (Physics.Raycast (transform.position, forward, out hit, 100)) {
      print (hit.distance);
    }
  }
}

TokarnПостоялецwww17 мая 201713:07#14
FeralCombat
Эмм у тебя создан рей, как переменная, но он не используется. Вообще так сказать масло маслянное.
Поглядел свой скрипт в визуале, там пару ковычек пропущено и hit.transform.name вместо hit.name должно быть
using UnityEngine;

public class RaycastExample : MonoBehaviour {

    public float rayDist = 10.0f;
    public float rayRecast = 1.0f;
    private float rayCurTime = 0.0f;

    void Update() {
        if (rayCurTime <= Time.time) {
            RaycastHit hit;
            if (Physics.Raycast(transform.position, transform.forward, out hit, rayDist)) {
    Debug.Log(transform.name + " попал в " + hit.transform.name);
            }
            rayCurTime = Time.time + rayRecast;
        }
    }
}

Если чаще вызывать рей нужно то уменьшай переменную rayRecast (допустим подойдет 0.1f - 0.2f значения)
Если дальше нужно рей кидать то меняй значение переменной rayDist (выставь 10000.0f допустим и будет как в твоем примере)

Правка: 17 мая 2017 13:19

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Игровая логика и ИИ

2001—2017 © GameDev.ru — Разработка игр