Вторник, 03 Августа 2021, 23:30

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Raycast и Transform.rotation (проблема при попадание в луч противника)
Raycast и Transform.rotation
Jlovenpk1Дата: Суббота, 21 Января 2017, 03:07 | Сообщение # 1
участник
Сейчас нет на сайте
Имеется Raycast, т.к моделька из WoW, то стандартный Raycast через модель, идет прям с ног.

Пришлось подшаманить, создать пустой объект под названием "Глаза" и пускать луч из него.

Луч отлично идет из глаз на нужную мне дистанцию(дистанция агрессивности).
Как только луч попадает на моего персонажа, то сразу начинает двигаться на моего персонажа, луч следит за персонажем и все отлично, НО.
Когда моделька приближается, то ее начинать жестко кренить относительно персонажа и в итоге он смотрит сквозь персонажа и не видит его, хотя луч идет сквозь персонажа.
Как данную проблему решить?




Есть ли аналог RayCast, т.е что бы не луч был, а обхватывала целую область вокруг противника(область агрессивности для него).


Сам код:
Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour {
    public int speed = 25; // Скорость передвижение enemy
    public float agr = 0.0f; // Radius агрессивности(для Physics.SphereCast) не работает
    public CharacterController _controller; // контроллер enemy
    private Transform target; // цель
    private Transform point; // начало Raycast идет от объекта глаза

    // Use this for initialization
    void Start () {
        _controller = GetComponent<CharacterController>(); // берем контроллер

        point = GameObject.Find("Glaza").transform;// находим объект Glaza
    }
    
    // Update is called once per frame
    void Update () {

        // луч от глаз по прямой
        Ray ray = new Ray(point.transform.position, transform.forward);

                    //Ray ray = new Ray(transform.position, transform.forward);

         RaycastHit hit; // поподание
             Debug.DrawRay(ray.origin, ray.direction * 100, Color.blue); // рисуем длину
        if (Physics.Raycast(ray,out hit,150)) // получаем данные о поподание в объект
        {
            GameObject hitobject = hit.transform.gameObject;
            target = hitobject.transform;
            if (hitobject.tag==("Player")) // если объект игрок
            {
                //point.transform.LookAt(target);
                // поворачиваемся к объекту
                transform.rotation = Quaternion.LookRotation(hitobject.transform.position - point.transform.position, Vector3.up);
                // рисуем линию красным
                Debug.DrawLine(ray.origin, hit.point, Color.red);
                
                lookEnemy();
                
            }
        }
  
    }
    public void lookEnemy()
    {
        
      
        
        _controller.Move(transform.forward * speed * Time.deltaTime); // бежим к игроку
    }
}

lovegcup


DjanStudio
RangerДата: Суббота, 21 Января 2017, 05:20 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
Вообще не понимаю, зачем использовать луч.
Есть координаты моба. Есть координаты игрока.
Если дистанция меньше дистанции агрессивности, разворачивать моба по направлению к игроку и двигать.


Jlovenpk1Дата: Суббота, 21 Января 2017, 12:26 | Сообщение # 3
участник
Сейчас нет на сайте
Ranger, это все хорошо, ответ логичен, но если я не использовал предложенный тобой метод, значит я не знаю, как его реализовать.
Увы, но книгу которую я читаю, используется Simple AI и этот метод описан с помощью Raycast, но все уроки используют стандартные примитивы.
Моя версия скрипта нормально работает с капсулами, но если использовать модели, то начинается бесовщина, что на скринах.
;)

Добавлено (21 января 2017, 12:26)
---------------------------------------------
Вопрос решил по поводу области агрессивности, тема по поводу лучей открыта, возможно есть решение?
Как изменить направление луча и заставить смотреть например на голову противника, а не в грудь.


DjanStudio

Сообщение отредактировал Jlovenpk1 - Суббота, 21 Января 2017, 12:32
RangerДата: Суббота, 21 Января 2017, 12:28 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Это не бесовщина,
1.Просто луч у тебя идет от "глаз" в центр объекта. поэтому и заваливается.
2. Не видит потому что у тебя луч пересекает террейн ( или что там у тебя вместо него). Посмотри какой объект пересекается лучом - поймешь где ошибка.


Jlovenpk1Дата: Суббота, 21 Января 2017, 13:26 | Сообщение # 5
участник
Сейчас нет на сайте
Ranger, отлично, а как поднять этот луч, что бы он смотрел туда, куда надо.
Я видел какой-то проект, аля похожий на готику 1, там Raycast монстра, который ниже или выше, поднимал или опускал голову к уровню головы противника и ходил за ним, атаковал и т.д
Эти методы есть в unity вопрос, как их реализовать, т.к кроме как, создавать пустой объект " глаза" и отправлять луч в поиска объекта "глаза Плауер№1" не вариант.

Спасибо за твою помощь, делиться опытом всегда благое дело.


DjanStudio
berilДата: Воскресенье, 22 Января 2017, 06:12 | Сообщение # 6
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
попробуй
Код

transform.LookAt(hitobject.transform.position - point.transform.position);




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
Jlovenpk1Дата: Понедельник, 23 Января 2017, 14:32 | Сообщение # 7
участник
Сейчас нет на сайте
beril, Пробовал этот способ, когда создавал свою систему Waypoint.
Моб подходил к цели и лицом падал в нее, т.е падал на объект если он лежал, или летел к нему(если гравитация слабая), если гравитация нормальная, то он просто падал на спину и смотрел на объект вверху.


DjanStudio
IlyaKosДата: Понедельник, 23 Января 2017, 14:44 | Сообщение # 8
почетный гость
Сейчас нет на сайте
Попробуй так:
Quaternion rot = Quaternion.LookRotation(ТвойНПС.transform.position - ТвойЧАР.transform.position);
ТвойНПС.rotation = Quaternion.Lerp(ТВОЙнпс.rotation, new Quaternion(ТВОЙнпс.rotation.x, rot.y, ТВОЙнпс.rotation.z, rot.w), Time.deltaTime * 5);

И он не будет падать и нырять, если цель ниже или выше него.


Сообщение отредактировал IlyaKos - Понедельник, 23 Января 2017, 14:48
Jlovenpk1Дата: Понедельник, 23 Января 2017, 18:55 | Сообщение # 9
участник
Сейчас нет на сайте
IlyaKos, О спасибо, протестирую позже.

DjanStudio
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Raycast и Transform.rotation (проблема при попадание в луч противника)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2021 Рейтинг