Skip to content

Commit a0e6438

Browse files
Merge pull request #28 from CyberAgentGameEntertainment/feature/error-message
Error messages and documentation when Read/Write is disabled.
2 parents dc418ec + 7fc1f75 commit a0e6438

5 files changed

Lines changed: 43 additions & 10 deletions

File tree

Assets/AirSticker/Runtime/Scripts/Core/DecalMeshRenderer.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ namespace AirSticker.Runtime.Scripts.Core
44
{
55
internal sealed class DecalMeshRenderer
66
{
7-
private readonly Component _receiverComponent;
8-
7+
private readonly Renderer _renderer;
98
public DecalMeshRenderer(Component receiverComponent, Material decalMaterial, Mesh mesh)
109
{
1110
Owner = new GameObject("AirStickerRenderer");
@@ -15,6 +14,7 @@ public DecalMeshRenderer(Component receiverComponent, Material decalMaterial, Me
1514
meshRenderer.material = decalMaterial;
1615
var meshFilter = Owner.AddComponent<MeshFilter>();
1716
meshFilter.mesh = mesh;
17+
_renderer = meshRenderer;
1818
}
1919
else if (receiverComponent is SkinnedMeshRenderer s)
2020
{
@@ -23,10 +23,10 @@ public DecalMeshRenderer(Component receiverComponent, Material decalMaterial, Me
2323
skinnedMeshRenderer.material = decalMaterial;
2424
skinnedMeshRenderer.rootBone = s.rootBone;
2525
skinnedMeshRenderer.bones = s.bones;
26+
_renderer = skinnedMeshRenderer;
2627
}
27-
28-
_receiverComponent = receiverComponent;
29-
Owner.transform.parent = _receiverComponent.transform;
28+
29+
Owner.transform.parent = receiverComponent.transform;
3030
Owner.transform.localPosition = Vector3.zero;
3131
Owner.transform.localRotation = Quaternion.identity;
3232
Owner.transform.localScale = Vector3.one;
@@ -36,12 +36,12 @@ public DecalMeshRenderer(Component receiverComponent, Material decalMaterial, Me
3636

3737
public void DisableDecalMeshRenderer()
3838
{
39-
_receiverComponent.gameObject.SetActive(false);
39+
_renderer.gameObject.SetActive(false);
4040
}
4141

4242
public void EnableDecalMeshRenderer()
4343
{
44-
_receiverComponent.gameObject.SetActive(true);
44+
_renderer.gameObject.SetActive(true);
4545
}
4646

4747
public void Destroy()

Assets/AirSticker/Runtime/Scripts/Core/TrianglePolygonsFactory.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@ private static int GetNumPolygonsFromSkinModelRenderers(SkinnedMeshRenderer[] sk
7474
{
7575
if (!renderer || renderer.sharedMesh == null) return -1;
7676
var mesh = renderer.sharedMesh;
77+
if (mesh.isReadable == false)
78+
{
79+
Debug.LogError($"The mesh of the skinned mesh renderer named {renderer.name} is not readable. Please set the Read/Write Enabled flag in the model import settings.");
80+
return -1;
81+
}
82+
7783
numPolygon += mesh.triangles.Length / 3;
7884
}
7985

@@ -106,6 +112,11 @@ private static int GetNumPolygonsFromMeshFilters(MeshFilter[] meshFilters)
106112
{
107113
if (!meshFilter || meshFilter.sharedMesh == null) return -1;
108114
var mesh = meshFilter.sharedMesh;
115+
if(mesh.isReadable == false)
116+
{
117+
Debug.LogError($"The mesh of the mesh filter named {meshFilter.name} is not readable. Please set the Read/Write Enabled flag in the model import settings.");
118+
return -1;
119+
}
109120
var numPoly = mesh.triangles.Length / 3;
110121
numPolygon += numPoly;
111122
}
@@ -118,8 +129,12 @@ private static void CalculateCapacityConvexPolygonInfos(MeshFilter[] meshFilters
118129
float terrainMehResolutionScale)
119130
{
120131
var capacity = 0;
121-
capacity += GetNumPolygonsFromMeshFilters(meshFilters);
122-
capacity += GetNumPolygonsFromSkinModelRenderers(skinnedMeshRenderers);
132+
var numPolygonsFromMeshFilters = GetNumPolygonsFromMeshFilters(meshFilters);
133+
var numPolygonsFromSkinModelRenderers = GetNumPolygonsFromSkinModelRenderers(skinnedMeshRenderers);
134+
// GetNumPolygonsFromMeshFilters and GetNumPolygonsFromSkinModelRenderers may return -1 if they cannot obtain the polygon count.
135+
if (numPolygonsFromMeshFilters > 0) capacity += numPolygonsFromMeshFilters;
136+
if( numPolygonsFromSkinModelRenderers > 0) capacity += numPolygonsFromSkinModelRenderers;
137+
123138
capacity += GetNumPolygonsFromTerrains(terrains, terrainMehResolutionScale);
124139
if (capacity > 0) convexPolygonInfos.Capacity = capacity;
125140
}
@@ -281,6 +296,10 @@ private IEnumerator BuildFromSkinMeshRenderer(SkinnedMeshRenderer[] skinnedMeshR
281296
// The skinned mesh renderer is deleted, so process is terminated.
282297
yield break;
283298
var mesh = skinnedMeshRenderer.sharedMesh;
299+
if (mesh.isReadable == false)
300+
{
301+
yield break;
302+
}
284303

285304
using var meshDataArray = Mesh.AcquireReadOnlyMeshData(mesh);
286305
var meshData = meshDataArray[0];

Documentation/fig-016.png

97.7 KB
Loading

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,5 +218,12 @@ void LaunchProjector(
218218
</p>
219219

220220

221+
### 4.4 Important Note
222+
Please note that the receiver model must have `Read/Write` enabled in its `Import Settings`.
223+
<p align="center">
224+
<img width="50%" src="Documentation/fig-016.png" alt="Model Import Settings"><br>
225+
<font color="grey">Model Import Settings</font>
226+
</p>
227+
221228

222229

README_JA.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ AirStickerProjectorコンポーネントには5つのパラメータを設定す
160160
|Width|Projector バウンディングボックスの幅です。URPのデカールプロジェクタの仕様に準拠しています。<br/>詳細は[URPデカールのマニュアル](https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/renderer-feature-decal.html)を参照してください。 |
161161
|Height|Projector バウンディングボックスの高さです。URPのデカールプロジェクタの仕様に準拠しています。<br/>詳細は[URPデカールのマニュアル](https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/renderer-feature-decal.html)を参照してください。|
162162
|Depth|Projector バウンディングボックスの深度です。URPのデカールプロジェクタの仕様に準拠しています。<br/>詳細は[URPデカールのマニュアル](https://docs.unity3d.com/ja/Packages/com.unity.render-pipelines.universal@14.0/manual/renderer-feature-decal.html)を参照してください。|
163-
|Receiver Objects| デカールテクスチャの貼り付け対象となるオブジェクト。<br/>AirStickerProjectorは設定されているレシーバーオブジェクトの子供(自身を含む)に貼られている全てのレンダラーを貼り付け対象とします。<br/><br/>そのため、レシーバーオブジェクトはMeshRendererやSkinMeshRendererなどのコンポーネントが貼られているオブジェクトを直接指定もできますし、レンダラーが貼られているオブジェクトを子供に含んでいるオブジェクトの指定でも構いません。<br/>処理するレンダラーの数が多いほど、デカールメッシュ生成の時間がかかるようになるため、貼り付ける範囲を限定できるときは、レンダラーが貼り付けられているオブジェクトの直接指定が推奨されます。<br/><br/>例えば、キャラエディットなどでキャラクターの顔にステッカーを貼り付けたい場合、キャラのルートオブジェクトを指定するよりも顔のレンダラーが貼られているオブジェクトを指定するとメッシュ生成の時間を短縮できます。|
163+
|Receiver Objects| デカールテクスチャの貼り付け対象となるオブジェクト。<br/>AirStickerProjectorは設定されているレシーバーオブジェクトの子供(自身を含む)に貼られている全てのレンダラーを貼り付け対象とします。<br/><br/>そのため、レシーバーオブジェクトはMeshRendererやSkinMeshRendererなどのコンポーネントが貼られているオブジェクトを直接指定もできますし、レンダラーが貼られているオブジェクトを子供に含んでいるオブジェクトの指定でも構いません。<br/>処理するレンダラーの数が多いほど、デカールメッシュ生成の時間がかかるようになるため、貼り付ける範囲を限定できるときは、レンダラーが貼り付けられているオブジェクトの直接指定が推奨されます。<br/><br/>例えば、キャラエディットなどでキャラクターの顔にステッカーを貼り付けたい場合、キャラのルートオブジェクトを指定するよりも顔のレンダラーが貼られているオブジェクトを指定するとメッシュ生成の時間を短縮できます。<br/>|
164164
|Z Offset In Decal Space|デカールを貼り付けるサーフェイスの空間でのZオフセットです。この値を調整することで、Zファイティングを軽減することができます。|
165165
|Decal Material| デカールマテリアル。<br/>URPのデカールマテリアルとは意味あいが違うので注意してください。<br/>URPデカールではShader Graphs/Decalシェーダーが割り当てられたマテリアルしか使えません。<br/>しかし、Air Stickerでは通常のマテリアルが使えます。<br/>つまり、ビルトインのLitシェーダー、Unlitシェーダー、そして、ユーザーカスタムの独自シェーダーも利用できます。|
166166
|Projection Backside|このチェックボックスにチェックが入っていると、裏面のメッシュにもデカールメッシュが投影されます。|
@@ -212,4 +212,11 @@ void LaunchProjector(
212212
© Unity Technologies Japan/UC
213213
</p>
214214

215+
### 4.4 注意実行
216+
レシーバとなるモデルは`Import Settings``Read/Write`が有効になっている必要があるので注意してください。
217+
<p align="center">
218+
<img width="50%" src="Documentation/fig-016.png" alt="モデルのインポート設定"><br>
219+
<font color="grey">モデルのインポート設定</font>
220+
</p>
221+
215222

0 commit comments

Comments
 (0)