当たり判定の設定
最終更新: 2020年1月30日
ここでは、入力された座標からモデルの当たり判定を取得する方法を説明します。
[SDKのインポート~モデルを配置]をおこなったプロジェクトに追加することを前提とした説明となっています。
当たり判定の取得には、UnityのColliderを利用することもできますが、以下はCubism SDKに含まれる機能を利用する場合の説明です。
概要
当たり判定を取得するには、Cubism SDKでは、 Raycast というコンポーネントを利用します。
SDKには、このコンポーネントを使った[Raycasting]というサンプルプロジェクトが同梱されておりますので、そちらもあわせてご覧ください。
/Assets/Live2D/Cubism/Samples/Raycasting
Raycastを設定するには、以下の3つを行ないます。
- Raycastを実行するコンポーネントのアタッチ
- 当たり判定に使用するアートメッシュを指定
- CubismRaycaster.Raycastから判定の結果を取得
Raycastを実行するコンポーネントのアタッチ
モデルのルートとなるGameObjectに、当たり判定の処理を行う[CubismRaycaster]というコンポーネントをアタッチします。


当たり判定に使用するアートメッシュを指定
[モデル]/Drawables/ 以下には、描画されるアートメッシュひとつひとつを管理するGameObjectが配置されています。
GameObjectの名前は、そのパラメータのIDとなっています。
このGameObjectの中から当たり判定用の範囲として扱うものに、[CubismRaycastable]をアタッチします。

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.
        if (!Input.GetMouseButtonDown(0))
        {
            return;
        }
        var raycaster = GetComponent<CubismRaycaster>();
        // Get up to 4 results of collision detection.
        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ビューでCubismRaycastableがアタッチされたメッシュをクリックすると、当たり判定の結果をConsoleビューに出力します。
実行例
3
layer0
layer2
layer6