前言

游戏的UI制作一直是程序员的考验,如果是程序员来拼UI的话,会遇到和美术效果不一样,如果是美术拼的话,又需要成本,美术一般对Unity不是很熟悉。之前也用过FGUI,但是bug不少,实际上用起来还是UGUI更为顺手。最后项目试用了PSD2GUI这个思路,把美术出的PSD直接转换成UGUI。理想的情况下是不用美术培训太多就能输出界面,所以没有做过多的组件支持,只是导出一些最基础的元素,比如图片和文字,程序在这基础上再进行加工,但也能省去大部分的重复工作了,而且不容易出错。如果流程更加成熟,可以培训美术理解更多prefab相关知识,可以支持导出一些列表,复选框之类的元素,但这要考虑成本。

代码基本来自https://github.com/zs9024/quick_psd2ugui/tree/master,基本没有用他的命名方式,只用了基本的图片和文字导出,支持了位置,大小,文本,文本颜色,透明度等基础信息。在实际实用中美术会标注一些不常规的情况,比如描边,渐变,图片的叠色,旋转,这些信息其实在PSD都有的,但是在API中并不能获取到,最后才参考【CEP教程-8】Action Manager从好奇到劝退 - 中篇,直接读取了图层效果里的描边和图片叠色,因为是直接读取的,所以美术并没有学习成本,渐变的参数过于复杂,有点难支持,旋转的信息暂时没找到简单方法获取,但也省下了一点成本。

代码

主要就是利用ActionManger获取更多的PSD图层信息,PS在操作时会把数据都存到一个的结构中,只要能拿到这个结构,就能查到其中记录的数据,之后通过debug查看变量,或者通过示例代码照猫画虎即可。

/**
 * 这里就是拓展内容
 function exportLabel(obj,validFileName){
    var desc = getLayerInfoByID(obj.id)
    var json = ADToJSON(desc)
    //这里就可以取到描边信息类似json.FrameX.solidFill.color,具体debug可以看到
 }
 */

/**
 * 这个函数接受一个AD的对象,返回这个对象所有属性值的JSON结构
 * @param desc [ActionDescriptor]
 * @constructor
 * @return JSON
 */
function ADToJson(desc) {
    var json = {};
    for (var i=0; i<desc.count; i++) {
        var typeID = desc.getKey(i);
        var stringID = typeIDToStringID(typeID);
        var typeString = (desc.getType(typeID)).toString();
        switch(typeString) {
            case "DescValueType.BOOLEANTYPE":
                json[stringID] = desc.getBoolean(typeID);
            break;
            case "DescValueType.DOUBLETYPE":
                json[stringID] = desc.getDouble(typeID);
            break;
            case "DescValueType.INTEGERTYPE":
                json[stringID] = desc.getInteger(typeID);
            break;
            case "DescValueType.STRINGTYPE":
                json[stringID] = desc.getString(typeID);
            break;
            case 'DescValueType.OBJECTTYPE':
                var objectValue = desc.getObjectValue(typeID);
                json[stringID] = ADToJson(objectValue);
            break;
            case 'DescValueType.CLASSTYPE':
            case 'DescValueType.LISTTYPE':
            case 'DescValueType.REFERENCETYPE':
                // 剩下这些留给你去补充完成,这里还有UNITDOULETYPE之类的,像描边的size就是这类型
            break;
            default: alert(typeString); break;
        }
    }
    return json;
}

/**
 * 根据图层ID来获取图层信息
 * @param layerID
 * @return {*}
 */
function getLayerInfoByID(layerID) {
    var ref1 = new ActionReference();
        ref1.putIdentifier(stringIDToTypeID( "Lyr ", layerID));
    var layerDescriptor = executeActionGet(ref1);
    var json = ADToJson(layerDescriptor);
    return json;
}

/**
 * 根据图层的顺序,来获取图层信息
 * @param index
 * @return {*}
 */
function getLayerInfoByIndex(index) {
    var ref1 = new ActionReference();
        ref1.putIndex( stringIDToTypeID( "itemIndex" ), index);
    var layerDescriptor = executeActionGet(ref1);
    var json = ADToJson(layerDescriptor);
    return json;
}

/**
 * 根据图层的名称,来获取图层信息
 * @param index
 * @return {*}
 */
function getLayerInfoByName(name) {
    var ref1 = new ActionReference();
    ref1.putName( stringIDToTypeID( "layer" ), name );
    var layerDescriptor = executeActionGet(ref1);
    var json = ADToJson(layerDescriptor);
    return json
}

function getCurrentDocumentInfo() {
    var ref1 = new ActionReference();
    ref1.putEnumerated(charIDToTypeID('Dcmn'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt'));
    var docDescriptor = executeActionGet(ref1);
    var json = ADToJson(docDescriptor);
    return json
}

总结

  • 代码基本就是那样了,难点在于怎么知道json中的变量是对应自己想要的值,可以自己修改值,看看变化,或者通过参考【CEP教程-8】Action Manager从好奇到劝退 - 上篇,装个插件,每一部的ps操作都会生成log,可以更快找到所需变量。
  • jsx可以用vscode进行开发,配合插件ExtendScript可以输出日志和断点

参考

【CEP教程-8】Action Manager从好奇到劝退 - 上篇

【CEP教程-8】Action Manager从好奇到劝退 - 中篇

【CEP教程-9】Action Manager从好奇到劝退 - 下篇

Photoshop插件开发教程 - (4)开发工具选择和调试

脚本解析photoshop文本属性_javascript怎么获取ps属性-CSDN博客https://zhuanlan.zhihu.com/p/559290141)

https://www.zhihu.com/column/c_1511743743355482112