簡體   English   中英

通過 c# 腳本創建統一的 2d 動畫

[英]Create unity 2d animation via c# script

我對統一非常陌生,剛剛開始從事我的第一個項目。 我想知道是否有可能通過腳本而不是手動更改動畫中使用的精靈。

偽代碼示例

Sprite[] animSr = new Sprite[2]{SpriteA, SpriteB};
int animSampleRate = 60;
int[] framesIndex = new int[2]{ 0, 60};
Animation anim = new Animation();

//pseudocode
anim.SetSampleRate(animSampleRate);
anim.UpdateFrame(Sprite = animSr[0], FrameInd = framesIndex[0]);
anim.UpdateFrame(Sprite = animSr[1], FrameInd = framesIndex[1]);

所以結果動畫應該是這樣的動畫

我用 2 個腳本制作了動畫。 動畫生成器.cs


using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
public class AnimationGenerator : MonoBehaviour
{
    private static AnimationGenerator a_instance;
    public static AnimationGenerator Instance
    {
        get
        {
            return a_instance;
        }
    }
    public List<Sprite> Sprites;
    private void Start()
    {
        a_instance = this;
    }
    public AnimationClip Generate()
    {
        AnimationClip animClip = new AnimationClip();
        animClip.frameRate = 25;   // FPS
        EditorCurveBinding spriteBinding = new EditorCurveBinding();
        spriteBinding.type = typeof(Image);
        spriteBinding.path = "";
        spriteBinding.propertyName = "m_Sprite";
        ObjectReferenceKeyframe[] spriteKeyFrames = new ObjectReferenceKeyframe[Sprites.Count];
        for (int i = 0; i <Sprites.Count; i++)
        {
            spriteKeyFrames[i] = new ObjectReferenceKeyframe();
            spriteKeyFrames[i].time = ((float)i / 25); 
            spriteKeyFrames[i].value = Sprites[i];
        }
        AnimationUtility.SetObjectReferenceCurve(animClip, spriteBinding, spriteKeyFrames);
        return animClip;
    }

    public void ClearSprites()
    {
        Sprites.Clear();
    }
}

AnimationGeneratorEditor.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;

public class AnimationGeneratorEditor : EditorWindow
{
    public GameObject obj = null;
    string objNames = "";
    [MenuItem("Animation/AnimationGenerator")]
    public static void ShowWindow()
    {
        EditorWindow.GetWindow(typeof(AnimationGeneratorEditor));
    }
    static void Initialize()
    {
        AnimationGeneratorEditor window = (AnimationGeneratorEditor)EditorWindow.GetWindow(
            typeof(AnimationGeneratorEditor),
            true,
            "Animation Generating Tools"
        );
        window.position = new Rect(0, 0, 250, 150);
    }

    public void OnGUI()
    {
        string path = "";
        objNames = EditorGUI.TextField(new Rect(10, 25, position.width - 20, 20),
            path,
        objNames);
        if (GUI.Button(new Rect(10, 45, position.width - 20, 20), "Generate"))
        {
            AnimationClip animClip = FindObjectOfType<AnimationGenerator>().Generate();
            AssetDatabase.CreateAsset(animClip, "assets/" + objNames + ".anim");
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
        if (GUI.Button(new Rect(10, 68, position.width - 20, 20), "Clear Sprites"))
        {
            FindObjectOfType<AnimationGenerator>().ClearSprites();
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM