本文翻译自:https://docs.live2d.com/cubism-sdk-tutorials/hittest/
译者注:注意!这并不是一篇严谨的翻译,本人并不是翻译行业从业者,也根本不会日文。官网的中文翻译会连带代码一起翻译,而且还不如机翻日文,官网的英语翻译版本有的语法很奇怪,看起来也是机翻。本文主要来自日文机翻,然后再结合实际开发经验调整到通顺,修改不该翻译的东西并润色。
[最后更新日期: 2019/01/30] 译者注:这是这个日文原文的更新日期
在这里,我们将解释如何从输入坐标来确定模型的命中位置。
[导入 SDK-放置模型 ] 假设模型已经放置到项目中。
您也可以使用 Unity 的 Collider 进行命中判断,但是下面会对 Cubism SDK 中的功能进行说明。
概览
为了判断有没有命中,Cubism SDK 使用了一个名为 Raycast 的组件。
SDK 中包含一个使用此组件的名为 [Raycasting] 的示例项目,也可以参考他。
/Assets/Live2D/Cubism/Samples/Raycasting
要设置 Raycast ,请执行以下三件事:
- 附加 Raycast 到组件
- 指定用于命中判断的美术网格
- 从 CubismRaycaster.Raycast 获得判断结果
附加 Raycast 到组件
将名为 CubismRaycaster
的组件附加到显示模型的 GameObject 上,以做命中判断处理。
指定用于命中判断的美术网格
在 [模型]/Drawables/
下,可以管理每个用于绘制的艺术网格的 GameObject。
GameObject 的名称是该参数的 ID。
将 CubismRaycastable
附加到被视为 "命中判断范围" 的 GameObject 上。
在 CubismRaycastable
中,可以选择命中判断范围。
- Bounding Box : 包围网格的矩形用作命中判断。比 Triangles 性能损耗更小。
- Triangles : 网格的形状用作命中判断。如果要准确判断范围,请设置此项。
从 CubismRaycaster.Raycast 获得判断结果
最后,调用附在模型根节点上 CubismRaycaster 的 Raycast() 获取是否命中。
创建一个名为 CubismHitTest
的 C#脚本,添加如下代码,并将其附加到模型的根目录。
using UnityEngine;
using Live2D.Cubism.Framework.Raycasting;
public class CubismHitTest : MonoBehaviour
{
private void Update()
{
// Return early in case of no user interaction.
// 如果没有用户交互,尽早 return。
if (!Input.GetMouseButtonDown(0))
{
return;
}
var raycaster = GetComponent<CubismRaycaster>();
// Get up to 4 results of collision detection.
// 最多获取 4 个碰撞检测结果。
var results = new CubismRaycastHit[4];
// Cast ray from pointer position.
// 从指针位置投射射线。
var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
var hitCount = raycaster.Raycast(ray, results);
// Show results.
// 展示结果
var resultsText = hitCount.ToString();
for (var i = 0; i < hitCount; i++)
{
resultsText += "n" + results[i].Drawable.name;
}
Debug.Log(resultsText);
}
}
这样就完成了设置。
这种状态下运行,在 “Game(游戏)” 视图中点击了附加 Cubism Raycastable
的网格,则命中判断的结果将输出到 "Console(控制台)" 视图。
输出示例
3
layer0
layer2
layer6