马上注册,加入CGJOY,让你轻松玩转CGJOY。
您需要 登录 才可以下载或查看,没有帐号?立即注册
×
之前预研过2D骨骼动画编辑工具SPINE,感觉其比cocosStudio及Unity3D自带的骨骼动画编辑器(原生Sprite Tree或Uni2D)要更适合有3DSMax习惯的美术,即Spine更容易被美术上手。因为当时教程极少,官网的文字说明还是英文,所以写了一个简明扼要的文档,还是抛砖引玉。之后我就把具体的研究工作交给技术美术了。虽然项目一直还没使用上,但是如果做手机上性价比极高表现力极强的2D骨骼动画,想干掉刀塔传奇动画效果、为妹子加点儿乳摇裙摆无锯齿动画的,非常推荐, 曾经写DEMO使用过Spine的资源,把一堆美术输出的文件导入SPINE真是好累。于是我写了一个算是两键Import Unity的工具,贴代码片段吧,工程就不发了。还是抛砖引玉,以下是双键的代码。
第一键、批量修改SPine输出的JSON文件后缀:我用PY写的脚本,脚本直接贴了。然后将修改好的文件覆盖到UNITY3D的资源目录内。
[size=1em][backcolor=rgb(244, 244, 244) !important]1
2
[backcolor=rgb(244, 244, 244) !important]3
4
[backcolor=rgb(244, 244, 244) !important]5
6
[backcolor=rgb(244, 244, 244) !important]7
8
[backcolor=rgb(244, 244, 244) !important]9
10
[backcolor=rgb(244, 244, 244) !important]11
12
[backcolor=rgb(244, 244, 244) !important]13
14
[backcolor=rgb(244, 244, 244) !important]15
16
[backcolor=rgb(244, 244, 244) !important]17
18
[backcolor=rgb(244, 244, 244) !important]19
20
[backcolor=rgb(244, 244, 244) !important]21
22
[backcolor=rgb(244, 244, 244) !important]23
24
[backcolor=rgb(244, 244, 244) !important]25
| [backcolor=rgb(244, 244, 244) !important]# -*- coding: cp936 -*-
#hElloHuAn
import os
[backcolor=rgb(244, 244, 244) !important]import string
[backcolor=rgb(244, 244, 244) !important]dirName = os.getcwd()
print(dirName)
li=os.listdir(dirName)
[backcolor=rgb(244, 244, 244) !important]for filename in li:
newname = filename
[backcolor=rgb(244, 244, 244) !important] #print (newname)
filtername = newname.split(".")
[backcolor=rgb(244, 244, 244) !important] if filtername[-1]=="atlas":
print (filtername)
[backcolor=rgb(244, 244, 244) !important] newname = newname + ".txt"
os.rename(filename,newname)
[backcolor=rgb(244, 244, 244) !important] print newname, "+txt successfully"
[backcolor=rgb(244, 244, 244) !important] if filtername[-1]=="json":
print (filtername)
[backcolor=rgb(244, 244, 244) !important] newname = newname + ".txt"
os.rename(filename,newname)
[backcolor=rgb(244, 244, 244) !important] print newname, "+txt successfully"
|
第二键,在Unity的Project面板找到刚刚拷贝的Spine资源目录,右键进行生成UNITY3D直接使用的Spine数据,并在Scene窗口中预览:
资源来源于其它手游,通过技术手段获取,仅用于技术交流
第二键的代码也比较简单:需要满足一定的制作规范: /// 制作规范:统一模型所有的不同类型的资源的名称必须相同,并与目录名一致:
/// SPINENAME下有SPINENAME.png\ SPINENAME.json.txt\ SPINENAME.atlas.txt [size=1em][backcolor=rgb(244, 244, 244) !important]1
2
[backcolor=rgb(244, 244, 244) !important]3
4
[backcolor=rgb(244, 244, 244) !important]5
6
[backcolor=rgb(244, 244, 244) !important]7
8
[backcolor=rgb(244, 244, 244) !important]9
10
[backcolor=rgb(244, 244, 244) !important]11
12
[backcolor=rgb(244, 244, 244) !important]13
14
[backcolor=rgb(244, 244, 244) !important]15
16
[backcolor=rgb(244, 244, 244) !important]17
18
[backcolor=rgb(244, 244, 244) !important]19
20
[backcolor=rgb(244, 244, 244) !important]21
22
[backcolor=rgb(244, 244, 244) !important]23
24
[backcolor=rgb(244, 244, 244) !important]25
26
[backcolor=rgb(244, 244, 244) !important]27
28
[backcolor=rgb(244, 244, 244) !important]29
30
[backcolor=rgb(244, 244, 244) !important]31
32
[backcolor=rgb(244, 244, 244) !important]33
34
[backcolor=rgb(244, 244, 244) !important]35
36
[backcolor=rgb(244, 244, 244) !important]37
38
[backcolor=rgb(244, 244, 244) !important]39
40
[backcolor=rgb(244, 244, 244) !important]41
42
[backcolor=rgb(244, 244, 244) !important]43
44
[backcolor=rgb(244, 244, 244) !important]45
46
[backcolor=rgb(244, 244, 244) !important]47
48
[backcolor=rgb(244, 244, 244) !important]49
50
[backcolor=rgb(244, 244, 244) !important]51
52
[backcolor=rgb(244, 244, 244) !important]53
54
| [backcolor=rgb(244, 244, 244) !important][MenuItem("Assets/batchCreateSpineData")]
static public void BatchCreateSpineData()
[backcolor=rgb(244, 244, 244) !important]{
string dirName = "";
[backcolor=rgb(244, 244, 244) !important] string spineFileName = BatchCreateSpineDataMethod(ref dirName);
Debug.Log(spineFileName);
[backcolor=rgb(244, 244, 244) !important] Debug.Log(dirName);
[backcolor=rgb(244, 244, 244) !important] string textureName = dirName + spineFileName + ".png";
string jsonFileName = dirName + spineFileName + ".json.txt";
[backcolor=rgb(244, 244, 244) !important] string atlasFileName = dirName + spineFileName + ".atlas.txt";
[backcolor=rgb(244, 244, 244) !important] Material mat;
///1、 创建材质,并指贴图和shader
[backcolor=rgb(244, 244, 244) !important] {
Shader shader = Shader.Find("Unlit/Alpha_zorro");
[backcolor=rgb(244, 244, 244) !important] mat = new Material(shader);
Texture tex = Resources.LoadAssetAtPath(textureName, typeof(Texture)) as Texture;
[backcolor=rgb(244, 244, 244) !important] mat.SetTexture("_MainTex", tex);
AssetDatabase.CreateAsset(mat, dirName + spineFileName + ".mat");
[backcolor=rgb(244, 244, 244) !important] AssetDatabase.SaveAssets();
}
[backcolor=rgb(244, 244, 244) !important]
///2、 创建atlas,并指xx
[backcolor=rgb(244, 244, 244) !important] AtlasAsset m_AtlasAsset = AtlasAsset.CreateInstance<AtlasAsset>();
AssetDatabase.CreateAsset(m_AtlasAsset, dirName + spineFileName + ".asset");
[backcolor=rgb(244, 244, 244) !important] Selection.activeObject = m_AtlasAsset;
[backcolor=rgb(244, 244, 244) !important] TextAsset textAsset = Resources.LoadAssetAtPath(atlasFileName, typeof(TextAsset)) as TextAsset;
m_AtlasAsset.atlasFile = textAsset;
[backcolor=rgb(244, 244, 244) !important] m_AtlasAsset.materials = new Material[1];
m_AtlasAsset.materials[0] = mat;
[backcolor=rgb(244, 244, 244) !important] AssetDatabase.SaveAssets();
///3、 创建SkeletonDataAsset,并指相关
[backcolor=rgb(244, 244, 244) !important] SkeletonDataAsset m_skeltonDataAsset = SkeletonDataAsset.CreateInstance<SkeletonDataAsset>();
AssetDatabase.CreateAsset(m_skeltonDataAsset, dirName + spineFileName + " AnimationData.asset");
[backcolor=rgb(244, 244, 244) !important] Selection.activeObject = m_skeltonDataAsset;
[backcolor=rgb(244, 244, 244) !important] m_skeltonDataAsset.atlasAsset = m_AtlasAsset;
TextAsset m_jsonAsset = Resources.LoadAssetAtPath(jsonFileName, typeof(TextAsset)) as TextAsset;
[backcolor=rgb(244, 244, 244) !important] m_skeltonDataAsset.skeletonJSON = m_jsonAsset;
AssetDatabase.SaveAssets();
[backcolor=rgb(244, 244, 244) !important] /// 创建场景物件
GameObject gameObject = new GameObject(spineFileName, typeof(SkeletonAnimation)) ;
[backcolor=rgb(244, 244, 244) !important] EditorUtility.FocusProjectWindow();
Selection.activeObject = gameObject;
SkeletonAnimation m_skelAnim = gameObject.GetComponent<SkeletonAnimation>();
[backcolor=rgb(244, 244, 244) !important] m_skelAnim.skeletonDataAsset = m_skeltonDataAsset;
}
|
于是双键合璧了。 说一下写这个的意义: 对于美术资源导入UNITY3D中,一般都是美术来做,这个仍然属于资源输出的范畴,而美术人员对于新工具复杂使用的抗拒能力,繁冗流程,重复劳动的效率浪费,心情落差,对于个人以及集体都是一种损失。当然写这个的最初动机是因为,美术将资源导入UNITY做不好,会给程序员留坑来查,或者会推给程序员来做,我为了让自己省事儿!所以我写了这个工具,流程变得简单,操作变得轻松,美术与程序关系变得激情和谐。 我所做的是一种变相提高美术工具用户体验的事情,是当前移动互联网下技术改变世界改变生产力的必然产物。没几行代码,简单算一下,一个Spine资源的导入会节省10分钟时间,且不说会有无穷的迭代和返工,即使项目周期的五十个SPINE资源,这已经为团队节约了500分钟8个小时几百上千块钱的成本,还带来了舒爽的心情,和谐的关系。这个帐一算太值了。 OVER。
|