Spine输出能源一键入Unity3D工具代码

《全民无双》手游五月12二十二二十九日上线登录APPSTore付费榜前拾,首先尤其恭喜还在《全民无双》坚定不移奋战的老同事们,顺便技术分享一下在此此前参加项目时的劳作

前面预研过2D骨骼动画编辑工具SPINE,感觉其比cocosStudio及Unity3D自带的骨骼动画编辑器(原生SpriteTree或Uni2D)要更切合有3DS马克斯司空眼惯的图案,即Spine更易于被美术上手。因为立刻课程极少,官网的文字表明依旧英文,所以写了2个简练的文档,依然引玉之砖。之后小编就把实际的商量工作付出技术画画了。即使品类平昔还没利用上,但是假诺做手机上性价比极高表现力极强的2D骨骼动画,想干掉刀塔传奇动画效果、为小妹加点儿乳摇裙摆无锯齿动画的,极度推荐,

锁链刀软武器刀光轨迹

曾经写DEMO使用过Spine的能源,把一堆美术输出的文件导入SPINE真是好累。于是作者写了三个算是两键Import
Unity的工具,贴代码片段吧,工程就不发了。如故一得之见,以下是双键的代码。

 

 

事先在PC端的游戏中贯彻过轨迹,算法喜闻乐见,收集每帧的控制点,对其进行B样条插值,生成D3DTriStrip。

第一键、批量修改SPine输出的JSON文件后缀:作者用PY写的剧本,脚本直接贴了。然后将修改好的文本覆盖到UNITY3D的能源目录内。

那两日恰好接触U3D,美术给了3个轨道的插件,须要自我伸张脚本,资助锁链刀弯刀的刀光计算,临时命名多控制点的轨道。

美高梅4688.com 1

算是U3D的第2个纯技术必要呢,记录一下。

# -*- coding: cp936 -*-
#hElloHuAn

import os
import string

dirName = os.getcwd()
print(dirName)

li=os.listdir(dirName)
for filename in li:
    newname = filename
    #print (newname)
    filtername = newname.split(".")
    if filtername[-1]=="atlas":
        print (filtername)
        newname = newname + ".txt"
        os.rename(filename,newname)
        print newname,  "+txt successfully"

    if filtername[-1]=="json":
        print (filtername)
        newname = newname + ".txt"
        os.rename(filename,newname)
        print newname,  "+txt successfully"   

新增添了3个本子:Hello_MeleeWeaponTrail.cs,扩大了多控制点编辑,调整使用了NewCatmullRom差值算法(使用线性和NewBezier效果不佳)。

  

美高梅4688.com 2

第二键,在Unity的Project面板找到刚刚拷贝的Spine能源目录,右键进行生成UNITY3D直接运用的Spine数据,并在Scene窗口中预览:

刀光的成效如下:

美高梅4688.com 3

美高梅4688.com 4

财富来源其它手游,通过技术手段获取,仅用于技术交换

据悉前东家的正规化,写了一晃方案的非功能性评估:

 

通过Unity的stat面板并未发现与此前品质显明的分别。

其次键的代码也比较简单:须求满意一定的造作专业:

可是算法会动态生成TriangleMesh,控制点越来越多生成顶点和三角形数会增添,影响内存显存和显卡带宽填充。

///
制作专业:统一模型全体的分化门类的财富的称谓必须一致,并与目录名相同:
/// SPINENAME下有SPINENAME.png\ SPINENAME.json.txt\
SPINENAME.atlas.txt

空间:

    [MenuItem("Assets/batchCreateSpineData")]
    static public void BatchCreateSpineData()
    {
        string dirName = ""; 
        string spineFileName = BatchCreateSpineDataMethod(ref dirName);
        Debug.Log(spineFileName);
        Debug.Log(dirName);

        string textureName = dirName + spineFileName + ".png";
        string jsonFileName = dirName + spineFileName + ".json.txt";
        string atlasFileName = dirName + spineFileName + ".atlas.txt";

        Material mat;
        ///1、 创建材质,并指贴图和shader
        {
            Shader shader = Shader.Find("Unlit/Alpha_zorro");
            mat = new Material(shader);
            Texture tex = Resources.LoadAssetAtPath(textureName, typeof(Texture)) as Texture;
            mat.SetTexture("_MainTex", tex);
            AssetDatabase.CreateAsset(mat, dirName + spineFileName + ".mat");
            AssetDatabase.SaveAssets();
        }

        ///2、 创建atlas,并指xx
        AtlasAsset m_AtlasAsset = AtlasAsset.CreateInstance<AtlasAsset>();
        AssetDatabase.CreateAsset(m_AtlasAsset, dirName + spineFileName + ".asset");
        Selection.activeObject = m_AtlasAsset;

        TextAsset textAsset = Resources.LoadAssetAtPath(atlasFileName, typeof(TextAsset)) as TextAsset;
        m_AtlasAsset.atlasFile = textAsset;
        m_AtlasAsset.materials = new Material[1];
        m_AtlasAsset.materials[0] = mat;
        AssetDatabase.SaveAssets();


        ///3、 创建SkeletonDataAsset,并指相关
        SkeletonDataAsset m_skeltonDataAsset = SkeletonDataAsset.CreateInstance<SkeletonDataAsset>();
        AssetDatabase.CreateAsset(m_skeltonDataAsset, dirName + spineFileName + " AnimationData.asset");
        Selection.activeObject = m_skeltonDataAsset;

        m_skeltonDataAsset.atlasAsset = m_AtlasAsset;
        TextAsset m_jsonAsset = Resources.LoadAssetAtPath(jsonFileName, typeof(TextAsset)) as TextAsset;
        m_skeltonDataAsset.skeletonJSON = m_jsonAsset;
        AssetDatabase.SaveAssets();


        /// 创建场景物件
        GameObject gameObject = new GameObject(spineFileName, typeof(SkeletonAnimation)) ;
        EditorUtility.FocusProjectWindow();
        Selection.activeObject = gameObject;

        SkeletonAnimation m_skelAnim = gameObject.GetComponent<SkeletonAnimation>();
        m_skelAnim.skeletonDataAsset = m_skeltonDataAsset;
    }

         内存

于是乎双键合璧了。 

                  
单个顶点position+uv+vcColor大概32字节。下表浮现伸张控制点增加的内存消耗。

 说一下写那个的含义:

控制点数量

2

3

n

顶点数量

2X

3X

nX

三角形数量

X

2X

(N-1)X

对此美术能源导入UNITY3D中,一般都是丹青来做,这些依旧属于财富输出的规模,而美术人士对此新工具复杂使用的对抗能力,繁冗流程,重复劳动的成效浪费,心思落差,对于私有以及国有都以一种损失。当然写那个的早期想法是因为,美术将能源导入UNITY做不佳,会给程序员留坑来查,可能会推给程序员来做,作者为着让投机省事儿!所以作者写了那些工具,流程变得不难,操作变得自在,美术与程序关系变得感情和谐。

 

自家所做的是一种变相提升美术工具用户体验的事情,是当下移动网络下技术转移世界改变生产力的任其自然产物。没几行代码,简单算一下,1个Spine财富的导入会节约10分钟时间,且不说会有持续迭代和返工,尽管项目周期的五十几个SPINE能源,这一度为公司节省了500分钟九个钟头几百上千块钱的资产,还带来了舒爽的情感,和谐的涉及。那些帐一算太值了。

         显存:

OVER。

                   顶点和索引会增添对应空间的显存。

 

时间:

 

         CPU:与控制点数量的时光复杂度为O(n)。

终极帮团队做个广告:

         GPU:随着顶点数量的扩张,VS阶段带宽伸张,绘制的三角数量变多。

最为看中员工素质作育,极其器重打造用户、客户端、美术“(用户体验)”的游玩、代码、工具的团协会,诚求各位业内有缘人。地方香港、上海。站内联系。

 

 

完全来讲,作用影响不是太大,场景中刀光数量不多以来,使用无大难点。

建议:

   
 逻辑来支配刀光的Emit,即,只在挥刀的时候置成true,其余时候是false,再精致点就要用动画的小时控制刀光的显示和隐藏,比如唯有当刀拿下时有刀光,抬起时从没刀光等。

代码放附件了,供参考吧。 

 http://files.cnblogs.com/files/hellohuan/U3D\_trail.zip

 

游旺互联网,诚聘英才,技术升高指日可待。

 

游旺网络技术部招聘

U3D实习、初级

上海 经验应届完成学业生 本科及以上 全职

职位诱惑 : 程序实习生,入职培训专人陪带,快捷成长

岗位描述

实习生培训:

定期一个月的入职培训,培训期,专人培带,让员工快捷融入团队和开发连串

 

地方描述 :

据悉分配的做事,完结娱乐客户端部分模块的付出; 

基于必要开发构建游戏研发进度中所须求的局地开发工具; 

与品种组策划、美术人士同台商讨开发需求及企划游戏已毕细节;

 

供职须要 :

熟习CSharp,C++,JAVA中足足一种总计机编程语言; 

有Cocos2D-X、Unity3D开发经验者优先; 

对工作认真负责,可以如期落成布局的行事; 

团伙合营能力强,具备一定的抗压能力; 

对游乐编程有深厚的兴趣,具有较强的上学分析能力,善于接受新技巧;

业内不限,要有自然的逻辑思考,热爱网络工作; 

爱护游戏,热爱网络,喜欢从事IT技术类工作;对游乐支付有趣味; 

美高梅4688.com,学习能力强,工作热情高,富有义务感,在信用社培训及工程师的指引下成功工作内容; 

本岗位欢迎优良应届结业生前来应聘。(学习能力强者可宽松学历须求) 

 

自由、公平、人性、关爱,是游旺对员工的姿态。

★ 全体进入游旺的职工,入职即可享用国家鲜明的各类假日福利

★ 严峻依据国家分明为职工缴纳各项社会保障

★ 入职即进入培训期,专人培带,让员工疾速融入团队和支出连串.

发表评论

电子邮件地址不会被公开。 必填项已用*标注