原文鏈接: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按鍵處出現描述文字,鼠標指針變化,比較簡單
結束。