概述

阅读本文档,您可以了解如何使用Unity运行库。该运行库使用C#语言。我们将通过一个示例来说明如何加载导出的JSON文件并在场景中进行播放。

视频教程

Unity

点击 这里 观看Unity集成视频教程。

Unity

点击 这里 观看如何使用Creature Unity运行库将法线约束和环境光遮挡贴图集成到Unity中的一个龙角色上。

Unity

点击 这里 观看如何播放从Creature导出的含动画区域顺序的角色。

Unity

点击 这里 观看如何使用Creature Unity插件创建2D侧滚动平台游戏力学。您可以点击 这里 下载平台演示的示例项目。

Unreal

点击 这里 观看如何使用Creature工具自带的新事件创作编辑器创作框架回调触发器的教程。导出的事件触发器可以从Unity加载。

获取运行库

您可以直接从Creature游戏运行库窗口下载运行库,或点击 这里 从版本库获取运行库。

对比完整运行库和CreaturePack(需要为大量角色提供更高播放性能?)

CreaturePack

除了完整运行库,还有另一种的轻量级插件:CreaturePack运行库。该运行库的设计专门针对大量角色的高质量播放。如需要此运行库,请点击 这里

添加Unity对象

将Unity对象添加至运行库脚本后,游戏对象菜单下会显示一个Creature菜单:

Meshing

该菜单可用组件如下:

Creature资源:该对象执行JSON动画信息的加载和管理;

Creature渲染器:该对象执行角色的实际渲染。Creature渲染器有一个插槽,可以指向一个可用的Creature资源对象;

Creature游戏控制器:该对象被添加为Creature渲染器对象的子代。它为角色中的每个骨骼管理和创建刚性碰撞器对象,也可以通过动画中的骨骼移动碰撞器对象。

要在Unity中完成角色动画播放,上述3个对象缺一不可。

步骤 1:添加Creature资源

点击主菜单的Creature→Creature资源,添加一个新的Creature资源对象。该对象具有以下属性:

Meshing

如上图所示,本示例中所使用的动画JSON文件为忍者测试, 该文件中含有一些忍者动画。将Creature JSON插槽指向忍者测试资源文件,以加载和管理该JSON文件。文件加载成功后,您可以看到可用的动画剪辑将自动显示在检查器中。在该示例中,文件中有3个可用动画:默认奔跑攻击

步骤 2:添加Creature渲染器

点击主菜单的Creature→Creature渲染器,添加一个新的Creature渲染器对象。该对象具有以下属性:

Meshing

设置Creature资源插槽,引用刚刚创建的Creature资源对象。创建完成后,该对象将显示更多的属性:

  • 自身时间缩放:该数值确定播放速度倍数;

  • 区域深度(z)偏移:该数值确定每个基础网格区域的深度(z)偏移量。当渲染画面出现深度冲突导致的遮挡时,您可以使用该数值将角色的各种网格区域“推出”;

  • 逆时针:该属性设置网格的渲染三角形的缠绕顺序。当网格因消隐背面未显示时,您可以选中此选项以更改缠绕顺序,将其设为显示;

  • 动画:该选项为当前活动的动画设置播放;

  • 循环:该选项确定动画是否循环。

请注意,该对象尚未在屏幕上绘制任何内容。您需要将对象添加在材质组件中,通常您可以指向您的角色的纹理图谱PNG图像,以呈现角色。使用子画面或默认材质,您即可轻松获得开始材质

步骤 3:添加Creature游戏控制器

选择您之前创建的Creature渲染器对象,然后单击Creature→Creature游戏控制器,创建一个新的Creature游戏控制器对象作为当前Creature渲染器对象的子对象。您可以在层次结构视图中看到如下内容:

Meshing

Creature游戏控制器在检查器中具有以下属性:

Meshing

Creature渲染器:设置该参数以引用您的Creature渲染器对象;

碰撞器高度:该参数定义每个骨骼碰撞器的高度。因为骨骼碰撞器是运动学的,所以它们由动画驱动,而不是由物理驱动;

模拟碰撞器宽度和模拟碰撞器高度:该参数定义主要角色碰撞器的尺寸。该碰撞器是为整个角色创建的,由物理驱动。

要开始使用此对象,请单击构建骨架对象。该对象将自动查阅您的角色的骨骼层次结构,并为角色中的每个骨骼创建运动学碰撞器。另外,它还将创建一个代表角色自身的整体模拟碰撞器。您可以在层次结构视图中看到如下内容:

Meshing

每个骨碰撞器之所以设计为运动学的,是为了使它们与角色动画保持一致。主要模拟碰撞器不是运动学的,而是由物理驱动的。因此,您可以设定重力、玩家动作等类型的力,以此驱动模拟碰撞器运行。因为模拟碰撞器运动可以移动整个Creature渲染器对象,所以您可以使用它在游戏中移动您的角色。单个运动学骨骼碰撞器可以用于与其它对象(如:进入的子弹、伤害等)的碰撞检测。

游戏未运行时,您可以预览碰撞器在角色中的位置。游戏实际运行时,碰撞器将与骨骼同步。未运行时,骨骼将被设置为放松姿势,因此可能不会与角色的当前动画姿势同步:

Meshing

使用Creature平面二进制数据缩减加载时间

您可以通过将Creature JSON文件转换为Creature平面二进制数格式来缩减大角色资源的加载时间。

首先,进入 Creature工具Github页面

  1. 进入平面数据目录;

2)您可以编译Creature平面数据转换器程序,或者从Bin目录中获取系统(Mac或Windows)的二进制数据。

运行Creature平面数据转换器

Creature平面数据转换器是一个命令行程序,可以使用置入的导出Creature角色的JSON文件,并将其转换为二进制Creature平面数据文件。建议为最终转换输出的二进制文件使用**.bytes**扩展名,以便Unity可以将其识别为二进制资源。

要运行Creature平面数据转换器,请加载以下终端或命令提示符:

CreatureFlatData <Input JSON File> <Output .bytes File>

在Unity中使用Creature平面二进制文件

在Creature资源对象中:

1)将新的Creature平面二进制文件放入项目的资源文件夹;

2)将该二进制文件拖动到Creature资源Creature平面数据槽中;

3)将使用平面数据资源框切换为True

完成上述所有步骤后,Creature Unity运行库应加载您的新Creature二进制文件。

使用点缓存加快播放速度

如在游戏中遇到帧速率问题,或想在屏幕上放置大量角色,您可以在动画中启用点缓存

Meshing

检查Creature资源对象中的每个动画的点缓存切换,以针对特定动画启用该功能。在加载游戏时,将花费少量时间来生成高速缓存。缓存动画的播放完全不占用引擎,所以速度平均为正常播放的2倍到3倍

动画区域顺序

在Creature中使用动画区域排序创作您的角色,会生成一个新文件。该文件的扩展名为**.mdata。将该文件拖入Unity,并重命名JSON,Unity将视其为文本资源。将此新资源拖动到Creature资源对象的Creature Meta JSON**槽中以激活区域排序。

使用Creature编辑器自定义动画帧回调事件触发器

现在您可以直接在Creature编辑器中创建事件,并将它们导出到引擎中。

  1. 首先,打开在Creature的事件触发器编辑窗口:

  2. 添加您的自定义事件。事件将添加在动画的当前时间/帧:

  3. 导出您的角色并导入**.mdata**到场景中。本文档的“动画区域排序”部分介绍了该部分。

为处理事件回调,您需要设置一个游戏控制器游戏控制器本身带有一个事件和委托:

public delegate void eventTrigger(string event_name);
public static event eventTrigger OnEventTrigger;

I如不熟悉事件及委托,您可以阅读Unity官方文档 页面 了解如何对其进行设置。

通过连接您自定义事件触发器方法与OnEventTrigger事件,您可以监听和响应角色的自定义创作事件。

使用压缩导出和加载缩减JSON文件大小

当文件大小成为问题时,您可以使用Creature资源对象导出和加载压缩的JSON资源。以下是使用压缩JSON资源的步骤:

1)选择Creature资源对象,点击导出为压缩文件。选择压缩文件导出的目标文件名。确保文件名以.bytes扩展名结束

2)创建一个新的Creature资源对象,检查使用压缩资源切换项;

3)将新压缩资源从步骤1)拖动到新Creature资源对象的压缩Creature JSON插槽中。

使用该方法,文件的压缩效果非常明显,一个10.5mb文件可以压缩到只有0.8mb(比例超过10倍)。如有大型Creature JSON资源或在部署期间磁盘空间受限,您可以使用该选项。

游戏性自定义游戏控制器,方法#1

添加Creature游戏控制器对象,您可以自定义游戏中的角色。完成所有设置后,您即可开始修改Creature游戏控制器对象中的实际代码,以满足您的需求。

如果想让忍者角色根据用户的键盘输入进行移动,您可以执行以下操作:首先,您需要打开Creature游戏控制器的脚本代码。在这里,请注意**FixedUpdate()**方法:

// 于此安置您的游戏代码
void FixedUpdate() {
	// 调用此函数使骨骼碰撞器以运动学的方式与动画保持一致
	UpdateGameColliders();
	
	...

请注意,在开始处有一个对**UpdateGameColliders()**的调用。您应调用该函数以同步骨骼和模拟碰撞器与角色动画。然后,您可以开始添加自己的角色游戏代码:

	// 以下代码是一个如何 
	// 使用该运行库处理角色的控制与行为的例子
	bool left_down = Input.GetKeyDown (KeyCode.A);
	bool right_down = Input.GetKeyDown (KeyCode.D);
	bool left_up = Input.GetKeyUp (KeyCode.A);
	bool right_up = Input.GetKeyUp (KeyCode.D);
	bool attack_down = Input.GetKeyDown (KeyCode.R);
	bool attack_up = Input.GetKeyUp (KeyCode.R);
	var parent_obj = creature_renderer.gameObject;
	Rigidbody2D parent_rbd = parent_obj.GetComponent<Rigidbody2D> ();

	if (is_moving) {
		if(is_moving)
		{
			float move_vel_x = 0;
			if(is_facing_left)
			{
				move_vel_x = -50;
			}
			else {
				move_vel_x = 50;
			}
			parent_rbd.velocity = new UnityEngine.Vector2(move_vel_x, 0);
			creature_renderer.SetActiveAnimation ("running", true);
		}

		if(left_up || right_up) {
			is_moving = false;
			var cur_vel = parent_rbd.velocity;
			cur_vel.x = 0;
			parent_rbd.velocity = cur_vel;
			creature_renderer.SetActiveAnimation ("default");
		}
	} 
	else {
		if (left_down) {
			is_moving = true;
			is_facing_left = true;
		} 
		else if (right_down) {
			is_moving = true;
			is_facing_left = false;
		}

		float facing_angle = 0;
		if(is_facing_left) {
			facing_angle = 180;
		}

		parent_obj.transform.rotation = UnityEngine.Quaternion.AngleAxis(facing_angle, new UnityEngine.Vector3(0, 1, 0));
	}


	if (!is_moving) {
		if(attack_down)
		{
			creature_renderer.SetActiveAnimation ("attack");
		}
		else if(attack_up)
		{
			creature_renderer.SetActiveAnimation ("default");
		}
	} 

请仔细阅读上述代码示例。可以看出:您可以通过调用Creature渲染器对象上的SetActiveAnimation()来更改当前活动的动画。还可以通过在parent_obj对象上设置旋转属性来翻转角色。上述示例将生成一个可由键盘控制的角色。整个模拟碰撞器通过以下检索:

	var parent_obj = creature_renderer.gameObject;
	Rigidbody2D parent_rbd = parent_obj.GetComponent<Rigidbody2D> ();
	

因为模拟碰撞器是作为父代Creature渲染器对象的组件存在。

按下A时,角色向左跑;按下D时,角色向右跑;按下R时,进行攻击。另外,未按下任何键时,角色将播放其默认动画。

游戏性自定义游戏控制器,方法#2

通过另一种更简便的方法也可以将游戏性逻辑添加到您的角色。该方法仍然需要存在Creature游戏控制器对象。

添加Creature游戏控制器对象后,您还必须派生一个继承自Creature游戏代理的新类。假定您有一些人工智能(AI)可以驱动您的Merfolk游戏中的角色,您可以执行以下操作:

using System;
using CreatureModule;
using UnityEngine;
using UnityEditor;

public class MerfolkGame : CreatureGameAgent
{
	public MerfolkGame ()
		: base()
	{
	}
	
	public override void updateStep()
	{
		// 显示如何获取渲染器和相关父级 
		// 对象。
		var creature_renderer = game_controller.creature_renderer;
		var parent_obj = creature_renderer.gameObject;
		Rigidbody2D parent_rbd = parent_obj.GetComponent<Rigidbody2D> ();
	

		base.updateStep ();
		
		// 这里是我的游戏代码,做您需要做的任何操作
		// 以控制角色
	}
}

完成后上述操作后,您需要创建一个新的空游戏对象并将其分配给MerfolkGame脚本。选择您的Creature游戏控制器对象,连接到自定义代理,并将其分配给MerfolkGame对象。然后,游戏控制器即可在执行期间通过调用其updateState()方法,使用MerfolkGame对象。

过渡到新的动画剪辑

过渡到新的动画有2种方式。首先,您需要按照以下操作获取基本渲染对象的引用:

var creature_renderer = game_controller.creature_renderer;

使用到新动画剪辑的硬转换(即时转换),请调用:

creature_renderer.SetActiveAnimation ("NewAnimationName", true);

使用混合渐变过渡到新剪辑,请调用:

creature_renderer.BlendToAnimation("default");

动画剪辑的自定义帧范围

您可以为一段动画剪辑设置自定义开始和结束时间。从Creature渲染器获取Creature管理器的实例:

var creature_renderer = game_controller.creature_renderer;
var manager = creature_renderer.creature_manager;
var myAnimation = manager.GetAllAnimations()["MyAnimationName"];

// 设置我自己的开始和结束时间
myAnimation.start_time = myCustomStartTime;
myAnimation.end_time = myCustomEndTime;

Unity 5中的MecAnim支持

Unity运行库现已支持Unity 5中的Unity状态机(MecAnim)。欲开始使用此状态机,请选择您的Creature资源

Meshing

点击构建状态机。将自动生成一个新的状态机资源。打开该资源,您可以看到资源中创建有代表不同动画状态的状态:

Meshing

这是一个常规的Unity状态机资源,所以您可以依照往常的操作连接和设置状态过渡条件。

完成状态过渡设置后,回到Creature游戏控制器,并拖动状态机资源

Meshing

您的动画状态过渡应已激活且可运行。

覆盖、修改骨骼位置

某些情况下,您需要直接修改角色的骨骼位置。例如,为了添加布娃娃物理效果,您可能希望骨骼位置与若干由弹簧或关节连接在一起的刚体保持一致。在这种情况下,您需要为自己的自定义要求设置骨骼位置,您可以执行以下操作。首先,编写自定义骨骼覆盖方法。在下面的例子中,修改了骨骼y方向上的位置:

// 这表明覆盖或修改骨骼位置的能力 

void UpdateBonesToCustomPositions(Dictionary<string, MeshBoneUtil.MeshBone> bones_map)
{
	foreach(KeyValuePair<string, MeshBoneUtil.MeshBone> entry in bones_map)
	{
		var cur_bone = entry.Value;
		// 将每个骨向上移动y作为示例
		var cur_world_start_pos = cur_bone.getWorldStartPt();
		var cur_world_end_pos = cur_bone.getWorldEndPt();

		float displace_y = -20.0f;
		cur_world_start_pos.Y += displace_y;
		cur_world_end_pos.Y += displace_y;

		cur_bone.setWorldStartPt(cur_world_start_pos);
		cur_bone.setWorldEndPt(cur_world_end_pos);
	}

}

然后在**FixedUpdate()**调用中,您还需要告诉Creature管理器使用您的自定义骨骼修改回调,如下所示:

	// 以下代码设置一个可选的骨骼覆盖回调以修改骨骼位置
	CreatureManager cur_manager = creature_renderer.creature_manager;
	cur_manager.bones_override_callback = UpdateBonesToCustomPositions;

切换游戏中的项目和区域

您可以使用运行库切换角色的特定网格区域。该功能非常实用,您可以用它执行角色项目(如帽子、鞋子和武器)的切换。

设置游戏项目和区域切换的步骤:

1)确保在Creature编辑器中为要交换的区域启用启用图像交换

2)确保您有一个单个图像交换结点可以在子画面帧管理器设置感兴趣的区域;

3)打开子画面帧管理器,记下要在该区域交换的其它子画面的标签值:

UE4

该标签值始终为负值。稍后您可在游戏项目交换中将该值放入运行库。

如何激活项目切换

使用上一段中安装的项目切换,您可以在游戏中触发区域或项目切换。此代码假设您正在修改Creature游戏控制器并覆盖**FixedUpdate()**回调。

首先,在C#代码中获取对Creature管理器对象的引用:

CreatureManager cur_manager = creature_renderer.creature_manager;

完成后,您可以用新图像换出目标区域:

	cur_manager.target_creature.SetActiveItemSwap(region_name, tagID);

**region_name(区域名称)是您感兴趣的区域的名称,tagID(标签值)**是您从上一部分检索出的标记。

锚点

通常,在为角色制作动画时,您可能不会把它们居中在同一原点。使用锚点,您可以指定角色的相对原点给特定的动画剪辑;如果需要,您还可以使用该功能将不同的角色动画居中。

1)在Creature编辑器中,运行动画→设置锚点

2)拖动角色周围的红色旋转框,以设置锚点UE4

  1. 在Unity中:

    CreatureManager cur_manager = creature_renderer.creature_manager; cur_manager.target_creature.anchor_points_active = true;

第二行代码可以激活锚点,并使您的角色动画依照您指定的锚点居中。

其它使用提示

  • 您可以有多个Creature渲染器对象引用单个Creature资源对象。该功能不但有助于节省内存,在实例化同一类型角色的多个副本时也非常有用。

  • 您可以使用单个骨碰撞器进行碰撞检测。碰撞响应可以应用于主模拟碰撞器。通过这种方式,您不仅可以获得对单个身体部位的精细碰撞检测,还可以得到整个角色的整体稳定的碰撞响应。