用Mask遮罩SkeletonGraphic组件时,遇到无法正确裁切的问题。
通过添加自定义组件 SkeletonClip 来决绝这个问题:
1.将组件挂载到SkeletonGraphic所在gameObject。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class SkeletonClip : MonoBehaviour {
//遮挡容器,即Mask
RectTransform rectTrans;
private void Start() {
UpdateClip();
}
public void UpdateClip(){
rectTrans = transform.GetComponentInParent<Mask>()?.transform as RectTransform;
if (rectTrans == null){
return;
}
//spine动画的材质
var _spineMat = transform.GetComponent<Spine.Unity.SkeletonGraphic>().material;
if (_spineMat != null){
/*使用另外一个Shader
var _shaderOnMat = Shader.Find(_spineMat.shader.name+"InMask");
if (_shaderOnMat){
_spineMat.shader = _shaderOnMat;
}
*/
//使用变体
_spineMat.EnableKeyword("USING_MASK");
}
//获取世界坐标系下的四个角的坐标
Vector3[] _corners = new Vector3[4];
rectTrans.GetWorldCorners(_corners);
//取得上下左右的边界
float _minX = _corners[0].x;
float _minY = _corners[0].y;
float _maxX = _corners[2].x;
float _maxY = _corners[2].y;
//将边界数设置到材质上
_spineMat.SetFloat("_MinX", _minX);
_spineMat.SetFloat("_MinY", _minY);
_spineMat.SetFloat("_MaxX", _maxX);
_spineMat.SetFloat("_MaxY", _maxY);
}
}
2.另外还要重写一下SkeletonGrapic所使用的Shader "Spine/Skeleton"
通过 USING_MASK 标示,来选择不同的变体
3.注意Spine创建的模式,右键菜单创建的Spine,如下流程
材质是公用的,也就是说Shader也是公用的。使用变体无法起作用,因为运行时,Shader实例是一个。
这时,需要DIY,通过代码创建Spine或者创建一个新材质来关联Mask下生效的Shader.