ボタン貫通クリックの実現方法
今回の主な話題:ボタン貫通クリックの実現方法、Meshに基づいてFBXでのパスを検索します、IL2CPP使用後Monoメモリはありますか、Prefabインスタンス化するときのMesh合併、UGUI TEXTでのBest Fitパフォーマンスコスト。
UI
Q1: ボタンが重なっている場合、上のボタンと下のボタンを同時に実行できることをどのように実現しますか?つまり、タッチモニターを貫通させて停止させなくなさせたいですが、UGUIでどうすればいいですか?
私たちのやり方は、この処理を行う必要のあるコントロールにスクリプトを添付し、EventSystemのソースコードを変更しませんでした。要件に応じて、滑り時間を検出するフルスクリーンUIを作成することをお勧めします。
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using UnityEngine.UI; using System.Collections.Generic; namespace KEngine.UI { public class TouchPenetrate : MonoBehaviour, IPointerClickHandler { public bool PenetrateOneLayer = true; //クリックを監視する public void OnPointerClick(PointerEventData eventData) { //PassEvent(eventData, ExecuteEvents.submitHandler); PassEvent(eventData, ExecuteEvents.pointerClickHandler); } //イベントを貫通する public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler { List<RaycastResult> results = new List<RaycastResult>(); EventSystem.current.RaycastAll(data, results); GameObject current = data.pointerCurrentRaycast.gameObject; for (int i = 0; i < results.Count; i++) { if (current != results[i].gameObject) { ExecuteEvents.Execute(results[i].gameObject, data, function); if (PenetrateOneLayer) { //イベントを1つレイヤーのみをトリガーする break; } } } } } }
Editor
Q2: 現在、プロジェクトにいくつかのアセットのクリアを行う必要があり、いくつかの不要なMeshを削除します。そのために、すべてのPrefabで使用されるMeshのあるFBXのパスを取得する必要があります。そしてモデリングソフトウェアにFBXして、中に再び使わないMeshを削除します。今は名前に介してPrefabにMeshのあるFBXを取得できますが、FBXに複数のMeshが存在する場合、使用されているMeshを特定するにはどうすればよいですか?
名前を介してMeshのあるFBX内のパスを直接取得することはできませんが、比較してFBX内のMeshを確認し、パスを見つけることができます。
private static string GetMeshPath(string modelPath, MeshFilter prefabFilter) { GameObject model = AssetDatabase.LoadAssetAtPath<GameObject>(modelPath); if (!model) { Debug.LogWarning("No game object found at " + modelPath, prefabFilter); return null; } MeshFilter modelFilter = null; foreach (MeshFilter filter in model.GetComponentsInChildren<MeshFilter>(true)) { if (filter.sharedMesh == prefabFilter.sharedMesh) { modelFilter = filter; break; } } if (!modelFilter) { Debug.LogWarning("No game object found for " + prefabFilter, prefabFilter); return null; } Transform transform = modelFilter.transform; string path = transform.name; while (transform.parent) { transform = transform.parent; path = transform.name + "/" + path; } return path; }
IL2CPP
Q3: IL2CPPを使用した後にMonoメモリはまた存在しますか?IL2CPPを使用した後、Profilerツールで取得したManage Object(例えば、Int32[])はどのような種類のメモリですか?
IL2CPPはMonoの仮想マシンの実装を取り代わただけであると簡単に考えることができるため、ヒープメモリを割り当てる必要がある場所は同じように割り当てられます(詳細にいくつかの違いがある場合があります)。
ヒープメモリ割り当てに関するIL2CPPとMonoの最大の違いは、IL2CPPのReserved Totalを減らすことができることです。しかし、MonoのReserved Totalは増やす一方で降下できません。
Mesh
Q4: Prefab複数のSub Meshが含まれています。シーンでこのPrefabを初期化すると、これらのSub Meshが合併されます。 合併されないようにするにはどうすればよいですか。
Import Settingsにある「Weld Vertices」のチェックを外して試してください。このオプションは、位置の同じ頂点を自動的にマージし、デフォルトでオンになさせます。
UGUI
Q5: UGUIに最適化に関する記事をいくつか読みました。全部がTEXTでBest Fit属性をチェックしないと述べました。しかし、ProfilerのFrame Debuggerで関するText_OnPopulateMeshコスト値が見つかりませんでした。現在のUIでチェックされているBest Fitは大きすぎるパフォーマンスコストをあまり引き起こさないことを意味しますか?つまり、現在のUIにあるBest Fitに関するコストはどこで確認できますか?
PS:メモリに対応する変更はありません。
Best Fitの主な機能は、テキストボックスのサイズが変更されると、テキストボックスのフォントサイズが自動的に調整されることです。一般的に、次の2つの問題が発生します。
1、ゲーム内のフォントサイズが均一ではありません。たとえば、21、22、23、24も可能性があります。各フォントサイズで新しく生成された字は、対応するFont Textureで1つの字のサイズを占めるため、Font Textureメモリ占用を大きくなさせやすいです。
2、実行中に、テキストボックスのサイズを動的に変更することによって発生する追加コスト。一部のプロジェクトでは、テキストボックスのサイズの動的調整(テキストアニメーションなど)を引き起こしたことに遭いました。このタイプのテキストにBest Fitをチェックすれば、余分なCPU時間コストがかかります。
Font Textureのサイズは、フォント種類、フォントサイズ、テキスト内容の影響を受けます。変更がない場合は、内容が512 * 1024の範囲を超えていないか、別のFont Textureが生成されますか?これに対するBest Fitの主な影響は、フォントサイズが均一でないことです。チェックしてもフォントサイズが変わらない場合は、影響はありません。
UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com
UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com