void Update()
{
if(bcoords.x > acoords.x)
{
movement("right");
}
}
它永远不会在此行内通过:
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;
}
}
变量objectHit一直为空
在这种情况下,我可以看到洋红色射线投射击中了窗口,这是应该击中的窗口。但是在行上使用断点:
if (Physics.Raycast(cam.transform.position, cam.transform.forward, out whatObjectHit, distanceToSee, layerMask))
永远不会到那里。
该窗口具有对撞机,并且脚本ItemInformation附加到该撞机。 但是问题在于,射线广播似乎并没有真正击中它。
屏幕截图:
第一个洋红色射线广播:
以及窗口检查器设置:
问题在于射线投射首先击中了NAVI对象。 什么是NAVI对象? NAVI是播放器(FPSController)的子级。 NAVI是游戏中玩家的一部分。
我认为这就是我使用图层的原因。
主要目标是播放器将检测可交互的对象,并且一旦检测到对象,NAVI将开始旋转。 当导航旋转时,这表明该对象在游戏中是可交互的。
您可以在此屏幕快照中在场景窗口和游戏窗口中看到NAVI。 这就是当玩家击中一个可交互对象时应该旋转的东西:脚本已附加到玩家身上:
FPSController(Player)
这是带有脚本的玩家检查器:
并且由于NAVI始终位于玩家的前方,因此始终都在进行射线投射并检测NAVI而不是游戏中的其他对象。