当前位置:   article > 正文

Spine动画在Mask下显示异常的解决方案_unity spine mask

unity spine mask

Mask遮罩SkeletonGraphic组件时,遇到无法正确裁切的问题。 

通过添加自定义组件 SkeletonClip 来决绝这个问题:

1.将组件挂载到SkeletonGraphic所在gameObject。

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. public class SkeletonClip : MonoBehaviour {
  6. //遮挡容器,即Mask
  7. RectTransform rectTrans;
  8. private void Start() {
  9. UpdateClip();
  10. }
  11. public void UpdateClip(){
  12. rectTrans = transform.GetComponentInParent<Mask>()?.transform as RectTransform;
  13. if (rectTrans == null){
  14. return;
  15. }
  16. //spine动画的材质
  17. var _spineMat = transform.GetComponent<Spine.Unity.SkeletonGraphic>().material;
  18. if (_spineMat != null){
  19. /*使用另外一个Shader
  20. var _shaderOnMat = Shader.Find(_spineMat.shader.name+"InMask");
  21. if (_shaderOnMat){
  22. _spineMat.shader = _shaderOnMat;
  23. }
  24. */
  25. //使用变体
  26. _spineMat.EnableKeyword("USING_MASK");
  27. }
  28. //获取世界坐标系下的四个角的坐标
  29. Vector3[] _corners = new Vector3[4];
  30. rectTrans.GetWorldCorners(_corners);
  31. //取得上下左右的边界
  32. float _minX = _corners[0].x;
  33. float _minY = _corners[0].y;
  34. float _maxX = _corners[2].x;
  35. float _maxY = _corners[2].y;
  36. //将边界数设置到材质上
  37. _spineMat.SetFloat("_MinX", _minX);
  38. _spineMat.SetFloat("_MinY", _minY);
  39. _spineMat.SetFloat("_MaxX", _maxX);
  40. _spineMat.SetFloat("_MaxY", _maxY);
  41. }
  42. }

2.另外还要重写一下SkeletonGrapic所使用的Shader "Spine/Skeleton"

通过 USING_MASK 标示,来选择不同的变体

3.注意Spine创建的模式,右键菜单创建的Spine,如下流程

材质是公用的,也就是说Shader也是公用的。使用变体无法起作用,因为运行时,Shader实例是一个。

这时,需要DIY,通过代码创建Spine或者创建一个新材质来关联Mask下生效的Shader.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/399889
推荐阅读
相关标签
  

闽ICP备14008679号