Skip to content

简介

SandMod 在 资源商店(Asset Store)提供了海量平台角色的外观服饰供您下载使用,您可以用这些外观服饰装扮玩家的化身角色和 非玩家角色(NPC)。

下载方式

您可以从 资源商店(Asset Store)的 库(Library)中 外观装扮(Appearance)分类里预览和下载平台角色的外观服饰,资源商店的打开方法和下载资源的方法请参阅 资源商店 章节。

【Appearance001.png】

资源商店中平台角色外观预览。

使用方法

当前版本中,平台角色外观服饰装扮仅能在平台角色中引用,平台角色的模型您可以在 平台角色 章节中下载,模型的导入方法请参阅 导入资产 章节。

蒙皮网格

台角色外观服饰装扮资源包含了决定状态外观的 网格(Mesh)。

【Appearance002.png】

根据外观的状态不同,有些服饰需要通过 蒙皮网格渲染器(Skinned Mesh Renderer)渲染,有些却需要通过 网格渲染器(Mesh Renderer)渲染,您可以通过服饰资源内的 预制体(Prefab)了解该网格的渲染方式。

【Appearance003.png】

骨骼节点

如果对应服饰是通过 蒙皮网格渲染器(Skinned Mesh Renderer)渲染,在服饰资源内的 预制体(Prefab)中有命名为 Bip001 的 游戏对象(Game Object),该游戏对象及其所有子对象称为 服饰骨骼绑定点(Appearance Bone Points),服饰骨骼绑定点作为蒙皮网格需要绑定的平台角色骨骼节点的参考,您需要:

  • 通过编码,在平台角色骨骼节点实例化的游戏对象树状结构中,查找到所有与服饰骨骼绑定点同名的游戏对象。

  • 将查找到的所有游戏对象的 变换(Transform)储存在 数组(Array)中。

  • 将数组通过 API SkinnedMeshRenderer.bones 赋值给 蒙皮网格渲染器(Skinned Mesh Renderer)。

【Appearance004.png】

代码示例:

TypeScript
class TestAppear extends Component {

    //定义公共变量保存服饰资源用于渲染服饰蒙皮网格的组件;
    public ClothesPref: SkinnedMeshRenderer;
    //定义公共变量保存用于在平台角色中渲染渲染服饰蒙皮网格的游戏对象;
    public ClothesRenderer: GameObject;
    //定义公共变量保存平台角色骨骼根节点游戏对象;
    public PlayerBoneRoot:GameObject;

    //定义私有变量保存服饰资源中骨骼列表;
    private _markBoneList:Transform[];
    //定义私有变量保存平台角色骨骼列表;
    private _boneList:Transform[];

    /*
    编辑运行时事件;
    */
    OnStart(): void {
        //获取服饰资源中骨骼列表;
        this._markBoneList = this.ClothesPref.bones;
        //获取平台角色骨骼树的根节点变换;
        let pBRT:Transform = this.PlayerBoneRoot.transform;
        this._boneList = new Array<Transform>();
        //遍历服饰资源中绑定的每个骨骼,并在平台角色骨骼树中找到同名骨骼,保存在私有变量 _boneList 中;
        this._markBoneList.forEach((thisBone:Transform) => {
            this._GetBone(pBRT,this._boneList,thisBone);
        });

        //获取用于渲染服饰蒙皮网格的组件;
        let cSRCom: SkinnedMeshRenderer = this.ClothesRenderer.GetComponent(SkinnedMeshRenderer);
        //蒙皮网格渲染器进行骨骼绑定;
        cSRCom.bones = this._boneList;
    }

    /*
    定义私有方法用于逐级读取平台角色骨骼树,并将服饰资源骨骼与平台角色骨骼进行匹配;
        @param CurrentBone 读取函数时骨骼根节点游戏对象;
        @param ImportList 保存平台角色骨骼变换的列表;
        @param RefBone 当前匹配的服饰资源骨骼节点;
    */
    private _GetBone(
        CurrentBone:Transform,
        ImportList:Transform[],
        RefBone:Transform
    ): void {
        CurrentBone.forEach( (child: Transform) => { 
            //判断当前骨骼是否与服饰资源骨骼同名;
            if(child.name == RefBone.name){
                //如果同名,则将当前骨骼添加到 ImportList 列表中;
                ImportList.push(child);
            }
            else{
                //如果不同名,则递归调用 _GetBone 函数,继续遍历当前骨骼的子骨骼;
                this._GetBone(child,ImportList,RefBone);
            }
        });
    }
}

如果对应服饰是通过 网格渲染器(Mesh Renderer)渲染,在服饰资源内的 预制体(Prefab)中的子级 游戏对象(Game Object)以该骨骼节点的名称命名,您需要:

  • 使用新建的空游戏对象用于渲染该网格。

  • 通过编码,或在 层级窗口(Hierachy)中将用于渲染服饰外观 网格(Mesh)的游戏对象作为该骨骼节点实例化游戏对象的子级。

【Appearance005.png】

材质相关

平台角色的服饰装扮都需要通过一份特殊的 着色器(Shader)进行渲染,如果您的游戏项目中没有该 着色器(Shader)平台角色服饰将无法正常在 场景(Scene)中渲染,您可以通过以下步骤解决该问题:

  • 如果您下载了平台角色服饰资源,请点击下面的按钮下载用于渲染平台角色服饰的 着色器(Shader)。
  • 下载后将 着色器(Shader)通过 项目窗口(Project)导入游戏项目中。

  • 重启 SandMod 编辑器,平台角色的服饰将在场景中正常渲染。

结合模板使用

【Appearance006.mp4】

基础模板(Basic Sample)的角色根节点上挂载了类名为 DecorationBase 的脚本,里面封装了读取平台角色的功能。

【Appearance007.png】

您可以通过以下方法在 基础模板(Basic Sample)中快速为角色更换上平台服饰外观:

  • 将已经下载的服饰外观从 资源商店(Asset Store)的 资产列表(Resource List)中复制到 项目窗口(Project)中。

【Appearance008.png】

  • 在 层级窗口(Hierachy)依次通过 ==Characters==/Player/boy 找到 boy 游戏对象(Game Object),点击后在 检视窗口(Inspector)查看该游戏对象类名为 DecorationBase 的脚本组件。

【Appearance009.png】

  • DecorationBase 的脚本组件中引用各个部位对应的服饰 预制体(Prefab)。

【Appearance010.png】

  • 运行游戏项目,角色自动更换上所引用的平台角色服饰外观。

【Appearance011.png】

值得注意的是,由于技术限制,如果需要为平台角色更换鞋子服饰外观,左脚与右脚引用的 预制体(Prefab)都必须为同一个预制体,且不能为空,否则会造成预期以外的显示错误。