c# - 我的脚本没有激活 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 不会激活,也不会播放动画。
解决方案
我在播放器相机上有光线投射
由于您正在使用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);
}
}
推荐阅读
- html - 具有两个条件的 XPath 同级
- python-3.x - 我正在尝试使用机器人将来自不和谐服务器的消息存储在数据库中
- java - 无法在 Spring Boot 测试中运行 sql 文件
- hana - 访问另一个 HDI 容器中的表函数
- powershell - 如何创建用户
- javascript - 如何隐藏命令。自定义剑道?
- elasticsearch - elasticsearch date range 获取今天和昨天之间的日期范围
- html - 如何在 Angular Material 的对话框中放置图像?
- macos - 在 macOS 上使用 Core Image 获取 RAW 图像大小的正确方法是什么
- leaflet - 在 Leaflet 的 DashArray 中使用简单标记