为什么RayCast永远不会撞到物体?

时间:2019-05-21 20:47:51

标签: c# unity3d

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附加到该撞机。 但是问题在于,射线广播似乎并没有真正击中它。

屏幕截图:

第一个洋红色射线广播:

Raycast

以及窗口检查器设置:

Window

问题在于射线投射首先击中了NAVI对象。 什么是NAVI对象? NAVI是播放器(FPSController)的子级。 NAVI是游戏中玩家的一部分。

我认为这就是我使用图层的原因。

主要目标是播放器将检测可交互的对象,并且一旦检测到对象,NAVI将开始旋转。 当导航旋转时,这表明该对象在游戏中是可交互的。

您可以在此屏幕快照中在场景窗口和游戏窗口中看到NAVI。 这就是当玩家击中一个可交互对象时应该旋转的东西:脚本已附加到玩家身上:

FPSController(Player)

NAVI

这是带有脚本的玩家检查器:

Player

并且由于NAVI始终位于玩家的前方,因此始终都在进行射线投射并检测NAVI而不是游戏中的其他对象。

0 个答案:

没有答案