Animation控制单条动画播放(手动设置起始帧、结束帧) 📅 发布时间:2026/7/4 18:10:28 👁️ 浏览次数: 代码如下using System.Collections; using UnityEngine; // 强制挂载Animation组件避免忘记添加 [RequireComponent(typeof(Animation))] public class Test : MonoBehaviour { private Animation _anim; // 自身的Animation组件 private AnimationState _animState;// 要控制的单条动画状态核心控制对象 public string animClipName ; // 要控制的动画片段名和Animation组件中一致空则用默认片段 public float animFrameRate 30f; // 【配置】动画帧率Animation窗口查看的数值 private float _startTime; // 实时计算的起始时间秒 private float _stopTime; // 实时计算的停止时间秒 private bool _isPlaying false; // 动画播放状态标记 void Start() { // 初始化组件和动画状态只执行一次无需重复初始化 _anim GetComponentAnimation(); InitAnimState(); // 初始化动画为单次播放 if (_animState ! null) _animState.wrapMode WrapMode.Once; // 【调用示例1】立即播放从0帧开始30帧停止无延时 // StartCoroutine(PlayAnimFromSpecifiedFrame(0, 30)); // 【调用示例2】延时播放延时2秒从5帧开始40帧停止 StartCoroutine(PlayAnimFromSpecifiedFrame(450, 500, 2f)); } void Update() { // 动画正在播放时逐帧检测是否到达停止帧逻辑不变复用实时计算的_stopTime if (_isPlaying _animState ! null) { if (_animState.time _stopTime) { PauseAnim(); Debug.Log($动画已在{Mathf.Round(_stopTime * animFrameRate)}帧停止); } } } #region 初始化AnimationState逻辑完全不变 private void InitAnimState() { if (_anim null || _anim.GetClipCount() 0) { Debug.LogError(请先给Animation组件添加动画片段, gameObject); return; } if (string.IsNullOrEmpty(animClipName)) { animClipName _anim.clip.name; _animState _anim[animClipName]; } else { _animState _anim[animClipName]; if (_animState null) { Debug.LogError($Animation组件中未找到名为{animClipName}的动画片段, gameObject); } } } #endregion #region 核心改造协程版 - 带延时实时帧参数 播放动画 /// summary /// 协程版指定帧区间播放动画支持延时调用实时传帧参数 /// /summary /// param namestartFrame本次播放的起始帧实时传参/param /// param namestopFrame本次播放的停止帧实时传参/param /// param namedelay延时播放时间秒默认0立即播放/param /// returns协程迭代器/returns public IEnumerator PlayAnimFromSpecifiedFrame(int startFrame, int stopFrame, float delay 0f) { // 前置校验动画状态为空/帧参数非法直接退出 if (_animState null) yield break; if (startFrame 0 || stopFrame 0) { Debug.LogError(帧参数不能为负数, gameObject); yield break; } if (startFrame stopFrame) { Debug.LogError(起始帧不能大于停止帧, gameObject); yield break; } // 第一步延时逻辑delay0时等待默认0则直接执行 if (delay 0f) { Debug.Log($动画将延时{delay}秒播放区间{startFrame}帧 → {stopFrame}帧); yield return new WaitForSeconds(delay); } // 第二步实时计算帧对应的时间核心不再依赖Inspector配置随参数变化 _startTime startFrame / animFrameRate; _stopTime stopFrame / animFrameRate; // 第三步停止其他动画重置并播放当前动画重复调用自动重置 _anim.Play(animClipName, PlayMode.StopAll); // 停止其他动画避免冲突 _animState.time _startTime; // 跳转到实时传入的起始帧 _animState.speed 1f; // 恢复播放速度 _isPlaying true; // 更新播放状态 Debug.Log($动画{animClipName}开始播放区间{startFrame}帧 → {stopFrame}帧); } #endregion #region 手动控制播放/暂停/重新播放逻辑完全不变可正常使用 public void PauseAnim() { if (_animState null || !_isPlaying) return; _animState.speed 0f; _isPlaying false; } public void ResumeAnim() { if (_animState null || _isPlaying) return; _animState.speed 1f; _isPlaying true; } /// summary /// 重新播放指定帧区间封装协程调用方便外部直接调用 /// /summary /// param namestartFrame起始帧/param /// param namestopFrame停止帧/param /// param namedelay延时时间/param public void ReplayAnim(int startFrame, int stopFrame, float delay 0f) { StartCoroutine(PlayAnimFromSpecifiedFrame(startFrame, stopFrame, delay)); } #endregion #region 辅助方法帧转时间备用 private float FrameToTime(int frame) { return frame / animFrameRate; } #endregion // 编辑器调试实时显示当前播放帧适配实时传参的帧区间 void OnDrawGizmosSelected() { Gizmos.color Color.red; Gizmos.DrawWireSphere(transform.position Vector3.up * 2, 0.5f); float currentFrame _animState null ? 0 : Mathf.Round(_animState.time * animFrameRate); UnityEditor.Handles.Label(transform.position Vector3.up * 3, $当前帧{currentFrame}\n本次停止帧{Mathf.Round(_stopTime * animFrameRate)}); } }
【 2025 年终总结】被推着走的一年,需要停下来思考 生活从不按计划 从 2025 年底开始规划,一直到 2026 年 2 月的一天深夜,我才真正开始动笔。第三年写年终总结—按四舍五入的算法,也算是工作的第三年。 回看 2024 年立下的 Flag,最接近“完成”的,竟然还是「持续输出博… 2026/7/4 6:55:25
别再用“雌竞变现”去曲解女性的出片行为了 别用“雌竞变现”曲解女性的出片:镜头里的美好,从不是为了讨好谁 目录 别用“雌竞变现”曲解女性的出片:镜头里的美好,从不是为了讨好谁最近听到一种说法,说女性总爱拍美照、发朋友圈、追求“出片”,本质是… 2026/7/4 12:56:56
学术写作效率革命!2026 高精准度 AI 论文写作工具推荐指南 2026年AI论文写作工具已进入全流程闭环学术合规时代,PaperRed(综合评分99分)与毕业之家(综合评分87分)为中文学术场景双标杆;Grammarly Academic与Elicit为英文论文写作首选;按需求匹配度-数据可… 2026/5/17 2:29:38
Spring Security企业级安全方案:从认证授权到审计监控的完整闭环设计 1. 项目概述:为什么企业级安全方案是Spring Security的终极考验 最近在社区里看到不少朋友在讨论Spring Security,大家的问题大多集中在“如何快速集成登录”、“怎么配置权限注解”这些基础操作上。这当然没错,但对于一个真正要上生产环境&a… 2026/7/4 18:09:15
Kali Linux渗透测试入门:从零到实战的完整学习路径 1. 项目概述:为什么选择Kali作为网络安全入门的起点?如果你对网络安全感兴趣,想从零开始学习渗透测试,那么Kali Linux几乎是你绕不开的名字。它不是一个普通的操作系统,而是一个为安全专家和爱好者量身定制的“武器库”… 2026/7/4 18:01:13
PHP反序列化漏洞:从CTF入门到实战攻防与防御指南 1. 项目概述:从一道CTF题到真实世界的攻防 最近在复盘一些经典的CTF Web题目,其中一道关于PHP反序列化的题让我感触颇深。它不像那些复杂的综合渗透场景,就是一段看似无害的、处理用户数据的代码,却因为一个 unserialize() 函数… 2026/7/4 17:59:12
高校AIGC检测标准解析与论文优化指南 1. 毕业论文AIGC检测标准全解析2026年毕业季,AIGC检测已成为高校论文审查的标配环节。作为一名经历过完整论文写作与检测流程的过来人,我深刻理解同学们面对这项新规时的困惑与焦虑。不同高校的标准差异之大,往往让人摸不着头脑。本文将基于最… 2026/7/4 17:57:12
Python+AI羽毛球平台开发实战 1. 羽毛球爱好者平台的设计与实现作为一名长期关注体育科技领域的开发者,我发现羽毛球运动在国内有着庞大的爱好者群体,但现有的线上平台大多功能单一,缺乏专业的数据分析和社交互动能力。最近我用PythonAI技术结合微信小程序生态,… 2026/7/4 17:55:12
MLWE-1024同态加密技术如何将基因数据密文膨胀率降至1:48 1. 项目概述:当基因数据遇见全同态加密最近几年,基因测序成本断崖式下跌,从当年的“人类基因组计划”耗资数十亿美元,到现在几千块人民币就能做一次全基因组测序。数据量是爆炸了,但一个核心问题也摆在了所有从业者面前… 2026/7/4 17:53:10
STM32F745VG与MC6470 IMU的高性能姿态控制系统设计 1. MC6470与STM32F745VG的黄金组合解析在工业自动化和机器人控制领域,传感器与微控制器的协同工作能力直接决定了系统的响应速度和定位精度。MC6470作为一款6自由度惯性测量单元(6DOF IMU),与STM32F745VG这款基于ARM Cortex-M7内核的高性能微控制器组合&… 2026/7/4 0:00:28
Playwright自动化测试实战:从零搭建现代Web测试框架 1. 项目概述:为什么是 Playwright?如果你正在为现代 Web 应用的自动化测试头疼,尤其是面对那些充斥着动态加载、复杂交互的单页应用(SPA),那么 Playwright 的出现,很可能就是你的解药。我接触过… 2026/7/4 0:00:28
终极指南:如何将JSXBIN二进制文件转换为可读JSX源代码 终极指南:如何将JSXBIN二进制文件转换为可读JSX源代码 【免费下载链接】jsxbin-to-jsx-converter JSXBin to JSX Converter written in C# 项目地址: https://gitcode.com/gh_mirrors/js/jsxbin-to-jsx-converter 你是否曾经面对过Adobe产品的JSXBIN文件感到… 2026/7/4 0:02:28