- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 Unity3D 2017 版中,您可以通过执行以下操作一次添加多个 EventTriggers
:
for (int i = 0; i < 20; i++)
{
EventTrigger.Entry pDown = new EventTrigger.Entry();
pDown.eventID = EventTriggerType.PointerDown;
pDown.callback.AddListener((eventdata) => { InventorySlotCopy(); });
slots[i].GetComponent<EventTrigger>().triggers.Add(pDown);
EventTrigger.Entry pUp = new EventTrigger.Entry();
pUp.eventID = EventTriggerType.PointerUp;
pUp.callback.AddListener((eventdata) => { InventorySlotInsert(); });
slots[i].GetComponent<EventTrigger>().triggers.Add(pUp);
}
slots
只是 GameObjects
的 array
,每个都有一个 Image
和一个 EventTrigger
附加到它。
但是,在 Unity3D 版本 2019 中使用与上面相同的代码会导致添加那些 EventTriggers
但不会将 functions
分配给 Listener
.
Unity2019 是怎么做到的?
最佳答案
您将看不到检查器中添加的监听器!
在 Inspector 中,您只能看到永久 监听器,而不是在运行时添加的监听器!这些基本上是 UnityEvent<BaseEventData>
所以看Manual: UnityEvents
When a
UnityEvent
is added to aMonoBehaviour
it appears in the Inspector and persistent callbacks can be added.
添加永久 监听器的唯一方法是通过检查器或自定义 EditorScript!但这无论如何都不是您想在这里做的。
我会稍微修改您的脚本以使其更安全。我只是在方法被调用时记录一些消息,以表明它们被调用了。
public class Example : MonoBehaviour
{
// Rather make these directly of type EventTrigger
// So you don't have to use GetComponent later and can be sure that these array only receives
// objects that actually have that Component attached!
public EventTrigger[] slots;
private void Start()
{
// Instead of a hardcoded index either iterate using slots.Length
// or simply directly foreach
foreach (var slot in slots)
{
var pDown = new EventTrigger.Entry
{
eventID = EventTriggerType.PointerDown
};
pDown.callback.AddListener(eventData => { InventorySlotCopy(); });
slot.triggers.Add(pDown);
var pUp = new EventTrigger.Entry
{
eventID = EventTriggerType.PointerUp
};
pUp.callback.AddListener(eventData => { InventorySlotInsert(); });
slot.triggers.Add(pUp);
}
}
private void InventorySlotCopy()
{
Debug.Log(nameof(InventorySlotCopy));
}
private void InventorySlotInsert()
{
Debug.Log(nameof(InventorySlotInsert));
}
}
其余的取决于您的设置。我们不知道你的对象是什么 slots
是,但基本上有两(三)种选择:
如果这些槽对象是UI
Canvas
中的元素例如Image
或 Text
.
这似乎是您的具体情况。
确保有一个 EventSystem
出现在现场。
通常在创建第一个 Canvas
时创建一个.
如果不是现在通过 Hierachy View
创建它→ 右键单击 → UI
→ EventSystem
确保您有选项 RayCast Target
在您广告位的 UI 组件上启用。
结果:
只是为其他用户添加这个。
如果这些对象不是 UI 元素而是 3D 对象,请确保
您同样需要 EventSystem
和以前一样
插槽有 Collider
附加到相同的组件 GameObject
EvenTrigger
组件附加到或其任何子项(它可以嵌套)。
你的 Camera
需要组件 PhysicsRaycaster
随附的。在这里确保 eventMask
包括放置插槽对象的图层。 (对于使用 2D 碰撞器的选项 3,请改用 Physics2DRaycaster
)
结果:
如您所见,这些方法在 Inspector 中不可见(由于前面提到的原因),但添加的监听器方法仍会被调用。
关于c# - Unity3D_2019 : Adding EventTriggers at runtime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61138585/
我正在尝试从以下路径中提取一组关键字,例如 ['lemon', 'apple', 'coconut'] 等"\var\prj\lemon_123\xyz","\var\prj\123_apple\co
每次当我尝试连接到发送 servage smpt 时,它都会给我一个错误: SMTP connect() failed. 我尝试以下设置: include('res/mailer/class.phpm
我正在尝试通过 cpanel cron 作业面板提交 MySQL 备份脚本,但我收到了我不理解的错误。我已经在我的 Ubuntu 上尝试了这个命令 mysqldump -u(USERNAME) -p(
我喜欢将测试程序的输出记录到带有时间戳的日志文件中。 我创建了以下 Makefile,但它不起作用。 “make”似乎在最后一刻根据需要计算 LOGFILE。 生成文件 LOGFILE=`date +
我是一名优秀的程序员,十分优秀!