Как установить угол обзора сферы и прочитать угол, под которым объекты находятся перед ней?
В настоящее время я пытаюсь построить датчик 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 ответ
Насколько я могу судить, твой код ничего не делает. Мой первый совет - удалить весь закомментированный код, но после этого вот почему ваш код вообще ничего не делает:
Вы передаете массив объектов в ваш скрипт. Хорошо пока.
Вы берете весь этот массив объектов CurrentHitObjects и передаете transform.position каждого отдельного объекта в один вектор3. Это означает, что все значения перезаписываются, кроме последнего. Это было бы большой проблемой, если бы вы пытались найти положение каждого отдельного объекта. Вместо этого для этого потребуется vector3[]. Но есть еще одна большая проблема.
'previous', который содержит transform.position объектов, нигде не используется. Таким образом, вы на самом деле не находите местоположение чего-либо.
Вы используете start() (который, кстати, запускается только один раз), чтобы выполнить итерацию массива объектов, но затем очищаете CurrentHitObjects.Clear();, прямо в начале update() (который выполняется много раз в секунду путь). Проблема здесь в том, что если вы надеялись использовать CurrentHitObjects для чего-либо в вашем коде, вы не можете этого сделать, потому что вы стерли это, прежде чем даже начали что-то делать с ним.
Ваш raycast[] стреляет ни к чему. Мне кажется, что это просто стреляет вперед.
Вы находите угол между прямым направлением и прямым?
Честно говоря, есть много серьезных проблем с этим кодом. Я не хочу быть резким, но похоже, что вы копируете и вставляете чужой код и не знаете, как его использовать. Это требует полной переделки. Если вы знаете, как кодировать, я бы выкинул его и начал заново. Смотрите мой комментарий к вашему ответу для лучшего способа делать то, что вы хотите.
Если вы не знаете, как кодировать, вам не следует спрашивать о бесплатном рабочем коде в stackru. Попробуйте вместо этого форум единства. Если вы пытаетесь поправиться, посмотрите мои комментарии выше.