You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中C#脚本调用Animation.Evaluate方法出现CS1061错误求助

问题解决:Unity中Animation类无Evaluate方法的错误

问题原因

你代码里误用了Animation类型来调用Evaluate方法,但Unity的Animation类根本没有这个方法。Evaluate是AnimationCurve类的成员,用来根据时间参数获取曲线对应值,这才是实现弹跳轨迹需要的类型。

修复步骤

  1. 替换类型:把DirectionalBouncePreferences中的Trajectory字段类型从Animation改为AnimationCurve,构造函数的对应参数也同步修改。
  2. 修正拼写错误:代码里的InerpolatePositionTo是拼写错误,改为InterpolatePositionTo避免潜在问题。
  3. 编辑器赋值:在Unity Inspector面板中,给Trajectory字段设置合适的曲线(比如抛物线曲线,模拟弹跳高度变化)。

修改后的完整代码

using System.Collections;
using Coroutines;
using Structures;
using UnityEngine;

namespace Physics
{
    [System.Serializable]
    public class DirectionalBouncePreferences
    {
        public float Duration;
        public float Height;
        public AnimationCurve Trajectory;

        public DirectionalBouncePreferences(float duration, float height, AnimationCurve trajectory)
        {
            Duration = duration;
            Height = height;
            Trajectory = trajectory;
        }
    }

    public class DirectionalBounce
    {
        private readonly Transform _bouncer;
        private CoroutineExecutor _coroutineExecutor;
        private readonly DirectionalBouncePreferences _preferences;

        public DirectionalBounce(Transform bouncer, CoroutineExecutor coroutineExecutor, DirectionalBouncePreferences preferences)
        {
            _bouncer = bouncer;
            _coroutineExecutor = coroutineExecutor;
            _preferences = preferences;
        }

        public void BounceTo(Vector3 target, Vector3 startPosition) =>
            _coroutineExecutor.Start(InterpolatePositionTo(target, startPosition));

        private IEnumerator InterpolatePositionTo(Vector3 target, Vector3 startPosition)
        {
            var timer = new UnityTimer();
            timer.Start(_preferences.Duration);

            while (!timer.IsTimeUp)
            {
                float t = timer.ElapsedTimePercent;
                Vector3 newPosition = CalculatePosition(target, startPosition, t);
                _bouncer.position = newPosition;
                yield return null;
            }
        }

        private Vector3 CalculatePosition(Vector3 target, Vector3 startPosition, float t)
        {
            return Vector3.Lerp(startPosition, target, t) +
                   Vector3.up * _preferences.Trajectory.Evaluate(t) * _preferences.Height;
        }
    }
}

额外优化:_bouncer本身就是Transform类型,无需重复调用_bouncer.transform,直接用_bouncer.position即可。

内容的提问来源于stack exchange,提问作者Nikolai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:50:37