Unity_自动生成动画

  1. 选中图片组

  2. 设置保存文件位置

  3. 设置文件名称

  4. 设置帧率

  5. 设置切换图片时间

  6. 生成

using UnityEngine;
using UnityEditor;

public class BuildAnimation : EditorWindow
{
    private float frameRate = 30;
    private float frameTime = 1f;
    private string folder = "Anims";
    private string fileName = "newAnim";

    [MenuItem("Tool/CreateClip %Q")]
    static void ShowEditorWindow()
    {
        GetWindow<BuildAnimation>().Show();
    }
    
    private void OnGUI()
    {
        EditorGUILayout.TextField("文件夹", folder);
        fileName = EditorGUILayout.TextField("文件名称", fileName);
        frameRate = EditorGUILayout.FloatField("动画帧率", frameRate);
        frameTime = EditorGUILayout.FloatField("帧【0:01】", frameTime);
        if (GUILayout.Button("创建Anim"))
            CreateClip();
    }

    void CreateClip()
    {
        var obj = Selection.GetFiltered<Object>(SelectionMode.TopLevel);
        obj = Sort(obj);

        var time = 1 / frameRate * frameTime;
        ObjectReferenceKeyframe[] keyFrames = new ObjectReferenceKeyframe[obj.Length + 1];
        for (int i = 0; i <= obj.Length; i++)
        {
            Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(AssetDatabase.GetAssetPath(obj[i==obj.Length?0:i]));
            keyFrames[i] = new ObjectReferenceKeyframe();
            keyFrames[i].time = time * i;
            keyFrames[i].value = sprite;
        }

        AnimationClip clip = new AnimationClip();
        clip.frameRate = frameRate;

        AnimationClipSettings clipSettings = AnimationUtility.GetAnimationClipSettings(clip);
        clipSettings.loopTime = true;
        AnimationUtility.SetAnimationClipSettings(clip, clipSettings);

        EditorCurveBinding curveBinding = new EditorCurveBinding();
        curveBinding.type = typeof(SpriteRenderer);
        curveBinding.propertyName = "m_Sprite";
        AnimationUtility.SetObjectReferenceCurve(clip, curveBinding, keyFrames);
        
        AssetDatabase.CreateAsset(clip, "Assets/"+ folder+"/" + fileName + ".anim");
    }

    Object [] Sort(Object []obj)
    {
        for(int i = 0; i < obj.Length; i++)
        {
            for (int j = i + 1; j < obj.Length; j++)
            {
                if(Strcmp(obj[i].name, obj[j].name) > 0)
                {
                    Swap(ref obj[i], ref obj[j]);
                }
            }
        }
        return obj;
    }

    void Swap(ref Object o1, ref Object o2)
    {
        var tmp = o1;
        o1 = o2;
        o2 = tmp;
    }

    int Strcmp(string a, string b)
    {
        int count = a.Length < b.Length ? a.Length : b.Length;
        for(int i = 0; i < count; i++)
        {
            if (a[i] < b[i])
                return -1;
            else if (a[i] > b[i])
                return 1;
        }
        if (a.Length < b.Length) return -1;
        return 0;
    }
}


好的,关于Unity自动生成敌人和Unity2D AI敌人自动追踪的问题,我可以继续提供一些建议。 对于自动生成敌人,我们可以使用Unity中的预制体(Prefab)来实现。具体地说,你可以在项目中创建一个敌人预制体,包含敌人的模型、动画、碰撞体、脚本等元素。然后,你可以在场景中放置一个空对象作为敌人生成器,编写脚本来实现自动生成敌人的功能。 在脚本中,你可以使用Instantiate方法来生成敌人实例。具体地说,你可以将敌人预制体作为参数传入,生成一个新的敌人实例,并设置它的初始位置、属性等信息。你可以使用Random类来随机生成敌人的位置和属性,使得每次生成的敌人都不同。 对于敌人的自动追踪,你可以使用Unity中的NavMeshAgent组件来实现。具体地说,你可以为敌人添加一个NavMeshAgent组件,使它能够在场景中自动寻路。然后,你可以编写代码来实现敌人的追踪行为,例如让敌人朝向玩家并向其移动。 除此之外,你还可以为敌人添加视野范围、攻击距离等限制,使得敌人只有在一定范围内才会追踪玩家,并只有在一定距离内才会攻击玩家。你可以使用Collider组件和Raycast来实现这些限制。 总的来说,Unity提供了很多方便的工具和功能,可以帮助你实现自动生成敌人和AI追踪等功能。如果你需要更具体的代码实现或者有其他问题,可以继续向我提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值