Почему RayCast никогда не попал в объект? - PullRequest
1 голос
/ 21 мая 2019
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DetectInteractable : UnityEngine.MonoBehaviour
{
    public Camera cam;
    public float distanceToSee;
    public string objectHit;
    public bool interactableObject = false;
    public Transform parentToSearch;
    public static bool detected = false;
    public Scaling scaling;

    private RaycastHit whatObjectHit;
    private bool clickForDescription = false;
    private int layerMask = 1 << 8;
    private GameObject objectWasHit;

    private void Update()
    {
        if (Input.GetMouseButtonDown(0) && !scaling.scaleUp)
        {
            clickForDescription = true;

            if (whatObjectHit.collider != null)
                ExecuteActions(whatObjectHit.collider.gameObject);
        }

        Debug.DrawRay(cam.transform.position, cam.transform.forward * distanceToSee, Color.magenta);
        if (Physics.Raycast(cam.transform.position, cam.transform.forward, out whatObjectHit, distanceToSee, layerMask))
        {
            objectWasHit = whatObjectHit.collider.gameObject;
            detected = true;
            objectHit = whatObjectHit.collider.gameObject.name;
            interactableObject = true;
            print("Hit ! " + whatObjectHit.collider.gameObject.name);
        }
        else
        {
            detected = false;
            //clickForDescription = false;
            print("Not Hit !");
        }
    }

    private void ExecuteActions(GameObject go)
    {
        var ia = go.GetComponent<ItemAction>();
        ia.ItemMove();
    }

    private void OnGUI()
    {
        if (clickForDescription == true)
        {
            ProcessOnGUI(parentToSearch);
            clickForDescription = false;
        }
    }

    void ProcessOnGUI(Transform parent, int level = 0)
    {
        foreach (Transform child in parent)
        {
            if (child.GetComponent<ItemInformation>() != null)
            {
                ItemInformation iteminformation = child.GetComponent<ItemInformation>();
                if (child.name == objectHit)
                {
                    var centeredStyle = GUI.skin.GetStyle("Label");
                    centeredStyle.alignment = TextAnchor.UpperCenter;
                    GUI.Box(new Rect(
                          Screen.width / 2 - 50 + 20 * level, // <== INDENTATION
                          Screen.height / 2 - 25, 100, 50),
                        iteminformation.description, centeredStyle);
                }
            }
            // Process next deeper level
            ProcessOnGUI(child, level + 1);
        }
    }

    public class ViewableObject : UnityEngine.MonoBehaviour
    {
        public string displayText;
        public bool isInteractable;
    }
}

Внутри этой строки она никогда не проходит:

if (Physics.Raycast(cam.transform.position, cam.transform.forward, out whatObjectHit, distanceToSee, layerMask))

И переменная objectHit постоянно равна нулю

Я вижу, что в этом случае пурпурный raycast попал в окноэто окно, в которое оно должно попасть.Но используя точку останова на линии:

objectWasHit = whatObjectHit.collider.gameObject;

Этого никогда не будет.

В окне есть коллайдер, и к нему прикреплен скрипт ItemInformation.Но проблема в том, что raycast не похоже на него.

Скриншоты:

Первый пурпурный Raycast:

Raycast

И настройки окна инспектора:

Window

Проблема в том, что raycast впервые ударил объект NAVI.Что такое объект NAVI?NAVI является дочерним элементом игрока (FPSController).NAVI является частью игрока в игре.

Я думаю, именно поэтому я использовал слои.

Основная цель состоит в том, чтобы игрок обнаруживал объекты, которые являются взаимодействующими, и как только объект был обнаруженНАВИ начнет вращаться.Когда навигация вращается, это как бы указывает на то, что объект является интерактивным в игре.

Вы можете видеть на этом скриншоте NAVI как в окне сцены, так и в окне игры.Это то, что предполагается вращать, когда игрок ударяет по интерактивному объекту: скрипт прикреплен к игроку:

FPSController (Player)

NAVI

И это инспектор игрока с прикрепленным к нему сценарием:

Player

И поскольку НАВИ всегда немного впередиигрока Raycast все время поражает и обнаруживает NAVI вместо других объектов в игре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...