原文链接:https://www.cnblogs.com/LynnVon/p/13453938.html

  

  1、总的思路是通过点击发射射线LineTraceByChannel获取当前点击的模型BoneName,然后查表获得此BoneName对应的按键类型,再通过按键的类型决定如何处理此Bone(位置、旋转),最后再通过PoseableMeshComponent将Bone的transform同步给SkeletalMesh(需要自定义动画节点)。

  2、我将座舱内的按键分为Button、Switch、Knob、KnobSwitch、Cover五种

  

 

  3、通过DataTable存储每个按键的类型,初始状态,点击后的transform变化,执行的方法,按键描述文字,旋钮按键的数目等,下图为datatable的structure

  

  

 

  4、要想模型的每个按键可以点击,必须为每个按键建立独立的collider

   

 

   5、点击获得BoneName,通过bonename查datatable得到数据,再通过按键类型分别对五种按键分别处理,button就移动位置,Swich需要区分当前所处的状态,因为switch可以向上,可以向下,左右都可以板动。

    Knob就是旋转,KnobSwitch也是旋转,只不过旋转的值是固定的,上边Structure的switchNum的意思就是KnobSwitch总共有几个值。Cover也是单纯旋转就可以了。

  6、五种按键按下都会执行对应的方法,通过FindFunction实现。

  7、按键的移动简单,旋转见下图

  

  

  我试了直接GetBoneRotationByName(BoneSpace)然后加上从datatable获得的state1的rotation值,但总是在轴上出问题,最后不得以GetBoneRotationByName(WorldSpace)然后再转成BoneSpace,加上从datatable获得的state1的rotation值

  再通过TransformFromBoneSpace转成worldSpace,然后SetBoneRotationByName(worldSpace)才正确。

  8、按键transform变化都是操作PoseableMesh的,在操作完之后通过将PoseableMesh的变化同步到SkeletalMesh的AnimationBlueprint,完成。

  

  9、从PoseableMesh同步到SkeletalMesh的部分,可以看https://blog.csdn.net/sddxccj/article/details/102306489这篇文章,还有我之前的https://www.cnblogs.com/LynnVon/p/13334523.html

  10、在BeginPlay的部分需要对按键进行初始化,有些按键的初始状态,旋转等,还要记录下所有按键的当前状态,便于后边点击的时候区分,还要对skeletal进行初始化,例如BoneName数组的填充

  

  11、还有鼠标hover按键处出现描述文字,鼠标指针变化,比较简单

  结束。