Auto-size BoxCollider to exactly fit chanraotuibu mesh so it can be clicked
This commit is contained in:
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user