using System.Collections.Generic; using UnityEngine; using Script.Gameplay.Connect; namespace Script.Gameplay.Facility { public class PressurePlateController : BaseFacilityController { [SerializeField] private LayerMask detectLayer = ~0; // 检测所有层,可在Inspector中指定 [SerializeField] private Vector3 plateSize = new Vector3(1, 0.2f, 1); [SerializeField] private Vector3 plateOffset = Vector3.up * 0.1f; [SerializeField] private GameObject pressTopPrefab; [SerializeField] private AudioClip pressedSound; [SerializeField] private AudioClip returnSound; [SerializeField] private AudioSource plateSound; private bool lastState = false; private bool hasObject = false; private void FixedUpdate() { if (!isOpenInEditor) return; hasObject = Physics.CheckBox(transform.position + plateOffset, plateSize * 0.5f, Quaternion.identity, detectLayer); if (hasObject != lastState) { SendSignal(hasObject, this.gameObject); lastState = hasObject; if (hasObject) { // 被压下动画 if (pressTopPrefab != null) { pressTopPrefab.transform.localPosition = new Vector3(0, 0, 0.1f); plateSound.clip = pressedSound; plateSound.Play(); } } else { // 弹起动画 if (pressTopPrefab != null) { pressTopPrefab.transform.localPosition = new Vector3(0, 0, 1); plateSound.clip = returnSound; plateSound.Play(); } } } } #if UNITY_EDITOR private void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Gizmos.DrawWireCube(transform.position + plateOffset, plateSize); } #endif } }