概述(Overview)
ImageEffectController 是一个使用 DOTween 实现多种 3D/2D 物体视觉动画效果的组件,挂载在带有 Renderer 的 GameObject 上。
主要功能包括:
- 物体整体动画序列(缩放 + 淡入 + 旋转 + 移动 + 颜色变化 + 抖动)
- 支持单独触发每种动画效果
- 支持重置物体状态(位置、缩放、颜色、透明度、激活状态)
- 动画参数全部公开,可在 Inspector 中调节
- 适用于 UI 图片特效、3D 物体展示、教学引导、物品出现/消失等场景
核心依赖:
- DOTween(所有动画均使用 DOTween 实现)
- 需要物体上有 Renderer 组件(用于材质透明度/颜色控制)
典型使用方式:
- 挂载脚本后,在 Inspector 配置参数
- 调用 AnimateImage() 播放完整组合动画
- 或单独调用 FadeIn()、Scale() 等方法触发单一效果
组件属性(Inspector 可调参数)
| 参数名 | 类型 | 默认值示例 | 说明 |
|---|---|---|---|
| targetScale | Vector3 | (2, 2, 1) | 目标缩放值(通常 z 保持 1) |
| scaleDuration | float | 1f | 缩放动画持续时间(秒) |
| fadeDuration | float | 1f | 淡入/淡出 / 颜色变化的持续时间 |
| fadeIn | bool | true | 是否执行淡入(材质 alpha → 1) |
| fadeOut | bool | false | 是否执行淡出(材质 alpha → 0) |
| targetColor | Color | Color.red | 目标颜色(当 changeColor = true 时使用) |
| changeColor | bool | false | 是否执行颜色渐变 |
| offScreenPosition | Vector3 | (-Screen.width, 0, 0) | 初始屏幕外位置(用于滑入效果) |
| onScreenPosition | Vector3 | (0, 0, 0) | 目标屏幕内位置 |
| moveDuration | float | 1f | 移动动画持续时间 |
| rotationAngle | float | 360f | 旋转角度(绕 Z 轴) |
| rotateDuration | float | 2f | 旋转动画持续时间 |
| shakeStrength | Vector3 | (20, 20, 0) | 抖动强度(x/y 平面抖动) |
| shakeDuration | float | 1f | 抖动持续时间 |
核心方法
AnimateImage
/// <summary>
/// 播放完整的组合动画序列(推荐入口方法)
/// 顺序:淡入/淡出 → 缩放 → 旋转 → 移动 → 颜色变化(并行) → 抖动
/// 动画完成后打印 "All image effects completed"
/// </summary>
public void AnimateImage()
执行流程:
- 激活物体 gameObject.SetActive(true)
- 创建 DOTween Sequence
- 依次/并行添加各种动画
- 最后抖动效果
- OnComplete 回调打印完成日志
典型调用:
// 在其他脚本中
GetComponent<ImageEffectController>().AnimateImage();
ResetImage
/// <summary>
/// 重置物体到初始状态(常用于下次重新播放前准备)
/// - 位置回到 offScreenPosition
/// - 缩放回到 (1,1,1)
/// - 颜色恢复为白色
/// - 透明度设为 0
/// - 物体设为非激活
/// </summary>
public void ResetImage()
推荐用法:在动画播放结束或需要重新展示时调用。
单一效果方法(可单独调用)
| 方法名 | 功能描述 | 动画核心调用 |
|---|---|---|
| FadeIn() | 材质淡入(alpha → 1) | _material.DOFade(1f, fadeDuration) |
| FadeOut() | 材质淡出(alpha → 0) | _material.DOFade(0f, fadeDuration) |
| Scale() | 缩放到 targetScale | transform.DOScale(targetScale, scaleDuration) |
| Rotate() | 绕 Z 轴旋转 rotationAngle 度 | transform.DORotate(..., RotateMode.FastBeyond360) |
| Move() | 从 offScreenPosition 移动到 onScreenPosition | transform.DOLocalMove(onScreenPosition, moveDuration) |
| ChangeColor() | 材质颜色渐变到 targetColor | _material.DOColor(targetColor, fadeDuration) |
| Shake() | 位置抖动 | transform.DOShakePosition(...) |
使用示例:
var effect = GetComponent<ImageEffectController>();
// 只想让物体抖动一下
effect.Shake();
// 单独做淡入 + 放大
effect.FadeIn();
effect.Scale();
内部字段(私有)
| 字段名 | 类型 | 说明 |
|---|---|---|
| _renderer | Renderer | 物体的 Renderer 组件 |
| _material | Material | 当前使用的材质(取自 renderer) |
注意:脚本在 Start() 中自动获取 _renderer 和 _material,若物体没有 Renderer 会导致空引用。