LockedDoor.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using UnityEngine;
  2. namespace DunGen.Demo
  3. {
  4. public class LockedDoor : MonoBehaviour, IKeyLock
  5. {
  6. public Key Key { get { return keyManager.GetKeyByID(keyID); } }
  7. public float OpenDuration = 1.0f;
  8. public Vector3 OpenPositionOffset = new Vector3(0, -3, 0);
  9. [HideInInspector]
  10. [SerializeField]
  11. private int keyID;
  12. [HideInInspector]
  13. [SerializeField]
  14. private KeyManager keyManager;
  15. private Vector3 initialPosition;
  16. private float openTime;
  17. private bool isOpening;
  18. private Door door;
  19. private void Start()
  20. {
  21. door = GetComponent<Door>();
  22. }
  23. public void OnKeyAssigned(Key key, KeyManager keyManager)
  24. {
  25. keyID = key.ID;
  26. this.keyManager = keyManager;
  27. }
  28. private void OnTriggerEnter(Collider c)
  29. {
  30. if (isOpening)
  31. return;
  32. var inventory = c.GetComponent<PlayerInventory>();
  33. if (inventory == null)
  34. return;
  35. if (inventory.HasKey(keyID))
  36. {
  37. ScreenText.Log("Opened {0} door", Key.Name);
  38. inventory.RemoveKey(keyID);
  39. Open();
  40. }
  41. else
  42. ScreenText.Log("{0} key required", Key.Name);
  43. }
  44. private void Update()
  45. {
  46. if (isOpening)
  47. {
  48. openTime += Time.deltaTime;
  49. if (openTime >= OpenDuration)
  50. {
  51. openTime = OpenDuration;
  52. isOpening = false;
  53. }
  54. transform.position = Vector3.Lerp(initialPosition, initialPosition + OpenPositionOffset, openTime / OpenDuration);
  55. }
  56. }
  57. private void Open()
  58. {
  59. if (isOpening)
  60. return;
  61. isOpening = true;
  62. initialPosition = transform.position;
  63. openTime = 0;
  64. door.IsOpen = true;
  65. }
  66. }
  67. }