Как установить угол обзора сферы и прочитать угол, под которым объекты находятся перед ней?

Это то, чего я хочу достичь это то, чего я хочу достичь

В настоящее время я пытаюсь построить датчик RADAR на единицу. В настоящее время я использую сферуст Как мне установить угол обзора броска сферы, а также как мне узнать угол, под которым объект находится перед ним.

То, что я использовал сейчас Vector3.angle но это показывает 160 градусов, если объект находится прямо напротив радара, вместо этого он должен показывать 90 градусов.

Я вставлю код, который я реализовал ниже. Любое руководство приветствуется.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class spherecast : MonoBehaviour
{
    Rigidbody rb;
    public List<GameObject> CurrentHitObjects = new List<GameObject>();

    //public GameObject curobject;

    public float radius;
    public float maxdist;
    public LayerMask layermask;
    public float velocity;
    public Time deltatime;
    public Vector3 previous;

    private Vector3 origin;
    private Vector3 direction;

    private float hitdist;

    // Use this for initialization
    void Start()
    {
        foreach (GameObject cur in CurrentHitObjects)
        {
            previous = cur.transform.position;
        }
    }

    // Update is called once per frame
    void Update()
    {
        origin = transform.position;
        direction = transform.forward;

        hitdist = maxdist;
        CurrentHitObjects.Clear();

        RaycastHit[] hits = Physics.SphereCastAll(origin, radius, direction, maxdist, layermask, QueryTriggerInteraction.UseGlobal);
        foreach (RaycastHit hit in hits)
        {
            Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera.main);
            if (GeometryUtility.TestPlanesAABB(planes, hit.collider.bounds))
            {
                float angle = Vector3.Angle(transform.forward, hit.point.normalized);
                float degree = Mathf.Acos(angle) * Mathf.Rad2Deg;
                Vector3 pos = hit.point;
                Debug.Log(hit.collider.name + "position =" + pos);
                CurrentHitObjects.Add(hit.transform.gameObject);
                hitdist = hit.distance;
                Debug.Log(hit.transform.name + "Distance ="+ hitdist);
                Debug.Log(hit.collider.name + "Angle = " + angle);

                velocity = ((hit.transform.position - previous).magnitude) / Time.deltaTime;
                previous = hit.transform.position;
                Debug.Log(hit.transform.name + "Velocity =" + velocity);
            }
            else
            {
                return ;
            }
        }
    }

    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Debug.DrawLine(origin, origin + direction * hitdist);
        Gizmos.DrawWireSphere(origin + direction * hitdist, radius);
    }
}

1 ответ

Насколько я могу судить, твой код ничего не делает. Мой первый совет - удалить весь закомментированный код, но после этого вот почему ваш код вообще ничего не делает:

Вы передаете массив объектов в ваш скрипт. Хорошо пока.

  1. Вы берете весь этот массив объектов CurrentHitObjects и передаете transform.position каждого отдельного объекта в один вектор3. Это означает, что все значения перезаписываются, кроме последнего. Это было бы большой проблемой, если бы вы пытались найти положение каждого отдельного объекта. Вместо этого для этого потребуется vector3[]. Но есть еще одна большая проблема.

  2. 'previous', который содержит transform.position объектов, нигде не используется. Таким образом, вы на самом деле не находите местоположение чего-либо.

  3. Вы используете start() (который, кстати, запускается только один раз), чтобы выполнить итерацию массива объектов, но затем очищаете CurrentHitObjects.Clear();, прямо в начале update() (который выполняется много раз в секунду путь). Проблема здесь в том, что если вы надеялись использовать CurrentHitObjects для чего-либо в вашем коде, вы не можете этого сделать, потому что вы стерли это, прежде чем даже начали что-то делать с ним.

  4. Ваш raycast[] стреляет ни к чему. Мне кажется, что это просто стреляет вперед.

  5. Вы находите угол между прямым направлением и прямым?

Честно говоря, есть много серьезных проблем с этим кодом. Я не хочу быть резким, но похоже, что вы копируете и вставляете чужой код и не знаете, как его использовать. Это требует полной переделки. Если вы знаете, как кодировать, я бы выкинул его и начал заново. Смотрите мой комментарий к вашему ответу для лучшего способа делать то, что вы хотите.

Если вы не знаете, как кодировать, вам не следует спрашивать о бесплатном рабочем коде в stackru. Попробуйте вместо этого форум единства. Если вы пытаетесь поправиться, посмотрите мои комментарии выше.

Другие вопросы по тегам