创造你的世界
玩家及角色:进阶

使用动画事件

13
动画事件提供了一种在动画剪辑的特定时间调用自定义函数或执行操作的方法。 这允许动画与脚本之间的交互,并在动画的确切时机执行操作时非常有用。 向对象动画添加事件 以下示例向一个动画对象添加了一个动画事件。 该结构在每次执行事件时将信息输出到控制台日志,通过向上下重复的动画添加一个向上事件和一个向下事件。 1\) 选择 gameobject > 3d 对象 > 立方体,以在场景中创建一个立方体。 选择创建的立方体,并通过单击检查器面板中的添加组件按钮添加 animator 组件。 将立方体 animator controller 应用到添加的 animator。 将立方体动画剪辑应用到立方体 animator controller 的入口,以便在播放场景时可以播放立方体动画。 请参考以下指南以进行 animator 注册和动画剪辑编辑。 📘 unity 动画事件指南 https //docs unity3d com/kr/current/manual/script animationwindowevent html https //docs unity3d com/kr/current/manual/script animationwindowevent html 📘 unity 学习动画教程 https //learn unity com/tutorial/may 18 animation?language=en# https //learn unity com/tutorial/may 18 animation?language=en# 2\) 将以下属性添加到立方体动画剪辑中。 在立方体动画剪辑的0秒和2秒部分有一个位置关键帧(x 0, y 0, z 0)。 在立方体动画剪辑的1秒部分有一个位置关键帧(x 0, y 1, z 0)。 (1) 在立方体动画剪辑的1秒部分注册一个动画事件。 函数:调用 字符串:向上 (2) 在立方体动画剪辑的2秒部分注册一个动画事件。 函数:调用 字符串:向下 在unity中通过c#编写动画事件时,函数名称写在function中。 然而,为了在typescript中调用动画事件,invoke必须写在function中,函数名称必须写在string中,参数值。 3\) 创建项目 > 创建 > zepeto > typescript,并将其重命名为objectanimationcontroller。 编写如下示例脚本。 objectanimationcontroller ts import { zepetoscriptbehaviour } from 'zepeto script' export default class objectanimationcontroller extends zepetoscriptbehaviour { public up() { console log(`cube is up`); } public down(){ console log(`cube is down`); } } 4\) 如果你按下播放按钮运行它,你可以看到在立方体动画播放时控制台日志输出。 使用动画事件在本地角色上播放脚步声。 为了将动画事件添加到zepeto角色的animator中,事件必须在运行时添加,即在角色创建时。 以下示例在运行时将事件应用于本地玩家animator的特定动画剪辑,并在事件触发时播放脚步声。 1\) 创建一个 footstepcontroller 脚本,该脚本将应用于本地玩家的动画器对象。footstepcontroller 负责向 animator 添加动画事件。 创建项目 > 创建 > zepeto > typescript,并将其重命名为 footstepcontroller。 按照以下方式编写脚本。 footstepcontroller ts import { animationevent, animator, audioclip, audiosource } from 'unityengine'; import { zepetoscriptbehaviour } from 'zepeto script'; export default class footstepcontroller extends zepetoscriptbehaviour { // 用于脚步声效果的声音 public footstepsound audioclip; // 播放脚步声的音频源 private zepetoaudio audiosource; // 添加动画事件以触发脚步声 public addanimationevent() { // 获取附加到此游戏对象的 animator 组件 const anim = this getcomponent\<animator>(); // 检查 animator 组件是否存在 if (anim != null) { // 创建用于脚步声的 audiosource this setaudio(); // 指定在动画剪辑中播放脚步声的时间 const runsoundeventtimes = \[0 1, 0 6]; // 向指定的动画剪辑添加动画事件 this addanimationclipevent(anim, "move walk", runsoundeventtimes); } } // 设置用于播放脚步声的 audiosource private setaudio() { // 创建并配置 audiosource 组件 this zepetoaudio = this gameobject addcomponent\<audiosource>(); this zepetoaudio clip = this footstepsound; } // 激活脚步声 public activatefootsteps() { // 输出日志消息,指示脚步声正在播放 console log("脚步声!"); // 使用配置的 audiosource 播放脚步声 this zepetoaudio play(); } // 向指定的动画剪辑添加动画事件 private addanimationclipevent(anim animator, clipname string, eventtimes number\[]) { // 初始化动画剪辑的索引 let animationclipindex number; // 从 runtimeanimatorcontroller 获取所有动画剪辑 const clips = anim runtimeanimatorcontroller animationclips; // 查找指定动画剪辑的索引 for (let i = 0; i < clips length; i++) { if (clips\[i] name == clipname) { animationclipindex = i; } } // 遍历指定的事件时间 eventtimes foreach(eventtime => { // 创建一个新的 animationevent 用于触发脚步声 const newevent animationevent = new animationevent(); newevent time = eventtime; newevent functionname = "invoke"; newevent stringparameter = "activatefootsteps"; // 将新的 animationevent 添加到动画剪辑中 clips\[animationclipindex] addevent(newevent); }); } } 脚本描述 footstepcontroller 在事件发生时添加动画事件并播放脚步音效。 setaudio() 将 audiosource 组件添加到对象上以应用脚步音效。 addanimationclipevent() 将动画事件添加到指定的动画剪辑中。您必须将以下元素作为参数值。 本地玩家的 animator 应用事件的动画剪辑名称 应用事件的动画时间数组 在通过 addanimationclipevent() 注册的新事件中,设置了以下项目。 (1) newevent time 事件触发时的动画时间。值为0表示全长的开始,值为1表示全长的结束。 (2) newevent functionname 事件触发的函数名称。在typescript中,应将其类型设置为"invoke"。 (3) newevent stringparameter 事件执行函数时设置的参数值。typescript列出了要执行的函数名称。 当事件发生时,执行activatefootsteps()并播放脚步声。 2\) 现在创建一个footstepmanager,当本地玩家在运行时创建时,将footstepcontroller组件添加到本地玩家的animator对象中。 项目 > 创建 > zepeto > typescript,并将其重命名为footstepmanager。 按照以下方式编写脚本。 footstepmanager ts import { spawninfo, zepetoplayers } from 'zepeto character controller' import { zepetoscriptbehaviour } from 'zepeto script' import footstepcontroller from ' /footstepcontroller' import { worldservice } from 'zepeto world' import { audioclip } from 'unityengine'; export default class footstepmanager extends zepetoscriptbehaviour { // 要播放的脚步声 public footstepsound audioclip; start() { // 当本地玩家被添加时的事件监听器 zepetoplayers instance onaddedlocalplayer addlistener(() => { // 访问本地玩家的zepeto角色 const zepetocharacter = zepetoplayers instance localplayer zepetoplayer character; // 将footstepcontroller脚本附加到zepetoanimator的gameobject const footstepcontroller = zepetocharacter zepetoanimator gameobject addcomponent\<footstepcontroller>(); // 为footstepcontroller设置footstepsound footstepcontroller footstepsound = this footstepsound; // 添加动画事件以触发脚步声 footstepcontroller addanimationevent(); }); } } 脚本描述 在footstepmanager检测到本地玩家被添加后,它将footstepcontroller脚本附加到玩家的zepetoanimator的gameobject上。 footstepcontroller负责添加播放脚步声的动画事件。 由animator的动画事件执行的函数的脚本必须完全应用于相应的animator组件所应用的对象。 因此,您需要找到zepetoanimator gameobject并将footstepcontroller脚本作为addcomponent应用。 3\) 将脚步声应用于 footstepmanager 的 footstepsound。 4\) 如果您按下播放按钮运行它,您可以看到声音会根据本地玩家的步伐在他们走路时播放。 👍 提示 zepeto 基础动画师的行走状态由多个动画混合和状态组成。 由于示例仅将声音应用于 move walk 状态,您可以自定义 addanimationclipevent() 并直接输入到快速行走和奔跑等状态中。 当声音应用于多个动画状态时,由于动画混合,脚步声可能会重叠。为了解决这个问题,编写一个额外的条件语句,以便在 animationevent animatorclipinfo weight 为 0 5 时播放相应的声音。 ❗️ 已知问题 按照开发指南样式实施时,可能会出现以下错误消息,但执行应该没有问题。