c# - 从打开的抽屉中取出钥匙
问题描述
所以我有一个抽屉,它带有一个脚本,它显示一个面板来提示玩家使用触发器打开/关闭抽屉。我也有一个带有类似脚本的钥匙,但它提示玩家也使用面板和触发器来拿起钥匙。我想把钥匙放在抽屉里,所以当玩家按'E'打开抽屉时,他们也可以按'E'来捡起钥匙。我试过让抽屉的碰撞器变小,也让钥匙碰撞器变大,但这只是意味着玩家可以在不打开抽屉的情况下拿起钥匙。实现这一目标的更有效方法是什么?如果需要,我还会附上我的代码。
抽屉脚本:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
public class DrawerScript : MonoBehaviour
{
UnityEvent Event = new UnityEvent();
public GameObject OpenPanel = null;
private bool _isInsideTrigger = false;
public Animator _animator;
public string OpenText = "Press 'E' to open drawer";
public string CloseText = "Press 'E' to close drawer";
private bool _isOpen = false;
private void Start()
{
OpenPanel.SetActive(false);
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
_isInsideTrigger = true;
OpenPanel.SetActive(true);
UpdatePanelText();
Event.Invoke();
}
}
private void UpdatePanelText()
{
Text panelText = OpenPanel.transform.Find("Text").GetComponent<Text>();
if (panelText != null)
{
panelText.text = _isOpen ? CloseText: OpenText;
}
}
void OnTriggerExit(Collider other)
{
if (other.tag == "Player")
{
_isInsideTrigger = false;
OpenPanel.SetActive(false);
}
}
private bool IsOpenPanelActive
{
get
{
return OpenPanel.activeInHierarchy;
}
}
// Update is called once per frame
void Update()
{
if (IsOpenPanelActive && _isInsideTrigger)
{
if (Input.GetKeyDown(KeyCode.E))
{
_isOpen = !_isOpen;
Invoke ("UpdatePanelText", 1.0f);
_animator.SetBool("open", _isOpen);
}
}
}
}
钥匙拾取脚本:
using UnityEngine.UI;
using UnityEngine;
public class PickUp : MonoBehaviour
{
public Collider Collider;
public GameObject OpenPanel = null;
private bool _isInsideTrigger = false;
public string PickUpText = "Press 'E' to pick up";
private void Start()
{
if (OpenPanel != null)
{
OpenPanel.SetActive(false);
}
Collider = GetComponent<Collider>();
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
_isInsideTrigger = true;
OpenPanel.SetActive(true);
UpdatePanelText();
}
}
private void UpdatePanelText()
{
Text panelText = OpenPanel.transform.Find("Text").GetComponent<Text>();
if (panelText != null)
{
panelText.text = PickUpText;
}
}
void OnTriggerExit(Collider other)
{
if (other.tag == "Player")
{
_isInsideTrigger = false;
OpenPanel.SetActive(false);
}
}
private bool IsOpenPanelActive
{
get
{
return OpenPanel.activeInHierarchy;
}
}
解决方案
您可以使用 UnityEvent API。
这不是最好的解决方案,有几种方法可以做到这一点,但如果你想快速解决问题,你可以,例如,在你的抽屉类中创建一个 UnityEvent。
您需要添加命名空间:
using UnityEngine.Events;
并且,作为一个变量:
UnityEvent event = new UnityEvent();
这可能会在您的抽屉类上创建一个新事件(非常类似于按钮)。下一步是在您的关键类中创建一个启用或禁用碰撞器的方法。该方法必须公开。
之后,只需转到抽屉 GameObject 单击“+”号,将 Key GameObject 拖到其中并选择刚刚创建的类和公共方法。这将使该方法订阅该事件。
最后,在您的“打开抽屉”方法中,您只需调用:
event.Invoke();
每个“听”它的人都会被处决,包括你的班级。
推荐阅读
- python - NMF 作为 Python Scikit 中的聚类方法
- python - 如何使用 Selenium python 从脚本标签中抓取内容
- python - 如果对话框打开或 excel 正在等待用户,则调用被 win32com 中的被调用者拒绝
- python-3.x - to_csv() 将 E 值更改为科学记数法
- python - geopandas 颜色最接近的形状相同的颜色
- firebase - 离子 3,Firebase | 从数据库中删除数据
- domain-driven-design - 在对事件源域模型进行建模时可以有“技术”事件吗?
- java - 更新共享首选项值得到致命信号 6 (SIGABART) 错误和应用程序崩溃
- mysql - 名字和姓氏的首字母仅在数据库查询中
- jenkins - Jenkins 和 Slack(Jenkins Slack 应用程序不能在脚本中使用)