Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Unity中以编程方式创建动画?_C#_Unity3d - Fatal编程技术网

C# 在Unity中以编程方式创建动画?

C# 在Unity中以编程方式创建动画?,c#,unity3d,C#,Unity3d,在我的游戏中,我有很多装备:盔甲、武器和盾牌。这两者之间的结合是非常巨大的 除此之外,玩家还可以选择在游戏中切换到不同的装甲武器组合。最后,为了解决这个问题,我使用了以下对象结构 每当我切换武器时,我都会激活/停用必要的游戏对象。动画的设置方式如下: 现在,问题是创建动画。我首先考虑以编程方式对所有组合进行预渲染,但我的目录太大了,它可以创建100个,甚至1000个动画。所以我选择了不同的解决方案。在播放时创建动画,一旦我知道玩家会选择什么装备。为此,我创建了一个脚本来处理这个问题。问题是

在我的游戏中,我有很多装备:盔甲、武器和盾牌。这两者之间的结合是非常巨大的

除此之外,玩家还可以选择在游戏中切换到不同的装甲武器组合。最后,为了解决这个问题,我使用了以下对象结构

每当我切换武器时,我都会激活/停用必要的游戏对象。动画的设置方式如下:

现在,问题是创建动画。我首先考虑以编程方式对所有组合进行预渲染,但我的目录太大了,它可以创建100个,甚至1000个动画。所以我选择了不同的解决方案。在播放时创建动画,一旦我知道玩家会选择什么装备。为此,我创建了一个脚本来处理这个问题。问题是我一直在使用来自
UnityEditor
的API,现在我意识到构建将无法工作。特别是因为有两个不同的类:
EditorCurveBinding
ObjectReferenceKeyframe

以下是我在创建动画时如何使用这些类的几个片段:

static EditorCurveBinding GetEditorCurveBinding(字符串路径=”)
{
EditorCurveBinding spriteBinding=新建EditorCurveBinding();
spriteBinding.type=类型(喷洒器);
spriteBinding.path=路径;
spriteBinding.propertyName=“m_Sprite”;
回程螺旋缠绕;
}
静态对象引用关键帧GetKeyframe(浮动时间,精灵精灵)
{
ObjectReferenceKeyframe keyframe=新的ObjectReferenceKeyframe();
keyframe.time=时间/帧速率;
keyframe.value=精灵;
返回关键帧;
}
现在,曲线的问题,我想我设法解决了,用这个代码替换它,用
AnimationCurve
替换
EditorCurveBinding

AnimationClip clip = ...
AnimationCurve curve = new AnimationCurve();
clip.SetCurve(path, typeof(SpriteRenderer), "m_Sprite", curve);
但是我不知道如何为每个动画设置精灵。我认为使用
curve.AddKey
可能会有所帮助,但我没有看到在那里添加精灵的方法

如何重写该代码以避免使用
UnityEditor


就我个人而言,我会完全避免使用内置的动画师和动画,因为该工具用于以预定义方式为单个对象制作动画(例如:用于剪切场景)

离题-表现 除此之外,玩家还可以选择在游戏中切换到不同的装甲武器组合。最后,为了解决这个问题,我使用了以下对象结构

正如您可能知道的那样,这在内存方面效率非常低,并且会降低性能(禁用的对象仍然具有边际CPU开销)。并将增加新对象的加载时间和实例化时间

我可以使用Animator或Animation吗? 因为Animator并没有API来访问它的内部结构和动画类型,总体来说,除了告诉它之外,你们不能对它做任何事情。 因为我知道你的动画是“基于精灵的”,而不是“基于变换的”,任何理智的想法都是低效的

我发誓反对的最佳解决方案如下:

  • 创建要“设置动画”的“触发点”
  • 基于触发点-更改精灵

更好的解决方案? 因为我们已经需要定制结构来管理我们的精灵,所以我们可能想要优化整个过程,因为我们几乎没有使用Animator的任何功能,所以我们可以编写定制控制器来取代Animator。这将大大提高性能,因为动画师非常重

    // MonoBehaviour is optional here
    public class SpriteRendererAnimationHandler
    {
        // More fields that would control the animation timing
        
        public Sprite[] AnimationSprites;
        public SpriteRenderer SpriteRenderer;
        
        public void OnAnimationUpdate(int index)
        {
            var resolvedIndex = ResolveIndex(index);
            SpriteRenderer.sprite = AnimationSprites[resolvedIndex];
        }

        private int ResolveIndex(int index)
        {
            // Resolve animation index to sprite array index
        }
    }

    // One controller per character - or global per game that synchronize all animations to locked FPS 12.
    public class AnimationController : MonoBehaviour
    {
        private List<SpriteRendererAnimationHandler> Handlers = new List<SpriteRendererAnimationHandler>();

        public void FixedUpdate()
        {
            foreach (var handler in Handlers)
            {
                // Calculate animation index
                int calculatedAnimationIndex = ...;
                handler.OnAnimationUpdate(calculatedAnimationIndex);
            }
        }
    }
//这里的单行为是可选的
公共类SpriteEnderAnimationHandler
{
//控制动画计时的更多字段
公共精灵[]动画精灵;
公共喷壶;
OnAnimationUpdate(int索引)上的公共void
{
var resolvedIndex=ResolveIndex(索引);
spritenderer.sprite=AnimationSprites[resolvedIndex];
}
私有整数索引(整数索引)
{
//将动画索引解析为精灵数组索引
}
}
//每个角色一个控制器-或每个游戏一个全局控制器,用于将所有动画同步到锁定的FPS 12。
公共类AnimationController:MonoBehavior
{
私有列表处理程序=新列表();
public void FixedUpdate()
{
foreach(处理程序中的变量处理程序)
{
//计算动画索引
int calculatedAnimationIndex=。。。;
OnAnimationUpdate(calculatedAnimationIndex);
}
}
}

如果某类设备(如剑)的动画始终相同,为什么不创建包含动画的父对象,然后将特定剑添加为子对象?这将使动画与装备分离,您只需要创建一组有限的动画。您的意思是为每个装备创建单独的动画,并将动画传播到不同的游戏对象上?我理解正确了吗?不是每个档位,而是每个档位。e、 g.一个所有剑的动画,一个所有矛的动画,一个所有盾牌的动画等等。然后你可以拥有一个游戏对象,而不需要任何图形来处理动作,并在孩子的时候附加实际的图形/统计/装备逻辑。问题出在动画师身上。状态机一次只能控制一个动画。它不能为每一类装备控制一个单独的动画。为什么不让每个装备有一个动画师,然后在玩家脚本中使用参数触发它呢?否则,你将不得不处理多个并发动画,例如,同时切割和行走。构建我自己的动画系统似乎真的太过分了!没有其他现有的解决方案可以使用吗?第一个解决方案是最好的
    // MonoBehaviour is optional here
    public class SpriteRendererAnimationHandler
    {
        // More fields that would control the animation timing
        
        public Sprite[] AnimationSprites;
        public SpriteRenderer SpriteRenderer;
        
        public void OnAnimationUpdate(int index)
        {
            var resolvedIndex = ResolveIndex(index);
            SpriteRenderer.sprite = AnimationSprites[resolvedIndex];
        }

        private int ResolveIndex(int index)
        {
            // Resolve animation index to sprite array index
        }
    }

    // One controller per character - or global per game that synchronize all animations to locked FPS 12.
    public class AnimationController : MonoBehaviour
    {
        private List<SpriteRendererAnimationHandler> Handlers = new List<SpriteRendererAnimationHandler>();

        public void FixedUpdate()
        {
            foreach (var handler in Handlers)
            {
                // Calculate animation index
                int calculatedAnimationIndex = ...;
                handler.OnAnimationUpdate(calculatedAnimationIndex);
            }
        }
    }