zoukankan      html  css  js  c++  java
  • 基于2d Tool Kit 精灵合图,动作生成工具

    http://blog.csdn.net/onerain88/article/details/18563687

    2d Tool Kit 是一款出色的基于unity3d 开发2d游戏的工具,提供了丰富的编辑器工具和教程,是基于unity3d开发2d游戏的不二之选。

    (PS:建议在unity3d 4.3版本(Native2D)没有稳定之前或者对新技术还不是很熟悉的情况下,可以考虑继续使用2d Tool Kit)。

    1. 需求

    2d游戏中最重要的概念就是Sprite了,而制作一般2d游戏都离不开Sprite的序列帧,比如一般的RPG游戏的角色有 待机,行走,攻击,被击,各种技能...动作,tk2d提供的文档里介绍的是一种很酷的点击,拖拽方式就可以完成,大概流程如下:

    (1)将某个角色所有动作序列帧合成tk2dSpriteCollection(根据不同需求同一个tk2dSpriteCollection可能包括多个角色,根据需求变通)

    (2)创建tk2dSpriteAnimation对象,根据动作需求创建tk2dSpriteAnimationClip对象,添加至之前创建的tk2dSpriteAnimation对象中

    (PS:具体操作请参考tk2d文档)

    看似非常简单的操作,但是当角色和动作数量比较多的时候,这个工作就变得非常枯燥了(尤其是对于程序员...),我们仔细观察这个枯燥的工作,发现其中的工作是有规律并且重复的工作,对于程序来说,最擅长解决的问题就是有规律并且重复的工作了!

    (PS:对于程序员来说,没有规律创造规律也要上!)

    最后的需求定义为:通过程序解决项目中角色及其动作的生成工作!

    2. 约定

    当确定好需求之后,我们要和美术做一些约定,约定如下:

    (1)按不同角色将角色分组目录,比如 Hero,Monster,NPC...

    (2)在角色目录下,按动作再分组目录,比如 Idle,Attack,Move...

    (3)在不同的动作目录下,依次存放这个动作的所有序列帧,比如 Idle0001, Idle0002...Idle0010

    3. 实现

    我们所需要编程解决的问题,就是完成需求中提出的手动步骤!

    (这个Demo使用的资源是tk2d中的creating a sprite animation资源)

    (1)将角色所有动作序列帧合成tk2dSpriteCollection

    为了简单,我从tk2d中引用了两个方法,分别为创建tk2dSpriteCollection和tk2dSpriteAnimation的Prefab

    (PS:由于两个方法为普通方法,并非工具方法,于是我无耻的拷贝到了我的代码之中,为了美观,我就不贴了,最后会贴出Demo下载地址)

    [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
     
    1. string heroName = "Hero";  
    2. // 1. New Sprite Collection  
    3. tk2dSpriteCollection sc = CreateSpriteCollection(heroName);  
    4. // 2. Collect Sprites' Texture Params  
    5. List<tk2dSpriteCollectionDefinition> scDefList = new List<tk2dSpriteCollectionDefinition>();  
    6. DirectoryInfo heroDI = new DirectoryInfo(Application.dataPath + "/Hero/");  
    7. DirectoryInfo[] animDIArr = heroDI.GetDirectories();  
    8. foreach (DirectoryInfo animDI in animDIArr)  
    9. {  
    10.     FileInfo[] frameFIArr = animDI.GetFiles("*.png");  
    11.     foreach (FileInfo frameFI in frameFIArr)  
    12.     {  
    13.         tk2dSpriteCollectionDefinition frameSCDef = new tk2dSpriteCollectionDefinition();  
    14.         string framePath = "Assets/" + heroName + "/" + animDI.Name +   
    15.                 "/" + frameFI.Name;  
    16.         Texture2D frameTex = AssetDatabase.LoadAssetAtPath(framePath, typeof(Texture2D)) as Texture2D;  
    17.         if (frameTex == null)  
    18.             EditorUtility.DisplayDialog("Error", "Texture2D Is NULL: " + frameFI.Name, "OK");  
    19.         frameSCDef.name = frameTex.name;  
    20.         if (!CheckSpriteNameInSC(scDefList, frameTex.name))  
    21.         EditorUtility.DisplayDialog("Error", "Duplicated Frame Name: " + frameTex.name, "OK");  
    22.         // 这里是对每个序列帧属性的设置,根据需求可以自定义默认生成属性  
    23.         frameSCDef.colliderType = tk2dSpriteCollectionDefinition.ColliderType.ForceNone;  
    24.         frameSCDef.texture = frameTex;  
    25.         frameSCDef.anchor = tk2dSpriteCollectionDefinition.Anchor.LowerCenter;  
    26.         scDefList.Add(frameSCDef);  
    27.     }  
    28. }  
    29. sc.textureParams = scDefList.ToArray();  
    30. // 3. Try Rebuild  
    31. tk2dSpriteCollectionBuilder.ResetCurrentBuild();  
    32. if (!tk2dSpriteCollectionBuilder.Rebuild(sc))  
    33. EditorUtility.DisplayDialog("Error", "Sprite Collection Build Failed", "OK");  

    (2)创建tk2dSpriteAnimation对象,创建tk2dSpriteAnimationClip对象添加至tk2dSpriteAnimation对象

    [csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
     
    1. // 4. Create SpriteAnimation   
    2. sc = GetSpriteCollection(heroName);  
    3. tk2dSpriteAnimation heroSa = CreateSpriteAnimation(heroName);  
    4. // 5. Create Animation Clip Array  
    5. int clipIndex = 0;  
    6. heroSa.clips = new tk2dSpriteAnimationClip[animDIArr.Length];  
    7. foreach (DirectoryInfo animDI in animDIArr)  
    8. {  
    9.     string animName = animDI.Name;  
    10.     heroSa.clips[clipIndex++] = CreateSpriteAnimationClip(animName,   
    11.     animDI.GetFiles("*.png"), sc);  
    12. }  

    4. 效果

    生成的tk2dSpriteCollection如下

     

    生成的tk2dSpriteAnimation如下

     

     

    5. PS

    这个只是一个Demo程序,功能还不是很完善,比如对于帧序列,可能需要某些序列帧播放多帧,这时我们就需要单写一种格式去描述这个Clip了!

    由于2dToolKit是收费插件,附件就只上传我的代码文件了!

    附件下载

  • 相关阅读:
    jvm的几个概念误区
    JDK动态代理和CGLib动态代理的对比
    mybatis源码解析(连载)
    HashMap源码解析(基于JDK1.8)
    线程池ThreadPoolExecutor——Worker源码解析
    Java线程池原理分析
    装饰器模式在mybatis-cache包中的应用
    rocketMQ手动创建Topic
    JVM误区--动态对象年龄判定
    云上奈飞(三):隐藏在播放按钮下的奥秘(上)
  • 原文地址:https://www.cnblogs.com/123ing/p/4076171.html
Copyright © 2011-2022 走看看