我的脚本没有激活 UI 也没有播放动画

My script doesn't activate UI and doesn't play animations

大家好,我制作了两个脚本来处理开门。 脚本 1 - 光线投射 脚本 2 - 开门脚本

我在播放器相机上有光线投射,我在门上有脚本 2。

但是有个问题

在脚本 2 中,我有使 UI 活动和不活动的代码以及执行门动画的代码

脚本 1 -

using System.Collections.Generic;
using UnityEngine;

public class PlayerCasting : MonoBehaviour
{
    public Camera FPScam;
    public float range = 6;
    public static float ToTarget; 


    void Update()
    {
        RaycastHit Hit;
        if (Physics.Raycast(FPScam.transform.position, FPScam.transform.forward, out Hit, range))
        {
            ToTarget = Hit.distance;
        }
    }
}

脚本 2 -

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DoorOpen : MonoBehaviour
{

    public float Distance;
    public GameObject key;
    public GameObject reason;
    public GameObject Hinge;
    public AudioSource DoorCreak;
    
    

    // Update is called once per frame
    void Update()
    {
        Distance = PlayerCasting.ToTarget;
    }

    private void OnMouseOver()
    {
        if (Distance <= 3.5f)
        {
            key.SetActive(true);
            reason.SetActive(true);
        }
        if (Input.GetButtonDown("Action"))
        {
            if (Distance <= 3.5f)
            {
                key.SetActive(false);
                reason.SetActive(false);
                this.GetComponent<BoxCollider>().enabled = false;
                Hinge.GetComponent<Animation>().Play("DoorOpenAnim");
                DoorCreak.Play();
            }
        }

    }

    private void OnMouseExit()
    {
        key.SetActive(false);
        reason.SetActive(false);
    }
}

但是,当我单击 'E' 时,UI 不会激活,也不会播放动画,当 Raycast 距离 <= 3.5 时。

I have the raycast on the player camera

由于您使用的是 OnMouseOver()OnMouseExit(),您的方法只有在玩家的鼠标位于您要进行光线投射的对象上时才会起作用。

确保光线投射实际上指向与鼠标光标相同的方向。您可以使用 Debug.Raycast() 直观地查看光线投射的方向。

如果光线投射朝着您想要的方向发展,但仍然无法正常工作,请尝试通过脚本进行通信的不同方式,并避免使用 OnMouseOver().

例如,您可以尝试这样的操作:

public class PlayerCasting : MonoBehaviour
{
    public Camera FPScam;
    public float range = 6;
    public static float ToTarget = 0f;
    public static GameObject HoveredObject = null; // <----

    void Update()
    {
        RaycastHit Hit;
        if (Physics.Raycast(FPScam.transform.position, FPScam.transform.forward, out Hit, range))
        {
            ToTarget = Hit.distance;
            HoveredObject = Hit.collider.gameObject; // <----
        }
    }
}
public class DoorOpen : MonoBehaviour
{

    public float Distance;
    public GameObject key;
    public GameObject reason;
    public GameObject Hinge;
    public AudioSource DoorCreak;



    // Update is called once per frame
    void Update()
    {
        if (PlayerCasting.HoveredObject == gameObject)
        {
            Distance = PlayerCasting.ToTarget;

            CheckDistance();
        }

    }

    private void CheckDistance()
    {
        if (Distance <= 3.5f)
        {
            key.SetActive(true);
            reason.SetActive(true);

            if (Input.GetButtonDown("Action"))
            {
                key.SetActive(false);
                reason.SetActive(false);
                this.GetComponent<BoxCollider>().enabled = false;
                Hinge.GetComponent<Animation>().Play("DoorOpenAnim");
                DoorCreak.Play();
            }
        }
        else
        {
            key.SetActive(false);
            reason.SetActive(false);
        }


    }

    private void OnMouseExit()
    {
        key.SetActive(false);
        reason.SetActive(false);
    }
}