Unity raycast сталкивается с объектом и печатает его имя в графическом интерфейсе

using UnityEngine;
using System.Collections;
public class GuardSample : MonoBehaviour 
{
FOV2DEyes eyes;
FOV2DVisionCone visionCone;
float speed = -5;
RaycastHit hit;


void Start() 
{
    eyes = GetComponentInChildren<FOV2DEyes>();
    visionCone = GetComponentInChildren<FOV2DVisionCone>();
}

void FixedUpdate()
{
    if (transform.position.x < -10 || transform.position.x > 10)
    {
        speed *= -1;
    }

    transform.position = new Vector3(transform.position.x + speed * Time.fixedDeltaTime, transform.position.y, transform.position.z);
}

bool playerInView = false;

void Update()
{
    playerInView = false;
    foreach (RaycastHit hit in eyes.hits)
    {
        if (hit.transform && hit.transform.tag == "Player")
        {
            playerInView = true;
        }
    }

}

void OnGUI()
{
    if (playerInView)
    {
        GUI.Box (new Rect (10, 10, 160, 60), "Title");
        GUI.Label( new Rect(10, 10, 160, 60), hit.collider.gameObject.name);
    }

}

}

Мой gaurd движется, и когда игрок входит в raycast, появляется графический интерфейс, но имя не идентифицируется

все работает, кроме "hit.collider.gameObject.name" Unity выдает ошибку, что "ссылка на объект не указывает на экземпляр объекта"

пожалуйста, посмотрите, я новичок в Unity и C #


person Anas    schedule 20.01.2015    source источник
comment
кажется, вы вообще не выполняете raycast. Взгляните на Physics.Raycast   -  person Heisenbug    schedule 20.01.2015


Ответы (1)


Проблема в том, что у вас нет доступа к переменной hit, потому что вы ее не сохраняете, а только сохраняете на каждой итерации. Простое решение — сохранить хит, который делает playerInView = true;.

Что-то вроде этих модификаций ваших методов Update() и OnGUI() должно работать;

RaycastHit hittenGo; // Declare up this variable

void Update()
{
  playerInView = false;
  foreach (RaycastHit hit in eyes.hits)
  {
    if (hit.transform && hit.transform.tag == "Player")
    {
        hittenGo = hit;
        playerInView = true;
    }
  }
}

void OnGUI()
{
  if (playerInView)
  {
    GUI.Box (new Rect (10, 10, 160, 60), "Title");
    GUI.Label( new Rect(10, 10, 160, 60), hittenGo.collider.gameObject.name);
  }
}

Не стесняйтесь спрашивать меня о любых сомнениях относительно моего подхода.

person Unai    schedule 20.01.2015
comment
hittenGo — это переменная по умолчанию для Unity, C# или чего? просто учиться - person Anas; 20.01.2015
comment
еще один вопрос, если вы не возражаете, пожалуйста, в одном кадре отображается только имя одного объекта, даже если есть два объекта, когда один объект выходит из поля зрения raycast, только тогда raycast идентифицирует другой объект, я надеюсь, что задаю вопрос понятно: - ) - person Anas; 20.01.2015
comment
Пожалуйста! hittenGo — это просто переменная, которую я определил, чтобы я мог использовать ее для всего, что захочу. - person Unai; 20.01.2015
comment
Отвечая на второй комментарий, в этом случае вы должны создать массив для хранения всех хитов GO. С вашим кодом вы просто сохраняете последний хит. Поэтому вместо создания переменной RayCastHit с именем hittenGo вы должны создать переменную, которая должна быть массивом RayCastHit. - person Unai; 20.01.2015
comment
Еще один комментарий: hittenGo — это имя переменной, которая является переменной RayCastHit, где RayCastHit — это класс движка Unity. Я предлагаю вам взглянуть на эти учебные пособия по Unity unity3d.com/learn/tutorials/modules /начинающий/скрипты - person Unai; 20.01.2015
comment
я добавляю массив следующим образом RaycastHit hittenGo = new RaycastHit(); . . . . void OnGUI() { if (playerInView) { foreach (RaycastHit hittenGo in eyes.hits) { GUI.Label(new Rect(40, 25, 100, 40), hittenGo.collider.gameObject.name); } } } теперь он может обнаруживать оба объекта одновременно, но произошла одна странная вещь, теперь мои объекты обнаруживаются только на крайнем левом краю лучей FOV, пожалуйста, взгляните на изображения моей сцены dl.dropboxusercontent.com/u/8025376/1.jpg dl.dropboxusercontent.com/u/8025376/2.jpg - person Anas; 21.01.2015
comment
я пробовал много вариантов, но может быть из-за очень плохого понимания ошибки, это происходит, извините об этом - person Anas; 21.01.2015
comment
Привет, вы не объявляете массив, вы просто инициализируете объект. Здесь у вас есть пример того, как создать массив и как зациклить его, чтобы получить все его компоненты. unity3d.com/es/learn/tutorials/modules/beginner/scripting/ . В примере код показывает, как создать массив игровых объектов и выполнить его итерацию. Вы должны сделать это с RayCastHit вместо GameObjects. - person Unai; 21.01.2015