登录后台

页面导航

本文编写于 1483 天前,最后修改于 1483 天前,其中某些信息可能已经过时。

本文翻译自: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 ,请执行以下三件事:

  1. 附加 Raycast 到组件
  2. 指定用于命中判断的美术网格
  3. 从 CubismRaycaster.Raycast 获得判断结果

附加 Raycast 到组件

将名为 CubismRaycaster 的组件附加到显示模型的 GameObject 上,以做命中判断处理。

img

img

指定用于命中判断的美术网格

[模型]/Drawables/ 下,可以管理每个用于绘制的艺术网格的 GameObject。

GameObject 的名称是该参数的 ID。

CubismRaycastable 附加到被视为 "命中判断范围" 的 GameObject 上。

img

CubismRaycastable 中,可以选择命中判断范围。

  • Bounding Box : 包围网格的矩形用作命中判断。比 Triangles 性能损耗更小。
  • Triangles : 网格的形状用作命中判断。如果要准确判断范围,请设置此项。

img

从 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