其他分享
首页 > 其他分享> > 【VR开发篇】解决使用FinalIK插件开发VR时,手节点下放置粒子系统,无法触发粒子系统的OnParticleCollision()事件

【VR开发篇】解决使用FinalIK插件开发VR时,手节点下放置粒子系统,无法触发粒子系统的OnParticleCollision()事件

作者:互联网

【VR开发篇】解决使用FinalIK插件开发VR时,手节点下放置粒子系统,无法触发粒子系统的OnParticleCollision()事件


文章目录


前言

提示:
开发VR时,如果有实体的人物模型作为第一人称VR头显要控制的对象,就需要用到FinalIK插件。
但最近开发项目时发现如果控制人物拿起水枪并且水枪节点下挂载了水粒子系统,那么无论怎么配置粒子系统都不会触发private void OnParticleCollision(GameObject other)事件。
针对此问题,对FinalIK进行一番研究,最终找到问题所在!


一、测试环境

资源链接:FinalIK 2.0.unitypackage 点击下载 【提取码:cy2g 】
友情提示:该资源来源于网络,仅供学习使用!

二、单元测试

1.追根溯源

导入FinalIK插件的工作就不过多赘述了,直接上干货;
在这里插入图片描述

  • 1、消防员上一定要挂载Animator组件,并且带有对应的骨骼Avatar;
    在这里插入图片描述
  • 2、消防员模型的.fbx文件Rig的Aniamtion Type类型一定要设置成Humanoid,设置完成记得点击Apply
    在这里插入图片描述
  • 3、选中消防员,在Inspector面板鼠标右键VRIK脚本,点击AutoDetectReferences按钮,会自动将References下的所有参数自动填上,正常如果模型配置没问题,在挂载VRIK脚本的一瞬间,这些参数就会自动填上。
    在这里插入图片描述
  • 1、可以看到粒子穿过了褐色的透明墙体。
    在这里插入图片描述
  • 将VRIK脚本的FixTransform取消勾选,就会发现人物模型出现奇怪的扭动,但粒子可以打到半透明墙体上了。
    在这里插入图片描述

2.问题所在

 public override void FixTransforms()
        {
            if (!initiated) return;
            if (LOD >= 2) return;

            for (int i = 1; i < solverTransforms.Length; i++)
            {
                if (solverTransforms[i] != null)
                {
                    bool isPelvis = i == 1;

                    bool isArmStretchable = i == 8 || i == 9 || i == 12 || i == 13;
                    bool isLegStretchable = (i >= 15 && i <= 17) || (i >= 19 && i <= 21);

                    if (isPelvis || isArmStretchable || isLegStretchable)
                    {
                        solverTransforms[i].localPosition = defaultLocalPositions[i - 1];
                    }
                    solverTransforms[i].localRotation = defaultLocalRotations[i - 1];
                }
            }
        }

2.解决问题

 bool _bIsFixNode = false;
 public override void FixTransforms()
 {
      if (!initiated) return;
      if (LOD >= 2) return;
      for (int i = 1; i < solverTransforms.Length; i++)
      {
          if (solverTransforms[i] != null)
          {
              switch (i)
              {
                  case 1: _bIsFixNode = true; break; // Hips
                  case 2: _bIsFixNode = true; break; // Spine
                  case 3: _bIsFixNode = true; break; // Spine 1
                  case 4: _bIsFixNode = true; break; // Bip001 Neck
                  case 5: _bIsFixNode = true; break; // Head
                  case 6: _bIsFixNode = false; break; // Left Shoulder
                  case 7: _bIsFixNode = false; break; // Left UpperArm
                  case 8: _bIsFixNode = false; break; // Left LowerArm
                  case 9: _bIsFixNode = false; break; // Left Hand
                  case 10: _bIsFixNode = false; break;// Right Shoulder
                  case 11: _bIsFixNode = false; break;// Right UpperArm
                  case 12: _bIsFixNode = false; break;// Right LowerArm
                  case 13: _bIsFixNode = false; break;// Right Hand
                  case 14: _bIsFixNode = true; break;// Left UpperLeg
                  case 15: _bIsFixNode = true; break;// Left LowerLeg
                  case 16: _bIsFixNode = true; break;// Left Foot
                  case 17: _bIsFixNode = true; break;// Left Toes
                  case 18: _bIsFixNode = true; break;// Right UpperLeg
                  case 19: _bIsFixNode = true; break;// Right LowerLeg
                  case 20: _bIsFixNode = true; break;// Right Foot
                  case 21: _bIsFixNode = true; break;// Right Toes
                  default:_bIsFixNode = false; break;
              }

              if (_bIsFixNode)
              {
                  solverTransforms[i].localPosition = defaultLocalPositions[i - 1];
                  solverTransforms[i].localRotation = defaultLocalRotations[i - 1];
              }
          }
      }
  }

3.最终表现


三、总结

但实际上对于VR开发这些节点没有太大问题,位置不需要修正,因为左右手和头部都会跟随VR手柄和头显的位置实时计算;

标签:粒子系统,case,插件,false,bIsFixNode,break,VR,true
来源: https://blog.csdn.net/weixin_43349549/article/details/115248379