using UnityEngine; using System.Collections; public enum DoorState{ Closed, Closing, Opened, Opening } public delegate void DoorStateDelegate(Door sender, DoorState from, DoorState to); public class Door : MonoBehaviour { private Animator anim; private float state; public float speed = 1.0f; public float direction; private DoorState doorState; private SpriteRenderer _renderer; public event DoorStateDelegate StateChanged; protected virtual void OnStateChanged (DoorState from, DoorState to) { var handler = StateChanged; if (handler != null) handler (this, from, to); } public DoorState State{ get{return doorState;} } // Use this for initialization void Start () { anim = gameObject.GetComponent(); _renderer = gameObject.GetComponent(); _renderer.enabled = false; state = 0; } public void Open(){ if((doorState == DoorState.Opened) || (doorState == DoorState.Opening)){ return; } OnStateChanged(doorState, DoorState.Opening); direction = 1.0f; doorState = DoorState.Opening; } public void Close(){ if((doorState == DoorState.Closed) || (doorState == DoorState.Closing)){ return; } OnStateChanged(doorState, DoorState.Closing); doorState = DoorState.Closing; direction = -1.0f; } // Update is called once per frame void Update () { if(direction == 0.0f){ return; } state = Mathf.Clamp01(state + direction * speed * Time.deltaTime); _renderer.enabled = state != 0.0f; if(direction < 0.0f && state == 0.0f){ direction = 0.0f; OnStateChanged(doorState, DoorState.Closed); doorState = DoorState.Closed; } if(direction > 0.0f && state == 1.0f){ direction = 0.0f; OnStateChanged(doorState, DoorState.Opened); doorState = DoorState.Opened; } anim.SetFloat("DoorState", state); } }