У меня есть две основные проблемы в этом случае:
NAVI является дочерним элементом игрока (FPSController), поэтому NAVI движется вместе с игроком. Но NAVI также находится немного впереди игрока, и в результате лучевая трансляция впервые попадает в NAVI, а не в объект Interactable.
Если между игроком и каким-нибудь интерактивным объектом есть дверь, он обнаружит этот объект. Но если между игроком и интерактивными объектами есть дверь и другие объекты, она не должна их обнаруживать. Игрок их не видит, но обнаруживает.
Этот скрипт прикреплен к плахеру (FPSController):
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 Scaling scaling;
public int spinX = 0;
public int spinY = 0;
public int spinZ = 0;
public GameObject navi;
public GameObject itemsDescriptionCanvas;
public Text itemsDescriptionText;
private RaycastHit whatObjectHit;
private Transform[] childrenToSearhc;
private void Start()
{
childrenToSearhc = parentToSearch.GetComponentsInChildren<Transform>();
}
private void Update()
{
if (cam.enabled == true)
{
if (Input.GetMouseButtonDown(0) && !scaling.scaleUp)
{
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))
{
objectHit = whatObjectHit.collider.gameObject.name;
interactableObject = true;
print("Hit ! " + whatObjectHit.collider.gameObject.name);
if (scaling.objectToScale.transform.localScale == scaling.minSize)
{
scaling.objectToScale.transform.Rotate(spinX, spinY, spinZ);
}
ProcessItemsDescripations();
itemsDescriptionCanvas.SetActive(true);
}
else
{
if (scaling.objectToScale.transform.localScale == scaling.minSize)
{
navi.transform.rotation = new Quaternion(0, 0, 0, 0);
}
itemsDescriptionCanvas.SetActive(false);
print("Not Hit !");
}
}
}
private void ExecuteActions(GameObject go)
{
var ia = go.GetComponent<ItemAction>();
if (ia != null)
{
ia.ItemMove();
}
}
void ProcessItemsDescripations()
{
foreach (Transform child in childrenToSearhc)
{
if (child.GetComponent<ItemInformation>() != null)
{
ItemInformation iteminformation = child.GetComponent<ItemInformation>();
if (child.name == objectHit)
{
itemsDescriptionText.text = iteminformation.description;
}
}
}
}
public class ViewableObject : UnityEngine.MonoBehaviour
{
public string displayText;
public bool isInteractable;
}
}
И этот небольшой скрипт прикреплен к каждому объекту Interactable:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemInformation : UnityEngine.MonoBehaviour
{
[TextArea]
public string description;
}
Это скриншот настроек инспектора плеера (FPSController):

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

Это пример скриншота окна. Окно должно быть Взаимодействующим объектом и должно быть обнаружено raycast:
Для тега окна установлено значение Untagged, а для слоя установлен значение по умолчанию

Это скриншот, когда в игре работает ситуация, когда игрок стоит за дверью, с другой стороны двери есть комната с интерактивным окном. Ничто не помешает радиопередаче пройти через дверь и обнаружить окно. И это не логика. Игрок не может видеть окно. Таким образом, окно не должно быть обнаружено:
Слева вверху пурпурный цвет raycast проходит через дверь к окну. Слева внизу игрок стоит за дверью и вообще видит окно, но обнаруживает окно:

Но когда вы используете точку останова, вы можете видеть, что действительно ударил NAVI, не дверь, не окно, а NAVI, поскольку NAVI всегда стоит перед игроком:

Прежде всего я пытался использовать слой маски raycast в своем скрипте, а затем изменил слой окна на Interactable, а затем я увидел, что он обнаруживает через дверь.
В конце основной целью является:
Для обнаружения Взаимодействующих объектов в игре, но не для обнаружения NAVI, он не является Взаимодействующим объектом, поэтому каким-то образом сделать так, чтобы NAVI не блокировал лучевую трансляцию!
И чтобы иметь возможность обнаруживать объекты только при наличии логического представления игрока об объектах. И не обнаруживать предметы из-за дверей или стен или других предметов.