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

это то, чего я хочу достичь this is what i want to achieve

В настоящее время я пытаюсь построить датчик 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 Ответ

0 голосов
/ 01 мая 2018

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

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

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

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

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

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

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

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

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

...