Auto-size BoxCollider to exactly fit chanraotuibu mesh so it can be clicked

This commit is contained in:
yangbear
2026-07-11 10:19:20 +08:00
parent 5428b5d8f0
commit 5c76c9a7a0
@@ -10,32 +10,51 @@ public class ChanraoTuibuHandler : MonoBehaviour
public bool CanBeClicked() { return !_isFinished; }
void OnEnable()
{
// 自动添加并适配包裹该物体网格的 BoxCollider,保证鼠标可以点到
var mesh = GetMesh();
if (mesh != null)
{
var oldSph = GetComponent<SphereCollider>();
if (oldSph != null) Destroy(oldSph);
var col = GetComponent<BoxCollider>();
if (col == null) col = gameObject.AddComponent<BoxCollider>();
col.center = mesh.bounds.center;
col.size = mesh.bounds.size * 1.2f;
col.enabled = true;
}
else
{
if (GetComponent<Collider>() == null) gameObject.AddComponent<SphereCollider>().radius = 0.5f;
foreach (var r in GetComponentsInChildren<Renderer>(true)) r.enabled = false; CreateOutlineMesh();
}
foreach (var r in GetComponentsInChildren<Renderer>(true)) r.enabled = false;
CreateOutlineMesh();
_isFinished = false;
StopAllCoroutines();
StartCoroutine(BlinkOutline());
Debug.Log($"[ChanraoTuibu] OnEnable outline={_outlineMesh!=null}");
}
private Mesh GetMesh()
{
var mf = GetComponent<MeshFilter>();
if (mf == null) mf = GetComponentInChildren<MeshFilter>();
if (mf != null && mf.sharedMesh != null) return mf.sharedMesh;
var smr = GetComponent<SkinnedMeshRenderer>();
if (smr == null) smr = GetComponentInChildren<SkinnedMeshRenderer>();
if (smr != null && smr.sharedMesh != null) return smr.sharedMesh;
return null;
}
void CreateOutlineMesh()
{
if (_outlineMesh != null) return;
var mf = GetComponent<MeshFilter>();
if (mf == null) mf = GetComponentInChildren<MeshFilter>();
Mesh mesh = null;
if (mf != null && mf.sharedMesh != null)
{
mesh = mf.sharedMesh;
}
else
{
var smr = GetComponent<SkinnedMeshRenderer>();
if (smr == null) smr = GetComponentInChildren<SkinnedMeshRenderer>();
if (smr != null && smr.sharedMesh != null)
mesh = smr.sharedMesh;
}
Mesh mesh = GetMesh();
if (mesh == null) { Debug.LogWarning("[ChanraoTuibu] 无Mesh数据"); return; }
var shader = Shader.Find("Custom/OutlineUnlit");
if (shader == null) { Debug.LogWarning("[ChanraoTuibu] Shader缺失"); return; }
@@ -76,16 +95,17 @@ public class ChanraoTuibuHandler : MonoBehaviour
var mr = GetComponent<MeshRenderer>(); if (mr != null) mr.enabled = true;
foreach (var r in GetComponentsInChildren<Renderer>(true)) { if (_outlineMesh != null && r == _outlineMesh) continue; r.enabled = true; } // 显示模型
// 播放最后一句语音
var am = FindObjectOfType<AudioManager>();
if (am != null)
// 激活所有的 ping 进行第二轮包扎
var allPings = Object.FindObjectsOfType<PingClickHandler>();
foreach (var p in allPings)
{
#if UNITY_EDITOR
var finishClip = UnityEditor.AssetDatabase.LoadAssetAtPath<AudioClip>("Assets/Audio/people/伤员一切正常,包扎完毕.mp3");
if (finishClip != null) am.PlayVoice(finishClip);
#endif
if (p.gameObject.activeInHierarchy) // Wait, pings are still active, they just have _modelShown = true
{
p.ReEnableBorder();
}
}
Debug.Log("[ChanraoTuibu] chanraotuibu 已显示,所有 ping 边框已重新激活!");
}
public void ResetState()
{