文章目录
- unity2022.1.8之后版本的新的输入行为控制对象变化
- 怎么导入?
- 如何使用?
unity2022.1.8之后版本的新的输入行为控制对象变化
我们先了解大概的逻辑。我们要设置触发行为的方式并且让他和对象的行为绑定,再将行为和对象绑定,最后再绑定对应对象的行为函数里的函数方法,实现我们要的通过触发来控制对象变化。

在那之前,我们要先导入对应的包。
怎么导入?
先在系统设置里去启动新的输入方式。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o4PuoTEI-1676079644524)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230210093710374.png)]](https://img-blog.csdnimg.cn/e725f6d1baff4c2e9abb0a1647233e80.png)
然后会有提醒,让我们重启。
去仓库里把对应新版本的包下载下来。

然后就可以使用了。
如何使用?
- 创建行为和对应触发方式
在任意文件夹下右键 >create>Input Actions 创建对应的绑定文件。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MH4iT0Zm-1676079644527)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230210101815002.png)]](https://img-blog.csdnimg.cn/43f5f2826458465ab5cd23682f0a2d2b.png)



这样frog对象的行为我们就设置好了,接下来就只需要让他和我们的图中对象进行绑定就好了。
-
将刚才行为的触发方式和对象绑定。

-
创建对应的反应函数:

-
把做出的变化绑定到对象上

我们编辑下具体要做出的动作:在按下跳跃键后输出台会输出 “起跳!!!!!”。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayController : MonoBehaviour
{
public void jump()
{
Debug.Log("起跳!!!!!");
}
}
我们再把它和行为绑定。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C92xhbAn-1676079644532)(C:/Users/86188/AppData/Roaming/Typora/typora-user-images/image-20230210145516419.png)]](https://img-blog.csdnimg.cn/1eda419b59c74d5fac6e5d55eea74db8.png)
这样,我们就可以看到 "起跳!!!!!"被执行了。恭喜你,已经学会了如何去将触发和人物的变化进行绑定。

之后是DLC,记录了一个小问题。
DLC : 结果被执行了两次
"起跳!!!!!"被执行了,但被执行了两次。
为什么呢?
我们再加入一个回调参数,帮助我们观察这之中究竟发生了什么。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayController : MonoBehaviour
{
public void jump(InputAction.CallbackContext context)//这里加入回调参数
{
Debug.Log("起跳!!!!!" + context);
}
}
之后需要重新选择下函数。

我们看下结果:

可以发现如果我们不刻意规定,它默认是在 开始阶段 和 达到操作要求阶段 都会执行我们要的操作,这显然是不合理的。
我们加个 if 规范下它。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class PlayController : MonoBehaviour
{
public void jump(InputAction.CallbackContext context)
{
//TODO:这个todo是标记我们要在这个函数里做什么,除此之外没什么蛋用。
//如果玩家已经达到操作触发要求,那么打印 “起跳!!!!!”
if(context.phase == InputActionPhase.Performed) Debug.Log("起跳!!!!!" + context);
}
}
可以发现这样的话,就只打印了一次。

问题圆满解决!!! 撒花!!!!



















