首页 > 解决方案 > 我的脚本没有激活 UI 也没有播放动画

问题描述

嘿伙计们,我制作了两个脚本来处理开门。脚本 1 - Raycast 脚本 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”并且光线投射距离 <= 3.5 时,UI 不会激活,也不会播放动画。

标签: c#unity3dgame-engine

解决方案


我在播放器相机上有光线投射

由于您正在使用OnMouseOver()并且OnMouseExit()您的方法仅在玩家的鼠标位于您想要进行光线投射的物体上时才有效。

确保光线投射实际上指向鼠标光标所在的方向。您可以使用 useDebug.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);
    }
}

推荐阅读