Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity输入系统按钮触发多次_C#_Unity3d_Input - Fatal编程技术网

C# Unity输入系统按钮触发多次

C# Unity输入系统按钮触发多次,c#,unity3d,input,C#,Unity3d,Input,所以我一直在玩新的输入系统,事情开始变得有点令人沮丧。我的问题是按钮按下会多次触发。我尝试了多种动作类型的设置(如按钮、传递等),而将交互设置为仅按、释放或其他方式似乎并不重要。根据设置,它将发射2次或4次 我有多个控制器在这里测试,似乎这还不够混乱,如果第二个或更多的球员加入,他们的按钮按下触发器只有一次。总是只有玩家自己的按钮才会触发多次。有人知道如何解决这个问题吗 看来我不是唯一一个 这里是我非常简单的基本测试代码,仅供参考 public void GetInteractValues( I

所以我一直在玩新的输入系统,事情开始变得有点令人沮丧。我的问题是按钮按下会多次触发。我尝试了多种动作类型的设置(如按钮、传递等),而将交互设置为仅按、释放或其他方式似乎并不重要。根据设置,它将发射2次或4次

我有多个控制器在这里测试,似乎这还不够混乱,如果第二个或更多的球员加入,他们的按钮按下触发器只有一次。总是只有玩家自己的按钮才会触发多次。有人知道如何解决这个问题吗

看来我不是唯一一个

这里是我非常简单的基本测试代码,仅供参考

public void GetInteractValues( InputAction.CallbackContext value )
 {
     if ( value.started )
         print("foo");
 }

这个问题是团结内部的一个缺陷。解决方案是在玩家及其预设(仅在玩家1上)开火时检查玩家预设是否在场景中。除了检查按钮回调外,还可以使用以下命令

gameObject.scene.IsValid()

这个问题是团结内部的一个缺陷。解决方案是在玩家及其预设(仅在玩家1上)开火时检查玩家预设是否在场景中。除了检查按钮回调外,还可以使用以下命令

gameObject.scene.IsValid()

我不知道这是否有任何帮助,但我一直在努力使用新的输入系统。与Input.GetButtonDown()相比,我看到的代码示例看起来过于复杂,因此我尝试使用播放器输入组件。我直接选择Behavior==使用Unity事件,因为它允许我将动作链接到脚本中的函数/方法。从理论上讲,这听起来不错,但随后我的函数被多次触发

这就是Unity事件的工作方式:“开始->执行->取消”

,必须将
行为设置为
发送消息
,并将函数/方法设置为
public void OnActionName()
,例如操作:
Jump
,方法:
OnJump()

我这样做了,但它仍然触发了多次。因此,在
输入操作中
需要将
交互设置为
,但请记住
Lt
Rt
是可变的(即,稍微推一点以拍摄一点,再用力推一点以拍摄…更用力的IDK),因此取消选中按下点旁边的默认值并将其设置为
1


真希望4天前有人能给我解释一下。希望它能帮助别人。

我不知道这是否有任何帮助,但我一直在努力使用新的输入系统。与Input.GetButtonDown()相比,我看到的代码示例看起来过于复杂,因此我尝试使用播放器输入组件。我直接选择Behavior==使用Unity事件,因为它允许我将动作链接到脚本中的函数/方法。从理论上讲,这听起来不错,但随后我的函数被多次触发

这就是Unity事件的工作方式:“开始->执行->取消”

,必须将
行为设置为
发送消息
,并将函数/方法设置为
public void OnActionName()
,例如操作:
Jump
,方法:
OnJump()

我这样做了,但它仍然触发了多次。因此,在
输入操作中
需要将
交互设置为
,但请记住
Lt
Rt
是可变的(即,稍微推一点以拍摄一点,再用力推一点以拍摄…更用力的IDK),因此取消选中按下点旁边的默认值并将其设置为
1

真希望4天前有人能给我解释一下。希望它能帮助别人。

LexGear在这里回应说,检查游戏对象是否在有效场景中是一个解决方案,另一个解决方案是检查游戏对象是否处于活动状态:

public void Move(InputAction.CallbackContext ctx)
{
    // to avoid prefab dispatching the event...
    if (!gameObject.activeInHierarchy) // or if (!gameObject.scene.IsValid())
    {
        return;
    }

    // do things with the event
}
在我的例子中,我在awake方法中执行了该检查,以避免在每个输入事件上执行该检查。我之所以能够做到这一点,是因为我注册了C#event以将输入事件分派给多个对象:

void Awake()
{
    // to avoid prefab dispatching the event...
    if (!gameObject.activeInHierarchy)
    {
        return;
    }

    OnMove += playerController.Move;
}
正如LexGear在这里回应的那样,检查游戏对象是否在有效场景中是一个解决方案,另一个解决方案是检查游戏对象是否处于活动状态:

public void Move(InputAction.CallbackContext ctx)
{
    // to avoid prefab dispatching the event...
    if (!gameObject.activeInHierarchy) // or if (!gameObject.scene.IsValid())
    {
        return;
    }

    // do things with the event
}
在我的例子中,我在awake方法中执行了该检查,以避免在每个输入事件上执行该检查。我之所以能够做到这一点,是因为我注册了C#event以将输入事件分派给多个对象:

void Awake()
{
    // to avoid prefab dispatching the event...
    if (!gameObject.activeInHierarchy)
    {
        return;
    }

    OnMove += playerController.Move;
}