赞
踩
用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.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。