@@ -7,7 +7,8 @@ namespace ReadyPlayerMe.Core
7
7
{
8
8
public static class AvatarMeshHelper
9
9
{
10
- private static readonly string [ ] headMeshNames = {
10
+ private static readonly string [ ] headMeshNames =
11
+ {
11
12
"Renderer_Head" ,
12
13
"Renderer_Hair" ,
13
14
"Renderer_Beard" ,
@@ -16,15 +17,15 @@ public static class AvatarMeshHelper
16
17
"Renderer_EyeLeft" ,
17
18
"Renderer_EyeRight" ,
18
19
"Renderer_Headwear" ,
19
- "Renderer_Facewear" ,
20
+ "Renderer_Facewear"
20
21
} ;
21
22
22
23
[ Obsolete ( "Use TransferMesh(GameObject source, GameObject target) instead." ) ]
23
24
public static void TransferMesh ( GameObject source , SkinnedMeshRenderer [ ] targetMeshes , Animator targetAnimator )
24
25
{
25
26
TransferMesh ( source , targetMeshes [ 0 ] . transform . parent . gameObject ) ;
26
27
}
27
-
28
+
28
29
/// <summary>
29
30
/// Transfers the mesh and material data from the source to the target avatar.
30
31
/// </summary>
@@ -34,23 +35,30 @@ public static void TransferMesh(GameObject source, GameObject target)
34
35
{
35
36
// store the relevant data of the source (downloaded) avatar
36
37
var rendererDict = new Dictionary < string , SkinnedMeshRenderer > ( ) ;
37
-
38
+
38
39
var sourceRenderers = source . GetComponentsInChildren < SkinnedMeshRenderer > ( ) ;
39
40
var targetRenderers = target . GetComponentsInChildren < SkinnedMeshRenderer > ( ) ;
40
-
41
+
41
42
foreach ( var renderer in sourceRenderers )
42
43
{
43
44
rendererDict . Add ( renderer . name , renderer ) ;
44
45
}
45
-
46
+
47
+ var meshWithBones = targetRenderers . DefaultIfEmpty ( null ) . FirstOrDefault ( ( renderer ) => renderer . bones . Length != 0 ) ;
48
+
46
49
// transfer the data to the target skinning mesh renderers
47
50
foreach ( var renderer in targetRenderers )
48
51
{
49
52
if ( rendererDict . TryGetValue ( renderer . name , out var sourceRenderer ) )
50
53
{
51
54
renderer . sharedMesh = sourceRenderer . sharedMesh ;
52
55
renderer . sharedMaterial = sourceRenderer . sharedMaterial ;
53
-
56
+
57
+ if ( renderer . bones . Length == 0 && meshWithBones != null )
58
+ {
59
+ renderer . bones = meshWithBones . bones ;
60
+ continue ;
61
+ }
54
62
// transfer the bone data
55
63
foreach ( var targetBone in renderer . bones )
56
64
{
@@ -61,7 +69,7 @@ public static void TransferMesh(GameObject source, GameObject target)
61
69
targetBone . position = sourceBone . position ;
62
70
targetBone . rotation = sourceBone . rotation ;
63
71
targetBone . localScale = sourceBone . localScale ;
64
- break ;
72
+ break ;
65
73
}
66
74
}
67
75
}
@@ -72,13 +80,13 @@ public static void TransferMesh(GameObject source, GameObject target)
72
80
renderer . material = null ;
73
81
}
74
82
}
75
-
83
+
76
84
// transfer the animation avatar
77
85
var sourceAnimator = source . GetComponentInChildren < Animator > ( ) ;
78
86
var targetAnimator = target . GetComponentInChildren < Animator > ( ) ;
79
87
targetAnimator . avatar = sourceAnimator . avatar ;
80
88
}
81
-
89
+
82
90
/// <summary>
83
91
/// Returns the meshes of the head of the avatar, such as glasses, hair, teeth, etc.
84
92
/// </summary>
@@ -88,15 +96,15 @@ public static GameObject[] GetHeadMeshes(GameObject avatar)
88
96
{
89
97
var renderers = avatar . GetComponentsInChildren < SkinnedMeshRenderer > ( ) ;
90
98
var headMeshes = new List < GameObject > ( ) ;
91
-
99
+
92
100
foreach ( var renderer in renderers )
93
101
{
94
102
if ( headMeshNames . Contains ( renderer . name ) )
95
103
{
96
104
headMeshes . Add ( renderer . gameObject ) ;
97
105
}
98
106
}
99
-
107
+
100
108
return headMeshes . ToArray ( ) ;
101
109
}
102
110
}
0 commit comments