目录
序言
当我们点击Live2D角色身体某一部分时,角色将会播放对应动画和对应的音频,表情等。接下来就是实现这种效果
一、射线检测
第一种方法:
根据预制体下的Drawables部分,可以在对应部分添加相应的碰撞器来检测射线,这种方法比较简单,可以看Unity射线检测这篇文章理解并制作。
第二种方法:
使用Cubism自带的射线检测。
现在角色根目录上挂载CubismRaycast组件
然后再Drawables部分里,选择想要触发动作的部分,添加CubismRaycastable组件,这样就可以检测这些添加组件的身体部分,给它们设置相应的Tag值以便用来检测获取。
Precision | BoundingBox盒形检测区域(精确度低,性能消耗少) | Triangles三角面检测区域(精确度高,性能消耗多) |
添加完后创建并且编写脚本(举例)并赋值
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Live2D.Cubism.Framework.Raycasting;
public class CubismRayHit : MonoBehaviour
{
//射线检测标签枚举
public enum RayHitTag
{
Head,Arm,Chest,Cloth,Leg
}
//序列化的动画数据结构体,方便Ispector赋值
[System.Serializable]
public struct AnimData
{
public RayHitTag tag;
public AnimationClip clip;
}
//动画数据列表
public List<AnimData> animDatas = new List<AnimData>();
//射线可检测列表,用来确定射线检测信息的大小
public List<CubismRaycastable> rayAbles = new List<CubismRaycastable>();
private void Update()
{
if (!Input.GetMouseButtonDown(0))
return;
//射线检测定义
CubismRaycaster rayCaster = GetComponent<CubismRaycaster>();
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
CubismRaycastHit[] hits = new CubismRaycastHit[rayAbles.Count];
//返回检测到的大小
int hitCount = rayCaster.Raycast(ray, hits);
//循环遍历
for(int i = 0; i < hitCount; i++)
{
switch (hits[i].Drawable.tag)
{
case "Head":
//调用之前写好的动画播放单例方法 CubismMotion.instance.MotionPlay(animDatas.Find(s=>s.tag==RayHitTag.Head).clip);
break;
case "Arm":
CubismMotion.instance.MotionPlay(animDatas.Find(s => s.tag == RayHitTag.Arm).clip);
break;
case "Chest":
CubismMotion.instance.MotionPlay(animDatas.Find(s => s.tag == RayHitTag.Chest).clip);
break;
case "Cloth":
CubismMotion.instance.MotionPlay(animDatas.Find(s => s.tag == RayHitTag.Cloth).clip);
break;
case "Leg":
CubismMotion.instance.MotionPlay(animDatas.Find(s => s.tag == RayHitTag.Leg).clip);
break;
}
}
}
}