C# 将体素设置为unity3d中的2d精灵的动画。还有比这更好的方法吗?

C# 将体素设置为unity3d中的2d精灵的动画。还有比这更好的方法吗?,c#,animation,unity3d,sprite,voxels,C#,Animation,Unity3d,Sprite,Voxels,我正在制作体素模型,我喜欢它就像我喜欢像素艺术一样。我想在unity中使用的模型是非常小的人形机器人,纯粹用于功能 当我环顾四周寻找为这些体素模型制作动画的方法时,我真正看到的是添加骨骼/装备的方法,创建一个平滑的动画,它掩盖了体素样式 我想让这些体素像2D精灵一样设置动画。例如,我最好的也是迄今为止唯一的跳跃动画技术是销毁站立的体素对象,并在按下“跳跃”时立即实例化跳跃体素模型对象。没有过渡,只是旧式的精灵风格的动画;像马里奥 我的代码将是(显然不是字面意思,但你明白了): 这真的是在统一的基

我正在制作体素模型,我喜欢它就像我喜欢像素艺术一样。我想在unity中使用的模型是非常小的人形机器人,纯粹用于功能

当我环顾四周寻找为这些体素模型制作动画的方法时,我真正看到的是添加骨骼/装备的方法,创建一个平滑的动画,它掩盖了体素样式

我想让这些体素像2D精灵一样设置动画。例如,我最好的也是迄今为止唯一的跳跃动画技术是销毁站立的体素对象,并在按下“跳跃”时立即实例化跳跃体素模型对象。没有过渡,只是旧式的精灵风格的动画;像马里奥

我的代码将是(显然不是字面意思,但你明白了):

这真的是在统一的基础上做这件事的最好方法吗?我正在用qubicle(目前)制作动画的每一帧,使用站立体素作为子对象,然后销毁并实例化与用户输入相关的不同预设(用作动画帧)

有人在没有装备的情况下制作体素动画吗?我找错树了吗

谢谢

如果不清楚,这就是我的意思:

我建议您将体素模型视为2D精灵。每个动画帧都有一个网格,只需切换网格即可。这样就不会产生必须由垃圾收集器收集的垃圾对象

下面是一个基本示例,它只是从第一帧到最后一帧反复运行

class MeshAnimation : MonoBehaviour
{
    public Mesh[] frames = new Mesh[0];
    public float animationSpeed = .1f;

    private float animationStartTime;
    private int currentFrame;

    void Start()
    {
        currentFrame = 0;
        animationStartTime = Time.time;
        UpdateMesh();
    }

    void Update()
    {
        currentFrame = Mathf.FloorToInt((Time.time - animationStartTime) / animationSpeed);
        currentFrame = currentFrame % frames.Length;
        UpdateMesh();
    }

    void UpdateMesh()
    {
        GetComponent<MeshFilter>().mesh = frames[currentFrame];
    }
}
类网格动画:单行为
{
公共网格[]帧=新网格[0];
公共浮动动画速度=.1f;
私有浮动动画开始时间;
私有帧;
void Start()
{
currentFrame=0;
animationStartTime=Time.Time;
UpdateMesh();
}
无效更新()
{
currentFrame=Mathf.FloorPoint((Time.Time-animationStartTime)/animationSpeed);
currentFrame=currentFrame%帧长度;
UpdateMesh();
}
void UpdateMesh()
{
GetComponent().mesh=帧[currentFrame];
}
}

使用这种渲染游戏世界的方法,您可能会发现自己遇到许多令人沮丧的障碍—它与Unity的预期用途不符。诚实地说,为它编写自己的引擎将是理想的。但是在这个孤立的场景中,我要说的是,你不应该为每一帧实例化/销毁对象——只需激活/停用它们,否则你的运行时性能将受到严重影响。啊,好吧,与其销毁它们,不如更改它们。我做完所有的模型后再试试。我认为销毁它们是不对的-谢谢。
class MeshAnimation : MonoBehaviour
{
    public Mesh[] frames = new Mesh[0];
    public float animationSpeed = .1f;

    private float animationStartTime;
    private int currentFrame;

    void Start()
    {
        currentFrame = 0;
        animationStartTime = Time.time;
        UpdateMesh();
    }

    void Update()
    {
        currentFrame = Mathf.FloorToInt((Time.time - animationStartTime) / animationSpeed);
        currentFrame = currentFrame % frames.Length;
        UpdateMesh();
    }

    void UpdateMesh()
    {
        GetComponent<MeshFilter>().mesh = frames[currentFrame];
    }
}